Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 3
0
        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();
            }
Exemplo n.º 6
0
        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;
        }
Exemplo n.º 7
0
 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;
     }
 }
Exemplo n.º 8
0
 public void AddSegment(JBIG2Segment s) {
     segs[s.segmentNumber] = s;
 }
Exemplo n.º 9
0
 public int CompareTo(JBIG2Segment s) {
     return this.segmentNumber - s.segmentNumber;
 }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
 public void AddSegment(JBIG2Segment s)
 {
     segs[s.segmentNumber] = s;
 }
Exemplo n.º 12
0
 public int CompareTo(JBIG2Segment s)
 {
     return(this.segmentNumber - s.segmentNumber);
 }
Exemplo n.º 13
0
        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;
            }
        }