void create_masksub_chunks(IFFByteStream &iff, const GURL &url) { // Check and load pixmap file if (!g().stencil) G_THROW("The use of a raw ppm image requires a stencil"); GP<ByteStream> gibs=ByteStream::create(url, "rb"); ByteStream &ibs=*gibs; GP<GPixmap> graw_pm=GPixmap::create(ibs); GPixmap &raw_pm=*graw_pm; if ((int) g().stencil->get_width() != (int) raw_pm.columns()) G_THROW("Stencil and raw image have different widths!"); if ((int) g().stencil->get_height() != (int) raw_pm.rows()) G_THROW("Stencil and raw image have different heights!"); // Encode foreground { GP<GPixmap> gfg_img=GPixmap::create(); GPixmap &fg_img=*gfg_img; GP<GBitmap> fg_mask=GBitmap::create(); processForeground(&raw_pm, g().stencil, fg_img, *fg_mask); GP<IW44Image> fg_pm = IW44Image::create_encode(fg_img, fg_mask, IW44Image::CRCBfull); IWEncoderParms parms[8]; iff.put_chunk("FG44"); parms[0].slices = 100; fg_pm->encode_chunk(iff.get_bytestream(), parms[0]); iff.close_chunk(); } // Encode backgound { GP<GPixmap> gbg_img=GPixmap::create(); GPixmap &bg_img=*gbg_img; GP<GBitmap> bg_mask=GBitmap::create(); processBackground(&raw_pm, g().stencil, bg_img, *bg_mask); GP<IW44Image> bg_pm = IW44Image::create_encode(bg_img, bg_mask, IW44Image::CRCBnormal); IWEncoderParms parms[4]; parms[0].bytes = 10000; parms[0].slices = 74; iff.put_chunk("BG44"); bg_pm->encode_chunk(iff.get_bytestream(), parms[0]); iff.close_chunk(); parms[1].slices = 84; iff.put_chunk("BG44"); bg_pm->encode_chunk(iff.get_bytestream(), parms[1]); iff.close_chunk(); parms[2].slices = 90; iff.put_chunk("BG44"); bg_pm->encode_chunk(iff.get_bytestream(), parms[2]); iff.close_chunk(); parms[3].slices = 97; iff.put_chunk("BG44"); bg_pm->encode_chunk(iff.get_bytestream(), parms[3]); iff.close_chunk(); } }
void create_fgbz_chunk(IFFByteStream &iff) { int nzones = g().colorzones.size(); int npalette = g().colorpalette->size() / 3; GP<DjVuPalette> pal = DjVuPalette::create(); g().colorpalette->seek(0); pal->decode_rgb_entries(*g().colorpalette, npalette); pal->colordata.resize(0,blit_count-1); for (int d=0; d<blit_count; d++) { JB2Blit *blit = g().stencil->get_blit(d); const JB2Shape &shape = g().stencil->get_shape(blit->shapeno); GRect brect(blit->left, blit->bottom, shape.bits->columns(), shape.bits->rows()); int index = nzones; for (int i=0; i<nzones; i++) { GRect zrect = g().colorzones[i]; if (zrect.isempty() || zrect.intersect(brect, zrect)) index = i; } if (index >= npalette) G_THROW("create_fgbz_chunk: internal error"); pal->colordata[d] = index; } iff.put_chunk("FGbz"); pal->encode(iff.get_bytestream()); iff.close_chunk(); }
static void display_djvm_dirm(ByteStream & out_str, IFFByteStream & iff, GUTF8String head, size_t, DjVmInfo& djvminfo, int) { GP<DjVmDir> dir = DjVmDir::create(); dir->decode(iff.get_bytestream()); GPList<DjVmDir::File> list = dir->get_files_list(); if (dir->is_indirect()) { out_str.format( "Document directory (indirect, %d files %d pages)", dir->get_files_num(), dir->get_pages_num()); for (GPosition p=list; p; ++p) out_str.format( "\n%s%s -> %s", (const char*)head, (const char*)list[p]->get_load_name(), (const char*)list[p]->get_save_name() ); } else { out_str.format( "Document directory (bundled, %d files %d pages)", dir->get_files_num(), dir->get_pages_num()); djvminfo.dir = dir; djvminfo.map.empty(); for (GPosition p=list; p; ++p) djvminfo.map[list[p]->offset] = list[p]; } }
void GIFFManager::load_chunk(IFFByteStream & istr, GP<GIFFChunk> chunk) { DEBUG_MSG("GIFFManager::load_chunk(): loading contents of chunk '" << chunk->get_name() << "'\n"); DEBUG_MAKE_INDENT(3); int chunk_size; GUTF8String chunk_id; while ((chunk_size=istr.get_chunk(chunk_id))) { if (istr.check_id(chunk_id)) { GP<GIFFChunk> ch=GIFFChunk::create(chunk_id); load_chunk(istr, ch); chunk->add_chunk(ch); } else { TArray<char> data(chunk_size-1); istr.get_bytestream()->readall( (char*)data, data.size()); GP<GIFFChunk> ch=GIFFChunk::create(chunk_id, data); chunk->add_chunk(ch); } istr.close_chunk(); } }
void GIFFChunk::save(IFFByteStream & istr, bool use_trick) { DEBUG_MSG("GIFFChunk::save(): saving chunk '" << get_full_name() << "'\n"); DEBUG_MAKE_INDENT(3); if (is_container()) { istr.put_chunk(get_full_name(), use_trick); if (chunks.size()) { GPosition pos; for(pos=chunks;pos;++pos) if (chunks[pos]->get_type()=="PROP") chunks[pos]->save(istr); for(pos=chunks;pos;++pos) if (chunks[pos]->get_type()!="PROP") chunks[pos]->save(istr); } else { DEBUG_MSG("but it's empty => saving empty container.\n"); } istr.close_chunk(); } else { istr.put_chunk(get_name(), use_trick); istr.get_bytestream()->writall((const char *) data, data.size()); istr.close_chunk(); } }
static void display_fgbz(ByteStream & out_str, IFFByteStream &iff, GUTF8String, size_t, DjVmInfo&, int) { GP<ByteStream> gbs = iff.get_bytestream(); int version = gbs->read8(); int size = gbs->read16(); out_str.format( "JB2 colors data, v%d, %d colors", version & 0x7f, size); }
static void display_djvu_info(ByteStream & out_str, IFFByteStream &iff, GUTF8String, size_t size, DjVmInfo&, int) { GP<DjVuInfo> ginfo=DjVuInfo::create(); DjVuInfo &info=*ginfo; info.decode(*iff.get_bytestream()); if (size >= 4) out_str.format( "DjVu %dx%d", info.width, info.height); if (size >= 5) out_str.format( ", v%d", info.version); if (size >= 8) out_str.format( ", %d dpi", info.dpi); if (size >= 9) out_str.format( ", gamma=%3.1f", info.gamma); }
static void display_iw4(ByteStream & out_str, IFFByteStream &iff, GUTF8String, size_t, DjVmInfo&, int) { GP<ByteStream> gbs = iff.get_bytestream(); unsigned char serial = gbs->read8(); unsigned char slices = gbs->read8(); out_str.format( "IW4 data #%d, %d slices", serial+1, slices); if (serial == 0) { unsigned char major = gbs->read8(); unsigned char minor = gbs->read8(); unsigned char xhi = gbs->read8(); unsigned char xlo = gbs->read8(); unsigned char yhi = gbs->read8(); unsigned char ylo = gbs->read8(); out_str.format( ", v%d.%d (%s), %dx%d", major & 0x7f, minor, (major & 0x80 ? "b&w" : "color"), (xhi<<8)+xlo, (yhi<<8)+ylo ); } }
void create_info_chunk(IFFByteStream &iff, GArray<GUTF8String> &argv) { const int argc=argv.hbound()+1; // Process info specification for (int i=2; i<argc; i++) if (!argv[i].cmp("INFO=",5)) { int narg = 0; const char *ptr = 5+(const char *)argv[i]; while (*ptr) { if (*ptr != ',') { int x = strtol((char *)ptr, (char **)&ptr, 10); switch(narg) { case 0: w = x; break; case 1: h = x; break; case 2: dpi = x; break; default: G_THROW("djvumake: incorrect 'INFO' chunk specification\n"); } } narg++; if (*ptr && *ptr++!=',') G_THROW("djvumake: comma expected in 'INFO' chunk specification\n"); } break; } if (w>0 && (w<=0 || w>=32768)) G_THROW("djvumake: incorrect width in 'INFO' chunk specification\n"); if (h>0 && (h<=0 || h>=32768)) G_THROW("djvumake: incorrect height in 'INFO' chunk specification\n"); if (dpi>0 && (dpi<25 || dpi>6000)) G_THROW("djvumake: incorrect dpi in 'INFO' chunk specification\n"); // Search first mask chunks if size is still unknown if (h<0 || w<0) { for (int i=2; i<argc; i++) if (!argv[i].cmp("Sjbz=",5)) { analyze_jb2_chunk(GURL::Filename::UTF8(5+(const char *)argv[i])); break; } else if (!argv[i].cmp("Smmr=",5)) { analyze_mmr_chunk(GURL::Filename::UTF8(5+(const char *)argv[i])); break; } } // Check that we have everything if (w<0 || h<0) G_THROW("djvumake: cannot determine image size\n"); // write info chunk GP<DjVuInfo> ginfo=DjVuInfo::create(); DjVuInfo &info=*ginfo; info.width = w; info.height = h; info.dpi = dpi; iff.put_chunk("INFO"); info.encode(*iff.get_bytestream()); iff.close_chunk(); }