automatic commit
[folded-ctf.git] / image.cc
1
2 ///////////////////////////////////////////////////////////////////////////
3 // This program is free software: you can redistribute it and/or modify  //
4 // it under the terms of the version 3 of the GNU General Public License //
5 // as published by the Free Software Foundation.                         //
6 //                                                                       //
7 // This program is distributed in the hope that it will be useful, but   //
8 // WITHOUT ANY WARRANTY; without even the implied warranty of            //
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      //
10 // General Public License for more details.                              //
11 //                                                                       //
12 // You should have received a copy of the GNU General Public License     //
13 // along with this program. If not, see <http://www.gnu.org/licenses/>.  //
14 //                                                                       //
15 // Written by Francois Fleuret, (C) IDIAP                                //
16 // Contact <francois.fleuret@idiap.ch> for comments & bug reports        //
17 ///////////////////////////////////////////////////////////////////////////
18
19 #include "image.h"
20
21 Image::Image(int width, int height) {
22   _width = width;
23   _height = height;
24   _content = new unsigned char[_width * _height];
25 }
26
27 Image::Image() {
28   _width = 0;
29   _height = 0;
30   _content = 0;
31 }
32
33 Image::~Image() {
34   delete[] _content;
35 }
36
37 void Image::crop(int xmin, int ymin, int width, int height) {
38   ASSERT(xmin >= 0 && xmin + width <= _width &&
39          ymin >= 0 && ymin + height <= _height);
40   unsigned char *new_content = new unsigned char[width * height];
41   for(int y = 0; y < height; y++) {
42     for(int x = 0; x < width; x++) {
43       new_content[x + (y * width)] = _content[x + xmin + _width * (y + ymin)];
44     }
45   }
46   delete[] _content;
47   _content = new_content;
48   _width = width;
49   _height = height;
50 }
51
52 void Image::to_rgb(RGBImage *image) {
53   int c;
54   for(int y = 0; y < _height; y++) {
55     for(int x = 0; x < _width; x++) {
56       c = value(x, y);
57       image->set_pixel(x, y, c, c, c);
58     }
59   }
60 }
61
62 void Image::read(istream *in) {
63   delete[] _content;
64   read_var(in, &_width);
65   read_var(in, &_height);
66   _content = new unsigned char[_width * _height];
67   in->read((char *) _content, sizeof(unsigned char) * _width * _height);
68 }
69
70 void Image::write(ostream *out) {
71   write_var(out, &_width);
72   write_var(out, &_height);
73   out->write((char *) _content, sizeof(unsigned char) * _width * _height);
74 }