TEST(fxcrt, ByteStringCGetID) { CFX_ByteStringC null_string; EXPECT_EQ(0u, null_string.GetID()); EXPECT_EQ(0u, null_string.GetID(1)); EXPECT_EQ(0u, null_string.GetID(-1)); EXPECT_EQ(0u, null_string.GetID(-1000000)); CFX_ByteStringC empty_string(""); EXPECT_EQ(0u, empty_string.GetID()); EXPECT_EQ(0u, empty_string.GetID(1)); EXPECT_EQ(0u, empty_string.GetID(-1)); EXPECT_EQ(0u, empty_string.GetID(-1000000)); CFX_ByteStringC short_string("ab"); EXPECT_EQ(FXBSTR_ID('a', 'b', 0, 0), short_string.GetID()); EXPECT_EQ(FXBSTR_ID('b', 0, 0, 0), short_string.GetID(1)); EXPECT_EQ(0u, short_string.GetID(2)); EXPECT_EQ(0u, short_string.GetID(-1)); EXPECT_EQ(0u, short_string.GetID(-1000000)); CFX_ByteStringC longer_string("abcdef"); EXPECT_EQ(FXBSTR_ID('a', 'b', 'c', 'd'), longer_string.GetID()); EXPECT_EQ(FXBSTR_ID('b', 'c', 'd', 'e'), longer_string.GetID(1)); EXPECT_EQ(FXBSTR_ID('c', 'd', 'e', 'f'), longer_string.GetID(2)); EXPECT_EQ(FXBSTR_ID('d', 'e', 'f', 0), longer_string.GetID(3)); EXPECT_EQ(FXBSTR_ID('e', 'f', 0 , 0), longer_string.GetID(4)); EXPECT_EQ(FXBSTR_ID('f', 0 , 0, 0), longer_string.GetID(5)); EXPECT_EQ(0u, longer_string.GetID(6)); EXPECT_EQ(0u, longer_string.GetID(-1)); EXPECT_EQ(0u, longer_string.GetID(-1000000)); }
CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj) { if (pObj == NULL) { return NULL; } if (pObj->GetType() == PDFOBJ_NAME) { return _CSFromName(pObj->GetString()); } if (pObj->GetType() == PDFOBJ_STREAM) { CPDF_Dictionary *pDict = ((CPDF_Stream *)pObj)->GetDict(); if (!pDict) { return NULL; } CPDF_ColorSpace *pRet = NULL; FX_POSITION pos = pDict->GetStartPos(); while (pos) { CFX_ByteString bsKey; CPDF_Object *pValue = pDict->GetNextElement(pos, bsKey); if (pValue && pValue->GetType() == PDFOBJ_NAME) { pRet = _CSFromName(pValue->GetString()); } if (pRet) { return pRet; } } return NULL; } if (pObj->GetType() != PDFOBJ_ARRAY) { return NULL; } CPDF_Array* pArray = (CPDF_Array*)pObj; if (pArray->GetCount() == 0) { return NULL; } CPDF_Object *pFamilyObj = pArray->GetElementValue(0); if (!pFamilyObj) { return NULL; } CFX_ByteString familyname = pFamilyObj->GetString(); if (pArray->GetCount() == 1) { return _CSFromName(familyname); } CPDF_ColorSpace* pCS = NULL; FX_DWORD id = familyname.GetID(); if (id == FXBSTR_ID('C', 'a', 'l', 'G')) { pCS = new CPDF_CalGray(pDoc); } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) { pCS = new CPDF_CalRGB(pDoc); } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) { pCS = new CPDF_LabCS(pDoc); } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) { pCS = new CPDF_ICCBasedCS(pDoc); } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) { pCS = new CPDF_IndexedCS(pDoc); } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) { pCS = new CPDF_SeparationCS(pDoc); } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) { pCS = new CPDF_DeviceNCS(pDoc); } else if (id == FXBSTR_ID('P', 'a', 't', 't')) { pCS = new CPDF_PatternCS(pDoc); } else { return NULL; } pCS->m_pArray = pArray; if (!pCS->v_Load(pDoc, pArray)) { pCS->ReleaseCS(); return NULL; } return pCS; }
CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj) { if (!pObj) return nullptr; if (pObj->IsName()) return _CSFromName(pObj->GetString()); if (CPDF_Stream* pStream = pObj->AsStream()) { CPDF_Dictionary* pDict = pStream->GetDict(); if (!pDict) return nullptr; for (const auto& it : *pDict) { CPDF_ColorSpace* pRet = nullptr; CPDF_Object* pValue = it.second; if (ToName(pValue)) pRet = _CSFromName(pValue->GetString()); if (pRet) return pRet; } return nullptr; } CPDF_Array* pArray = pObj->AsArray(); if (!pArray || pArray->GetCount() == 0) return nullptr; CPDF_Object* pFamilyObj = pArray->GetElementValue(0); if (!pFamilyObj) return nullptr; CFX_ByteString familyname = pFamilyObj->GetString(); if (pArray->GetCount() == 1) return _CSFromName(familyname); CPDF_ColorSpace* pCS = NULL; FX_DWORD id = familyname.GetID(); if (id == FXBSTR_ID('C', 'a', 'l', 'G')) { pCS = new CPDF_CalGray(pDoc); } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) { pCS = new CPDF_CalRGB(pDoc); } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) { pCS = new CPDF_LabCS(pDoc); } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) { pCS = new CPDF_ICCBasedCS(pDoc); } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) { pCS = new CPDF_IndexedCS(pDoc); } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) { pCS = new CPDF_SeparationCS(pDoc); } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) { pCS = new CPDF_DeviceNCS(pDoc); } else if (id == FXBSTR_ID('P', 'a', 't', 't')) { pCS = new CPDF_PatternCS(pDoc); } else { return NULL; } pCS->m_pArray = pArray; if (!pCS->v_Load(pDoc, pArray)) { pCS->ReleaseCS(); return NULL; } return pCS; }
pObj->m_GeneralState = m_pCurStates->m_GeneralState; pObj->m_ClipPath = m_pCurStates->m_ClipPath; pObj->m_ContentMark = m_CurContentMark; if (bColor) { pObj->m_ColorState = m_pCurStates->m_ColorState; } if (bGraph) { pObj->m_GraphState = m_pCurStates->m_GraphState; } if (bText) { pObj->m_TextState = m_pCurStates->m_TextState; } } const CPDF_StreamContentParser::OpCode CPDF_StreamContentParser::g_OpCodes[] = { {FXBSTR_ID('"', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText_Space}, {FXBSTR_ID('\'', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText}, {FXBSTR_ID('B', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillStrokePath}, {FXBSTR_ID('B', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillStrokePath}, {FXBSTR_ID('B', 'D', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary}, {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage}, {FXBSTR_ID('B', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent}, {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText}, {FXBSTR_ID('B', 'X', 0, 0), &CPDF_StreamContentParser::Handle_BeginSectionUndefined}, {FXBSTR_ID('C', 'S', 0, 0),
void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser) { for (const auto& it : *pGS) { const CFX_ByteString& key_str = it.first; CPDF_Object* pElement = it.second.get(); CPDF_Object* pObject = pElement ? pElement->GetDirect() : nullptr; if (!pObject) continue; uint32_t key = key_str.GetID(); switch (key) { case FXBSTR_ID('L', 'W', 0, 0): m_GraphState.SetLineWidth(pObject->GetNumber()); break; case FXBSTR_ID('L', 'C', 0, 0): m_GraphState.SetLineCap( static_cast<CFX_GraphStateData::LineCap>(pObject->GetInteger())); break; case FXBSTR_ID('L', 'J', 0, 0): m_GraphState.SetLineJoin( static_cast<CFX_GraphStateData::LineJoin>(pObject->GetInteger())); break; case FXBSTR_ID('M', 'L', 0, 0): m_GraphState.SetMiterLimit(pObject->GetNumber()); break; case FXBSTR_ID('D', 0, 0, 0): { CPDF_Array* pDash = pObject->AsArray(); if (!pDash) break; CPDF_Array* pArray = pDash->GetArrayAt(0); if (!pArray) break; SetLineDash(pArray, pDash->GetNumberAt(1), 1.0f); break; } case FXBSTR_ID('R', 'I', 0, 0): m_GeneralState.SetRenderIntent(pObject->GetString()); break; case FXBSTR_ID('F', 'o', 'n', 't'): { CPDF_Array* pFont = pObject->AsArray(); if (!pFont) break; m_TextState.SetFontSize(pFont->GetNumberAt(1)); m_TextState.SetFont(pParser->FindFont(pFont->GetStringAt(0))); break; } case FXBSTR_ID('T', 'R', 0, 0): if (pGS->KeyExist("TR2")) { continue; } case FXBSTR_ID('T', 'R', '2', 0): m_GeneralState.SetTR(pObject && !pObject->IsName() ? pObject : nullptr); break; case FXBSTR_ID('B', 'M', 0, 0): { CPDF_Array* pArray = pObject->AsArray(); m_GeneralState.SetBlendMode(pArray ? pArray->GetStringAt(0) : pObject->GetString()); if (m_GeneralState.GetBlendType() > FXDIB_BLEND_MULTIPLY) pParser->GetPageObjectHolder()->SetBackgroundAlphaNeeded(true); break; } case FXBSTR_ID('S', 'M', 'a', 's'): if (ToDictionary(pObject)) { m_GeneralState.SetSoftMask(pObject); m_GeneralState.SetSMaskMatrix(pParser->GetCurStates()->m_CTM); } else { m_GeneralState.SetSoftMask(nullptr); } break; case FXBSTR_ID('C', 'A', 0, 0): m_GeneralState.SetStrokeAlpha(ClipFloat(pObject->GetNumber())); break; case FXBSTR_ID('c', 'a', 0, 0): m_GeneralState.SetFillAlpha(ClipFloat(pObject->GetNumber())); break; case FXBSTR_ID('O', 'P', 0, 0): m_GeneralState.SetStrokeOP(!!pObject->GetInteger()); if (!pGS->KeyExist("op")) m_GeneralState.SetFillOP(!!pObject->GetInteger()); break; case FXBSTR_ID('o', 'p', 0, 0): m_GeneralState.SetFillOP(!!pObject->GetInteger()); break; case FXBSTR_ID('O', 'P', 'M', 0): m_GeneralState.SetOPMode(pObject->GetInteger()); break; case FXBSTR_ID('B', 'G', 0, 0): if (pGS->KeyExist("BG2")) { continue; } case FXBSTR_ID('B', 'G', '2', 0): m_GeneralState.SetBG(pObject); break; case FXBSTR_ID('U', 'C', 'R', 0): if (pGS->KeyExist("UCR2")) { continue; } case FXBSTR_ID('U', 'C', 'R', '2'): m_GeneralState.SetUCR(pObject); break; case FXBSTR_ID('H', 'T', 0, 0): m_GeneralState.SetHT(pObject); break; case FXBSTR_ID('F', 'L', 0, 0): m_GeneralState.SetFlatness(pObject->GetNumber()); break; case FXBSTR_ID('S', 'M', 0, 0): m_GeneralState.SetSmoothness(pObject->GetNumber()); break; case FXBSTR_ID('S', 'A', 0, 0): m_GeneralState.SetStrokeAdjust(!!pObject->GetInteger()); break; case FXBSTR_ID('A', 'I', 'S', 0): m_GeneralState.SetAlphaSource(!!pObject->GetInteger()); break; case FXBSTR_ID('T', 'K', 0, 0): m_GeneralState.SetTextKnockout(!!pObject->GetInteger()); break; } } m_GeneralState.SetMatrix(m_CTM); }