void CPDF_StreamContentParser::EndImageDict() { if (m_StringBuf.GetSize() != m_LastImageDict.GetSize() || FXSYS_memcmp32(m_StringBuf.GetBuffer(), m_LastImageDict.GetBuffer(), m_StringBuf.GetSize())) { m_WordState = 0; StartDict(); InputData(m_StringBuf.GetBuffer(), m_StringBuf.GetSize()); Finish(); m_bSameLastDict = FALSE; if (m_pLastImageDict && m_bReleaseLastDict) { m_pLastImageDict->Release(); m_pLastImageDict = NULL; } if (!m_ObjectSize) { m_InlineImageState = 0; return; } m_pLastImageDict = (CPDF_Dictionary*)m_pObjectStack[--m_ObjectSize]; m_bReleaseLastDict = !m_pObjectState[m_ObjectSize]; m_pObjectState[m_ObjectSize] = FALSE; _PDF_ReplaceAbbr(m_pLastImageDict); m_LastImageDict.TakeOver(m_StringBuf); if (m_pLastImageDict->KeyExist(FX_BSTRC("ColorSpace"))) { CPDF_Object* pCSObj = m_pLastImageDict->GetElementValue(FX_BSTRC("ColorSpace")); if (pCSObj->GetType() == PDFOBJ_NAME) { CFX_ByteString name = pCSObj->GetString(); if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) { pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name); if (pCSObj) { if (!pCSObj->GetObjNum()) { pCSObj = pCSObj->Clone(); } m_pLastImageDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument); } } } } } else { m_bSameLastDict = TRUE; } m_ImageSrcBuf.Clear(); if (m_pLastCloneImageDict) { m_pLastCloneImageDict->Release(); } m_pLastCloneImageDict = (CPDF_Dictionary*)m_pLastImageDict->Clone(); if (m_pLastCloneImageDict->KeyExist(FX_BSTRC("Filter"))) { m_WordState = 10; m_InlineImageState = 0; } else { int width = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Width")); int height = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Height")); int OrigSize = 0; CPDF_Object* pCSObj = m_pLastCloneImageDict->GetElementValue(FX_BSTRC("ColorSpace")); if (pCSObj != NULL) { int bpc = m_pLastCloneImageDict->GetInteger(FX_BSTRC("BitsPerComponent")); int nComponents = 1; CPDF_ColorSpace* pCS = m_pDocument->LoadColorSpace(pCSObj); if (pCS == NULL) { nComponents = 3; } else { nComponents = pCS->CountComponents(); m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj); } int pitch = (width * bpc * nComponents + 7) / 8; OrigSize = pitch * height; } else { OrigSize = ((width + 7) / 8) * height; } m_ImageSrcBuf.AppendBlock(NULL, OrigSize); m_WordState = 11; m_InlineImageState = 0; } }
void CPDF_StreamContentParser::Handle_BeginImage() { FX_FILESIZE savePos = m_pSyntax->GetPos(); CPDF_Dictionary* pDict = CPDF_Dictionary::Create(); while (1) { CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); if (type == CPDF_StreamParser::Keyword) { CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize()); if (bsKeyword != FX_BSTRC("ID")) { m_pSyntax->SetPos(savePos); pDict->Release(); return; } } if (type != CPDF_StreamParser::Name) { break; } CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, m_pSyntax->GetWordSize() - 1); CPDF_Object* pObj = m_pSyntax->ReadNextObject(); if (!key.IsEmpty()) { pDict->SetAt(key, pObj, m_pDocument); } else if (pObj) { pObj->Release(); } } _PDF_ReplaceAbbr(pDict); CPDF_Object* pCSObj = NULL; if (pDict->KeyExist(FX_BSTRC("ColorSpace"))) { pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace")); if (pCSObj->GetType() == PDFOBJ_NAME) { CFX_ByteString name = pCSObj->GetString(); if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) { pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name); if (pCSObj && !pCSObj->GetObjNum()) { pCSObj = pCSObj->Clone(); pDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument); } } } } CPDF_Stream* pStream = m_pSyntax->ReadInlineStream(m_pDocument, pDict, pCSObj, m_Options.m_bDecodeInlineImage); while (1) { CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); if (type == CPDF_StreamParser::EndOfData) { break; } if (type != CPDF_StreamParser::Keyword) { continue; } if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' && m_pSyntax->GetWordBuf()[1] == 'I') { break; } } if (m_Options.m_bTextOnly) { if (pStream) { pStream->Release(); } else { pDict->Release(); } return; } pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image")); CPDF_ImageObject *pImgObj = AddImage(pStream, NULL, TRUE); if (!pImgObj) { if (pStream) { pStream->Release(); } else { pDict->Release(); } } }