/*
winnie - an experimental window system
Copyright (C) 2013 Eleni Maria Stea
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Author: Eleni Maria Stea
*/
#include
#include
#include
#include "pixmap.h"
Pixmap::Pixmap()
{
width = height = 0;
pixels = 0;
}
Pixmap::Pixmap(const Pixmap &pixmap)
{
width = height = 0;
pixels = 0;
set_image(pixmap.width, pixmap.height, pixmap.pixels);
}
Pixmap &Pixmap::operator=(const Pixmap &pixmap)
{
if(this != &pixmap) {
set_image(pixmap.width, pixmap.height, pixmap.pixels);
}
return *this;
}
Pixmap::~Pixmap()
{
if(pixels) {
delete [] pixels;
}
}
int Pixmap::get_width() const
{
return width;
}
int Pixmap::get_height() const
{
return height;
}
Rect Pixmap::get_rect() const
{
Rect rect(0, 0, width, height);
return rect;
}
bool Pixmap::set_image(int x, int y, unsigned char *pix)
{
delete [] pixels;
pixels = new unsigned char[x * y * 4];
width = x;
height = y;
if(pix) {
memcpy(pixels, pix, x * y * 4);
}
return true;
}
const unsigned char *Pixmap::get_image() const
{
return pixels;
}
unsigned char *Pixmap::get_image()
{
return pixels;
}
bool Pixmap::load(const char *fname)
{
FILE *fp;
int hdrline = 0;
if(!(fp = fopen(fname, "rb"))) {
fprintf(stderr, "failed to open pixmap: %s: %s\n", fname, strerror(errno));
return false;
}
/* read ppm header */
while(hdrline < 3) {
char buf[64];
if(!fgets(buf, sizeof buf, fp))
goto err;
/* skip comments */
if(buf[0] == '#')
continue;
switch(hdrline++) {
case 0:
/* first header line should be P6 */
if(strcmp(buf, "P6\n") != 0)
goto err;
break;
case 1:
/* second header line contains the pixmap dimensions */
if(sscanf(buf, "%d %d", &width, &height) != 2)
goto err;
break;
}
}
set_image(width, height, 0);
for(int i=0; i