GraphicComp* ImportCmd::PGM_Image (const char* filename) { GraphicComp* comp = nil; FILE* file = fopen(filename, "r"); if (file != nil) { char line[1000]; do { fgets(line, 1000, file); } while (strcmp(line, "gsave\n") != 0); fgets(line, 1000, file); // translate fgets(line, 1000, file); // scale fgets(line, 1000, file); // sizes int w, h, d; sscanf(line, "%d %d %d", &w, &h, &d); fgets(line, 1000, file); // [ ... ] fgets(line, 1000, file); // { ... } fgets(line, 1000, file); // image Raster* raster = new Raster(w, h); for (int row = h - 1; row >= 0; --row) { for (int column = 0; column < w; ++column) { int byte = gethex(file); float g = float(byte) / 0xff; raster->poke(column, row, g, g, g, 1.0); } } raster->flush(); comp = new RasterComp(new RasterRect(raster), filename); } fclose(file); return comp; }
GraphicComp* ImportCmd::TIFF_Image (const char* filename) { GraphicComp* comp = nil; Raster* raster = TIFFRaster::load(filename); if (raster != nil) { raster->ref(); raster->flush(); comp = new RasterComp(new RasterRect(raster), filename); } return comp; }
GraphicComp* ImportCmd::PPM_Image (const char* filename) { GraphicComp* comp = nil; FILE* file = fopen(filename, "r"); boolean compressed; file = CheckCompression(file, filename, compressed); if (file != nil) { char line[1000]; do { fgets(line, 1000, file); } while (strcmp(line, "gsave\n") != 0); fgets(line, 1000, file); // translate fgets(line, 1000, file); // scale fgets(line, 1000, file); // scale fgets(line, 1000, file); // sizes int w, h, d; sscanf(line, "%d %d %d", &w, &h, &d); fgets(line, 1000, file); // [ ... ] fgets(line, 1000, file); // { ... } fgets(line, 1000, file); // false 3 fgets(line, 1000, file); // colorimage Raster* raster = new Raster(w, h); for (int row = h - 1; row >= 0; --row) { for (int column = 0; column < w; ++column) { int red = gethex(file); int green = gethex(file); int blue = gethex(file); raster->poke( column, row, float(red)/0xff, float(green)/0xff, float(blue)/0xff, 1.0 ); } } raster->flush(); comp = new RasterComp(new RasterRect(raster), filename); } if (compressed) { pclose(file); } else { fclose(file); } return comp; }
Raster::Raster(const Raster& raster) { RasterRep* r = new RasterRep; rep_ = r; raster.flush(); RasterRep& rr = *(raster.rep()); r->display_ = rr.display_; r->modified_ = true; r->width_ = rr.width_; r->height_ = rr.height_; r->left_ = rr.left_; r->bottom_ = rr.bottom_; r->right_ = rr.right_; r->top_ = rr.top_; r->pwidth_ = rr.pwidth_; r->pheight_ = rr.pheight_; r->shared_memory_ = false; DisplayRep* dr = r->display_->rep(); XDisplay* dpy = dr->display_; r->pixmap_ = XCreatePixmap( dpy, dr->root_, r->pwidth_, r->pheight_, dr->default_visual_->depth() ); r->gc_ = XCreateGC(dpy, r->pixmap_, 0, nil); XCopyArea( dpy, rr.pixmap_, r->pixmap_, r->gc_, 0, 0, r->pwidth_, r->pheight_, 0, 0 ); #ifdef XSHM init_shared_memory(); #endif if (!r->shared_memory_) { r->image_ = XGetImage( dpy, r->pixmap_, 0, 0, r->pwidth_, r->pheight_, AllPlanes, ZPixmap ); } }