X-Git-Url: https://eleni.mutantstargoat.com/git/?p=winnie;a=blobdiff_plain;f=src%2Fpixmap.cc;h=ada337d245a5452869c8ad463b35668c3a474f62;hp=5c9b2425ab13bf0363a0fc2f4b4ff202fdafd11a;hb=32869d8ffb64be82541f48166c5e73a6c4336135;hpb=2985bfa49497805b4760c066a6288c4b3752d145 diff --git a/src/pixmap.cc b/src/pixmap.cc index 5c9b242..ada337d 100644 --- a/src/pixmap.cc +++ b/src/pixmap.cc @@ -9,6 +9,22 @@ Pixmap::Pixmap() 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) { @@ -28,7 +44,7 @@ int Pixmap::get_height() const Rect Pixmap::get_rect() const { - Rect rect = {0, 0, width, height}; + Rect rect(0, 0, width, height); return rect; } @@ -58,7 +74,61 @@ unsigned char *Pixmap::get_image() bool Pixmap::load(const char *fname) { - return false; // TODO + 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