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_chunks(ByteStream & out_str, IFFByteStream &iff, const GUTF8String &head, DjVmInfo djvminfo) { size_t size; GUTF8String id, fullid; GUTF8String head2 = head + " "; GPMap<int,DjVmDir::File> djvmmap; int rawoffset; GMap<GUTF8String, int> counters; while ((size = iff.get_chunk(id, &rawoffset))) { if (!counters.contains(id)) counters[id]=0; else counters[id]++; GUTF8String msg; msg.format("%s%s [%d] ", (const char *)head, (const char *)id, size); out_str.format( "%s", (const char *)msg); // Display DJVM is when adequate if (djvminfo.dir) { GP<DjVmDir::File> rec = djvminfo.map[rawoffset]; if (rec) out_str.format( "{%s}", (const char*) rec->get_load_name()); } // Test chunk type iff.full_id(fullid); for (int i=0; disproutines[i].id; i++) if (fullid == disproutines[i].id || id == disproutines[i].id) { int n = msg.length(); while (n++ < 14+(int) head.length()) putchar(out_str, ' '); if (!iff.composite()) out_str.format( " "); (*disproutines[i].subr)(out_str, iff, head2, size, djvminfo, counters[id]); break; } // Default display of composite chunk out_str.format( "\n"); if (iff.composite()) display_chunks(out_str, iff, head2, djvminfo); // Terminate iff.close_chunk(); } }
static void display_incl(ByteStream & out_str, IFFByteStream & iff, GUTF8String, size_t, DjVmInfo&, int) { GUTF8String name; char ch; while(iff.read(&ch, 1) && ch!='\n') name += ch; out_str.format( "Indirection chunk --> {%s}", (const char *) name); }
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_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 ); } }
static void display_smmr(ByteStream & out_str, IFFByteStream &iff, GUTF8String, size_t, DjVmInfo&, int) { out_str.format( "G4/MMR stencil data"); }
static void display_sjbz(ByteStream & out_str, IFFByteStream &iff, GUTF8String, size_t, DjVmInfo&, int) { out_str.format( "JB2 bilevel data"); }
static void display_djbz(ByteStream & out_str, IFFByteStream &iff, GUTF8String, size_t, DjVmInfo&, int) { out_str.format( "JB2 shared dictionary"); }