X-Git-Url: http://git.mutantstargoat.com?p=winnie;a=blobdiff_plain;f=libwinnie%2Fsrc%2Fpixmap.cc;fp=libwinnie%2Fsrc%2Fpixmap.cc;h=8e50fa3caba353c843abbb9b4ce616a35f63edef;hp=0000000000000000000000000000000000000000;hb=7b5d2df884abb7084d71f17cc29a618c0b6f47ef;hpb=b4c8d68e0357683cec82fb8a9c5a4447155b3192 diff --git a/libwinnie/src/pixmap.cc b/libwinnie/src/pixmap.cc new file mode 100644 index 0000000..8e50fa3 --- /dev/null +++ b/libwinnie/src/pixmap.cc @@ -0,0 +1,177 @@ +/* +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