/* This function scans the input TIFF file for pages. It attempts to determine which IFD's of the TIFF file contain image document pages. For each, it gathers some information that has to do with the output of the PDF document as a whole. */ private void read_tiff_init(Tiff input) { short directorycount = input.NumberOfDirectories(); m_tiff_pages = new T2P_PAGE [directorycount]; for (int p = 0; p < directorycount; p++) m_tiff_pages[p] = new T2P_PAGE(); FieldValue[] result = null; for (short i = 0; i < directorycount; i++) { int subfiletype = 0; if (!input.SetDirectory(i)) { Tiff.Error(Tiff2PdfConstants.TIFF2PDF_MODULE, "Can't set directory {0} of input file {1}", i, input.FileName()); return; } result = input.GetField(TiffTag.PAGENUMBER); if (result != null) { short pagen = result[0].ToShort(); short paged = result[1].ToShort(); if ((pagen > paged) && (paged != 0)) m_tiff_pages[m_tiff_pagecount].page_number = paged; else m_tiff_pages[m_tiff_pagecount].page_number = pagen; } else { result = input.GetField(TiffTag.SUBFILETYPE); if (result != null) { subfiletype = result[0].ToInt(); if ((((FileType)subfiletype & FileType.PAGE) == 0) && (subfiletype != 0)) continue; } else { result = input.GetField(TiffTag.OSUBFILETYPE); if (result != null) { subfiletype = result[0].ToInt(); if (((OFileType)subfiletype != OFileType.IMAGE) && ((OFileType)subfiletype != OFileType.PAGE) && (subfiletype != 0)) continue; } } m_tiff_pages[m_tiff_pagecount].page_number = m_tiff_pagecount; } m_tiff_pages[m_tiff_pagecount].page_directory = i; if (input.IsTiled()) m_tiff_pages[m_tiff_pagecount].page_tilecount = input.NumberOfTiles(); m_tiff_pagecount++; } IComparer myComparer = new cmp_t2p_page(); Array.Sort(m_tiff_pages, myComparer); for (short i = 0; i < m_tiff_pagecount; i++) { m_pdf_xrefcount += 5; input.SetDirectory(m_tiff_pages[i].page_directory); result = input.GetField(TiffTag.PHOTOMETRIC); if ((result != null && ((Photometric)result[0].ToInt() == Photometric.PALETTE)) || input.GetField(TiffTag.INDEXED) != null) { m_tiff_pages[i].page_extra++; m_pdf_xrefcount++; } result = input.GetField(TiffTag.COMPRESSION); if (result != null) { Compression xuint16 = (Compression)result[0].ToInt(); if ((xuint16 == Compression.DEFLATE || xuint16 == Compression.ADOBE_DEFLATE) && ((m_tiff_pages[i].page_tilecount != 0) || input.NumberOfStrips() == 1) && !m_pdf_nopassthrough) { if (m_pdf_minorversion < 2) m_pdf_minorversion = 2; } } result = input.GetField(TiffTag.TRANSFERFUNCTION); if (result != null) { m_tiff_transferfunction[0] = result[0].GetBytes(); m_tiff_transferfunction[1] = result[1].GetBytes(); m_tiff_transferfunction[2] = result[2].GetBytes(); if (m_tiff_transferfunction[1] != m_tiff_transferfunction[0]) { m_tiff_transferfunctioncount = 3; m_tiff_pages[i].page_extra += 4; m_pdf_xrefcount += 4; } else { m_tiff_transferfunctioncount = 1; m_tiff_pages[i].page_extra += 2; m_pdf_xrefcount += 2; } if (m_pdf_minorversion < 2) m_pdf_minorversion = 2; } else { m_tiff_transferfunctioncount = 0; } result = input.GetField(TiffTag.ICCPROFILE); if (result != null) { m_tiff_iccprofilelength = result[0].ToInt(); m_tiff_iccprofile = result[1].ToByteArray(); m_tiff_pages[i].page_extra++; m_pdf_xrefcount++; if (m_pdf_minorversion < 3) m_pdf_minorversion = 3; } //m_tiff_tiles[i].tiles_tilecount = m_tiff_pages[i].page_tilecount; result = input.GetField(TiffTag.PLANARCONFIG); if (result != null && ((PlanarConfig)result[0].ToShort() == PlanarConfig.SEPARATE)) { result = input.GetField(TiffTag.SAMPLESPERPIXEL); int xuint16 = result[0].ToInt(); m_tiff_pages[i].page_tilecount /= xuint16; } if (m_tiff_pages[i].page_tilecount > 0) { m_pdf_xrefcount += (m_tiff_pages[i].page_tilecount - 1) * 2; result = input.GetField(TiffTag.TILEWIDTH); m_tiff_pages[i].tiles_tilewidth = result[0].ToInt(); input.GetField(TiffTag.TILELENGTH); m_tiff_pages[i].tiles_tilelength = result[0].ToInt(); m_tiff_pages[i].tiles_tiles = new T2P_TILE[m_tiff_pages[i].page_tilecount]; for (int idx = 0; idx < m_tiff_pages[i].page_tilecount; idx++) m_tiff_pages[i].tiles_tiles[idx] = new T2P_TILE(); } } }