void ReadSegment(JBIG2Segment s) { int ptr = ra.FilePointer; if (s.dataLength == 0xffffffffL) { // TODO figure this bit out, 7.2.7 return; } byte[] data = new byte[(int)s.dataLength]; ra.Read(data); s.data = data; if (s.type == PAGE_INFORMATION) { int last = ra.FilePointer; ra.Seek(ptr); int page_bitmap_width = ra.ReadInt(); int page_bitmap_height = ra.ReadInt(); ra.Seek(last); JBIG2Page p = pages[s.page]; if (p == null) { throw new InvalidOperationException(MessageLocalization.GetComposedMessage("referring.to.widht.height.of.page.we.havent.seen.yet.1", s.page)); } p.pageBitmapWidth = page_bitmap_width; p.pageBitmapHeight = page_bitmap_height; } }
void ReadSegment(JBIG2Segment s) { int ptr = ra.FilePointer; if (s.dataLength == 0xffffffffL) { // TODO figure this bit out, 7.2.7 return; } byte[] data = new byte[(int)s.dataLength]; ra.Read(data); s.data = data; if (s.type == PAGE_INFORMATION) { int last = ra.FilePointer; ra.Seek(ptr); int page_bitmap_width = ra.ReadInt(); int page_bitmap_height = ra.ReadInt(); ra.Seek(last); JBIG2Page p = (JBIG2Page)pages[s.page]; if (p == null) { throw new InvalidOperationException("referring to widht/height of page we havent seen yet? " + s.page); } p.pageBitmapWidth = page_bitmap_width; p.pageBitmapHeight = page_bitmap_height; } }
public void Read() { if (this.read) { throw new InvalidOperationException(MessageLocalization.GetComposedMessage("already.attempted.a.read.on.this.jbig2.file")); } this.read = true; ReadFileHeader(); // Annex D if (this.sequential) { // D.1 do { JBIG2Segment tmp = ReadHeader(); ReadSegment(tmp); segments[tmp.segmentNumber] = tmp; } while (this.ra.FilePointer < this.ra.Length); } else { // D.2 JBIG2Segment tmp; do { tmp = ReadHeader(); segments[tmp.segmentNumber] = tmp; } while (tmp.type != END_OF_FILE); foreach (int ss in segments.Keys) { ReadSegment(segments[ss]); } } }
public void Read() { if (this.read) { throw new InvalidOperationException("already attempted a Read() on this Jbig2 File"); } this.read = true; ReadFileHeader(); // Annex D if (this.sequential) { // D.1 do { JBIG2Segment tmp = ReadHeader(); ReadSegment(tmp); segments[tmp.segmentNumber] = tmp; } while (this.ra.FilePointer < this.ra.Length); } else { // D.2 JBIG2Segment tmp; do { tmp = ReadHeader(); segments[tmp.segmentNumber] = tmp; } while (tmp.type != END_OF_FILE); foreach (int ss in segments.Keys) { ReadSegment((JBIG2Segment)segments[ss]); } } }
/** * return as a single byte array the header-data for each segment in segment number * order, EMBEDDED organization, but i am putting the needed segments in SEQUENTIAL organization. * if for_embedding, skip the segment types that are known to be not for acrobat. * @param for_embedding * @return a byte array * @throws IOException */ public byte[] GetData(bool for_embedding) { MemoryStream os = new MemoryStream(); foreach (int sn in segs.Keys) { JBIG2Segment s = (JBIG2Segment)segs[sn]; // pdf reference 1.4, section 3.3.6 JBIG2Decode Filter // D.3 Embedded organisation if ( for_embedding && ( s.type == END_OF_FILE || s.type == END_OF_PAGE ) ) { continue; } if ( for_embedding ) { // change the page association to page 1 byte[] headerData_emb = CopyByteArray(s.headerData); if ( s.page_association_size ) { headerData_emb[s.page_association_offset] = 0x0; headerData_emb[s.page_association_offset+1] = 0x0; headerData_emb[s.page_association_offset+2] = 0x0; headerData_emb[s.page_association_offset+3] = 0x1; } else { headerData_emb[s.page_association_offset] = 0x1; } os.Write(headerData_emb, 0, headerData_emb.Length); } else { os.Write(s.headerData, 0, s.headerData.Length); } os.Write(s.data, 0, s.data.Length); } os.Close(); return os.ToArray(); }
JBIG2Segment ReadHeader() { int ptr = ra.FilePointer; // 7.2.1 int segment_number = ra.ReadInt(); JBIG2Segment s = new JBIG2Segment(segment_number); // 7.2.3 int segment_header_flags = ra.Read(); bool deferred_non_retain = (( segment_header_flags & 0x80 ) == 0x80); s.deferredNonRetain = deferred_non_retain; bool page_association_size = (( segment_header_flags & 0x40 ) == 0x40); int segment_type = ( segment_header_flags & 0x3f ); s.type = segment_type; //7.2.4 int referred_to_byte0 = ra.Read(); int count_of_referred_to_segments = (referred_to_byte0 & 0xE0) >> 5; int[] referred_to_segment_numbers = null; bool[] segment_retention_flags = null; if ( count_of_referred_to_segments == 7 ) { // at least five bytes ra.Seek(ra.FilePointer - 1); count_of_referred_to_segments = ( ra.ReadInt() & 0x1fffffff ); segment_retention_flags = new bool[count_of_referred_to_segments+1]; int i = 0; int referred_to_current_byte = 0; do { int j = i % 8; if ( j == 0) { referred_to_current_byte = ra.Read(); } segment_retention_flags[i] = (((( 0x1 << j ) & referred_to_current_byte) >> j) == 0x1); i++; } while ( i <= count_of_referred_to_segments ); } else if ( count_of_referred_to_segments <= 4 ) { // only one byte segment_retention_flags = new bool[count_of_referred_to_segments+1]; referred_to_byte0 &= 0x1f; for ( int i = 0; i <= count_of_referred_to_segments; i++ ) { segment_retention_flags[i] = (((( 0x1 << i ) & referred_to_byte0) >> i) == 0x1); } } else if ( count_of_referred_to_segments == 5 || count_of_referred_to_segments == 6 ) { throw new InvalidOperationException(MessageLocalization.GetComposedMessage("count.of.referred.to.segments.had.bad.value.in.header.for.segment.1.starting.at.2", segment_number, ptr)); } s.segmentRetentionFlags = segment_retention_flags; s.countOfReferredToSegments = count_of_referred_to_segments; // 7.2.5 referred_to_segment_numbers = new int[count_of_referred_to_segments+1]; for ( int i = 1; i <= count_of_referred_to_segments; i++ ) { if ( segment_number <= 256 ) { referred_to_segment_numbers[i] = ra.Read(); } else if ( segment_number <= 65536 ) { referred_to_segment_numbers[i] = ra.ReadUnsignedShort(); } else { referred_to_segment_numbers[i] = (int)ra.ReadUnsignedInt(); // TODO wtf ack } } s.referredToSegmentNumbers = referred_to_segment_numbers; // 7.2.6 int segment_page_association; int page_association_offset = ra.FilePointer - ptr; if ( page_association_size ) { segment_page_association = ra.ReadInt(); } else { segment_page_association = ra.Read(); } if ( segment_page_association < 0 ) { throw new InvalidOperationException(MessageLocalization.GetComposedMessage("page.1.invalid.for.segment.2.starting.at.3", segment_page_association, segment_number, ptr)); } s.page = segment_page_association; // so we can change the page association at embedding time. s.page_association_size = page_association_size; s.page_association_offset = page_association_offset; if ( segment_page_association > 0 && ! pages.ContainsKey(segment_page_association) ) { pages[segment_page_association] = new JBIG2Page(segment_page_association, this); } if ( segment_page_association > 0 ) { ((JBIG2Page)pages[segment_page_association]).AddSegment(s); } else { globals[s] = null; } // 7.2.7 long segment_data_length = ra.ReadUnsignedInt(); // TODO the 0xffffffff value that might be here, and how to understand those afflicted segments s.dataLength = segment_data_length; int end_ptr = ra.FilePointer; ra.Seek(ptr); byte[] header_data = new byte[end_ptr - ptr]; ra.Read(header_data); s.headerData = header_data; return s; }
void ReadSegment(JBIG2Segment s) { int ptr = ra.FilePointer; if ( s.dataLength == 0xffffffffL ) { // TODO figure this bit out, 7.2.7 return; } byte[] data = new byte[(int)s.dataLength]; ra.Read(data); s.data = data; if ( s.type == PAGE_INFORMATION ) { int last = ra.FilePointer; ra.Seek(ptr); int page_bitmap_width = ra.ReadInt(); int page_bitmap_height = ra.ReadInt(); ra.Seek(last); JBIG2Page p = (JBIG2Page)pages[s.page]; if ( p == null ) { throw new InvalidOperationException(MessageLocalization.GetComposedMessage("referring.to.widht.height.of.page.we.havent.seen.yet.1", s.page)); } p.pageBitmapWidth = page_bitmap_width; p.pageBitmapHeight = page_bitmap_height; } }
public void AddSegment(JBIG2Segment s) { segs[s.segmentNumber] = s; }
public int CompareTo(JBIG2Segment s) { return this.segmentNumber - s.segmentNumber; }
JBIG2Segment ReadHeader() { int ptr = ra.FilePointer; // 7.2.1 int segment_number = ra.ReadInt(); JBIG2Segment s = new JBIG2Segment(segment_number); // 7.2.3 int segment_header_flags = ra.Read(); bool deferred_non_retain = ((segment_header_flags & 0x80) == 0x80); s.deferredNonRetain = deferred_non_retain; bool page_association_size = ((segment_header_flags & 0x40) == 0x40); int segment_type = (segment_header_flags & 0x3f); s.type = segment_type; //7.2.4 int referred_to_byte0 = ra.Read(); int count_of_referred_to_segments = (referred_to_byte0 & 0xE0) >> 5; int[] referred_to_segment_numbers = null; bool[] segment_retention_flags = null; if (count_of_referred_to_segments == 7) { // at least five bytes ra.Seek(ra.FilePointer - 1); count_of_referred_to_segments = (ra.ReadInt() & 0x1fffffff); segment_retention_flags = new bool[count_of_referred_to_segments + 1]; int i = 0; int referred_to_current_byte = 0; do { int j = i % 8; if (j == 0) { referred_to_current_byte = ra.Read(); } segment_retention_flags[i] = ((((0x1 << j) & referred_to_current_byte) >> j) == 0x1); i++; } while (i <= count_of_referred_to_segments); } else if (count_of_referred_to_segments <= 4) { // only one byte segment_retention_flags = new bool[count_of_referred_to_segments + 1]; referred_to_byte0 &= 0x1f; for (int i = 0; i <= count_of_referred_to_segments; i++) { segment_retention_flags[i] = ((((0x1 << i) & referred_to_byte0) >> i) == 0x1); } } else if (count_of_referred_to_segments == 5 || count_of_referred_to_segments == 6) { throw new InvalidOperationException(MessageLocalization.GetComposedMessage("count.of.referred.to.segments.had.bad.value.in.header.for.segment.1.starting.at.2", segment_number, ptr)); } s.segmentRetentionFlags = segment_retention_flags; s.countOfReferredToSegments = count_of_referred_to_segments; // 7.2.5 referred_to_segment_numbers = new int[count_of_referred_to_segments + 1]; for (int i = 1; i <= count_of_referred_to_segments; i++) { if (segment_number <= 256) { referred_to_segment_numbers[i] = ra.Read(); } else if (segment_number <= 65536) { referred_to_segment_numbers[i] = ra.ReadUnsignedShort(); } else { referred_to_segment_numbers[i] = (int)ra.ReadUnsignedInt(); // TODO wtf ack } } s.referredToSegmentNumbers = referred_to_segment_numbers; // 7.2.6 int segment_page_association; int page_association_offset = ra.FilePointer - ptr; if (page_association_size) { segment_page_association = ra.ReadInt(); } else { segment_page_association = ra.Read(); } if (segment_page_association < 0) { throw new InvalidOperationException(MessageLocalization.GetComposedMessage("page.1.invalid.for.segment.2.starting.at.3", segment_page_association, segment_number, ptr)); } s.page = segment_page_association; // so we can change the page association at embedding time. s.page_association_size = page_association_size; s.page_association_offset = page_association_offset; if (segment_page_association > 0 && !pages.ContainsKey(segment_page_association)) { pages[segment_page_association] = new JBIG2Page(segment_page_association, this); } if (segment_page_association > 0) { pages[segment_page_association].AddSegment(s); } else { globals[s] = null; } // 7.2.7 long segment_data_length = ra.ReadUnsignedInt(); // TODO the 0xffffffff value that might be here, and how to understand those afflicted segments s.dataLength = segment_data_length; int end_ptr = ra.FilePointer; ra.Seek(ptr); byte[] header_data = new byte[end_ptr - ptr]; ra.Read(header_data); s.headerData = header_data; return(s); }
public void AddSegment(JBIG2Segment s) { segs[s.segmentNumber] = s; }
public int CompareTo(JBIG2Segment s) { return(this.segmentNumber - s.segmentNumber); }
void ReadSegment(JBIG2Segment s) { int ptr = ra.FilePointer; if ( s.dataLength == 0xffffffffL ) { // TODO figure this bit out, 7.2.7 return; } byte[] data = new byte[(int)s.dataLength]; ra.Read(data); s.data = data; if ( s.type == PAGE_INFORMATION ) { int last = ra.FilePointer; ra.Seek(ptr); int page_bitmap_width = ra.ReadInt(); int page_bitmap_height = ra.ReadInt(); ra.Seek(last); JBIG2Page p = (JBIG2Page)pages[s.page]; if ( p == null ) { throw new InvalidOperationException("referring to widht/height of page we havent seen yet? " + s.page); } p.pageBitmapWidth = page_bitmap_width; p.pageBitmapHeight = page_bitmap_height; } }