bool CPDF_DIBSource::LoadColorInfo(const CPDF_Dictionary* pFormResources, const CPDF_Dictionary* pPageResources) { m_bpc_orig = m_pDict->GetIntegerFor("BitsPerComponent"); if (m_pDict->GetIntegerFor("ImageMask")) m_bImageMask = true; if (m_bImageMask || !m_pDict->KeyExist("ColorSpace")) { if (!m_bImageMask) { CPDF_Object* pFilter = m_pDict->GetDirectObjectFor("Filter"); if (pFilter) { CFX_ByteString filter; if (pFilter->IsName()) { filter = pFilter->GetString(); } else if (CPDF_Array* pArray = pFilter->AsArray()) { filter = pArray->GetStringAt(pArray->GetCount() - 1); } if (filter == "JPXDecode") { m_bDoBpcCheck = false; return true; } } } m_bImageMask = true; m_bpc = m_nComponents = 1; CPDF_Array* pDecode = m_pDict->GetArrayFor("Decode"); m_bDefaultDecode = !pDecode || !pDecode->GetIntegerAt(0); return true; } CPDF_Object* pCSObj = m_pDict->GetDirectObjectFor("ColorSpace"); if (!pCSObj) return false; CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData(); if (pFormResources) m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources); if (!m_pColorSpace) m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources); if (!m_pColorSpace) return false; m_Family = m_pColorSpace->GetFamily(); m_nComponents = m_pColorSpace->CountComponents(); if (m_Family == PDFCS_ICCBASED && pCSObj->IsName()) { CFX_ByteString cs = pCSObj->GetString(); if (cs == "DeviceGray") { m_nComponents = 1; } else if (cs == "DeviceRGB") { m_nComponents = 3; } else if (cs == "DeviceCMYK") { m_nComponents = 4; } } ValidateDictParam(); m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); return !!m_pCompData; }
void CPDF_StreamContentParser::Handle_SetColorPS_Stroke() { if (m_Options.m_bTextOnly) { return; } CPDF_Object* pLastParam = GetObject(0); if (!pLastParam) { return; } int nargs = m_ParamCount; int nvalues = nargs; if (pLastParam->IsName()) nvalues--; FX_FLOAT* values = NULL; if (nvalues) { values = FX_Alloc(FX_FLOAT, nvalues); for (int i = 0; i < nvalues; i++) { values[i] = GetNumber(nargs - i - 1); } } if (nvalues != nargs) { CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE); if (pPattern) { m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues); } } else { m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nvalues); } FX_Free(values); }
FX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { CFX_ByteString name = pArray->GetString(1); if (name == "None") { m_Type = None; } else { m_Type = Colorant; CPDF_Object* pAltCS = pArray->GetElementValue(2); if (pAltCS == m_pArray) { return FALSE; } m_pAltCS = Load(pDoc, pAltCS); if (!m_pAltCS) { return FALSE; } CPDF_Object* pFuncObj = pArray->GetElementValue(3); if (pFuncObj && !pFuncObj->IsName()) m_pFunc = CPDF_Function::Load(pFuncObj); if (m_pFunc && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) { delete m_pFunc; m_pFunc = NULL; } } return TRUE; }
void PDF_ReplaceAbbr(CPDF_Object* pObj) { switch (pObj->GetType()) { case PDFOBJ_DICTIONARY: { CPDF_Dictionary* pDict = pObj->AsDictionary(); for (const auto& it : *pDict) { CFX_ByteString key = it.first; CPDF_Object* value = it.second; CFX_ByteStringC fullname = PDF_FindFullName( PDF_InlineKeyAbbr, FX_ArraySize(PDF_InlineKeyAbbr), key); if (!fullname.IsEmpty()) { pDict->ReplaceKey(key, fullname); key = fullname; } if (value->IsName()) { CFX_ByteString name = value->GetString(); fullname = PDF_FindFullName(PDF_InlineValueAbbr, FX_ArraySize(PDF_InlineValueAbbr), name); if (!fullname.IsEmpty()) { pDict->SetAtName(key, fullname); } } else { PDF_ReplaceAbbr(value); } } break; } case PDFOBJ_ARRAY: { CPDF_Array* pArray = pObj->AsArray(); for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { CPDF_Object* pElement = pArray->GetElement(i); if (pElement->IsName()) { CFX_ByteString name = pElement->GetString(); CFX_ByteStringC fullname = PDF_FindFullName( PDF_InlineValueAbbr, FX_ArraySize(PDF_InlineValueAbbr), name); if (!fullname.IsEmpty()) { pArray->SetAt(i, new CPDF_Name(fullname)); } } else { PDF_ReplaceAbbr(pElement); } } break; } } }
CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc) { CPDF_Object* pDest = m_pDict->GetElementValue("Dest"); if (!pDest) return CPDF_Dest(); if (pDest->IsString() || pDest->IsName()) { CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests")); CFX_ByteStringC name = pDest->GetString(); return CPDF_Dest(name_tree.LookupNamedDest(pDoc, name)); } if (CPDF_Array* pArray = pDest->AsArray()) return CPDF_Dest(pArray); return CPDF_Dest(); }
void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary() { if (!m_Options.m_bMarkedContent) { return; } CFX_ByteString tag = GetString(1); CPDF_Object* pProperty = GetObject(0); if (!pProperty) { return; } FX_BOOL bDirect = TRUE; if (pProperty->IsName()) { pProperty = FindResourceObj("Properties", pProperty->GetString()); if (!pProperty) return; bDirect = FALSE; } if (CPDF_Dictionary* pDict = pProperty->AsDictionary()) { m_CurContentMark.GetModify()->AddMark(tag, pDict, bDirect); } }
CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const { if (!m_pDict) return CPDF_Dest(); CFX_ByteString type = m_pDict->GetStringFor("S"); if (type != "GoTo" && type != "GoToR") return CPDF_Dest(); CPDF_Object* pDest = m_pDict->GetDirectObjectFor("D"); if (!pDest) return CPDF_Dest(); if (pDest->IsString() || pDest->IsName()) { CPDF_NameTree name_tree(pDoc, "Dests"); return CPDF_Dest(name_tree.LookupNamedDest(pDoc, pDest->GetString())); } if (CPDF_Array* pArray = pDest->AsArray()) return CPDF_Dest(pArray); return CPDF_Dest(); }
bool CPDF_ImageRenderer::StartRenderDIBSource() { if (!m_Loader.m_pBitmap) return false; m_BitmapAlpha = FXSYS_round(255 * m_pImageObject->m_GeneralState.GetFillAlpha()); m_pDIBSource = m_Loader.m_pBitmap; if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && !m_Loader.m_pMask) { return StartBitmapAlpha(); } if (m_pImageObject->m_GeneralState.GetTR()) { if (!m_pImageObject->m_GeneralState.GetTransferFunc()) { m_pImageObject->m_GeneralState.SetTransferFunc( m_pRenderStatus->GetTransferFunc( m_pImageObject->m_GeneralState.GetTR())); } if (m_pImageObject->m_GeneralState.GetTransferFunc() && !m_pImageObject->m_GeneralState.GetTransferFunc()->m_bIdentity) { m_pDIBSource = m_Loader.m_pBitmap = m_pImageObject->m_GeneralState.GetTransferFunc()->TranslateImage( m_Loader.m_pBitmap, !m_Loader.m_bCached); if (m_Loader.m_bCached && m_Loader.m_pMask) m_Loader.m_pMask = m_Loader.m_pMask->Clone().release(); m_Loader.m_bCached = false; } } m_FillArgb = 0; m_bPatternColor = false; m_pPattern = nullptr; if (m_pDIBSource->IsAlphaMask()) { const CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor(); if (pColor && pColor->IsPattern()) { m_pPattern = pColor->GetPattern(); if (m_pPattern) m_bPatternColor = true; } m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject); } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) { m_pClone = m_pDIBSource->Clone(); m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pRenderStatus->m_Options.m_ForeColor); m_pDIBSource = m_pClone.get(); } m_Flags = 0; if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) m_Flags |= RENDER_FORCE_DOWNSAMPLE; else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) m_Flags |= RENDER_FORCE_HALFTONE; if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) { CPDF_Object* pFilters = m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectFor( "Filter"); if (pFilters) { if (pFilters->IsName()) { CFX_ByteString bsDecodeType = pFilters->GetString(); if (bsDecodeType == "DCTDecode" || bsDecodeType == "JPXDecode") m_Flags |= FXRENDER_IMAGE_LOSSY; } else if (CPDF_Array* pArray = pFilters->AsArray()) { for (size_t i = 0; i < pArray->GetCount(); i++) { CFX_ByteString bsDecodeType = pArray->GetStringAt(i); if (bsDecodeType == "DCTDecode" || bsDecodeType == "JPXDecode") { m_Flags |= FXRENDER_IMAGE_LOSSY; break; } } } } } if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) m_Flags |= FXDIB_NOSMOOTH; else if (m_pImageObject->GetImage()->IsInterpol()) m_Flags |= FXDIB_INTERPOL; if (m_Loader.m_pMask) return DrawMaskedImage(); if (m_bPatternColor) return DrawPatternImage(m_pObj2Device); if (m_BitmapAlpha != 255 || !m_pImageObject->m_GeneralState || !m_pImageObject->m_GeneralState.GetFillOP() || m_pImageObject->m_GeneralState.GetOPMode() != 0 || m_pImageObject->m_GeneralState.GetBlendType() != FXDIB_BLEND_NORMAL || m_pImageObject->m_GeneralState.GetStrokeAlpha() != 1.0f || m_pImageObject->m_GeneralState.GetFillAlpha() != 1.0f) { return StartDIBSource(); } CPDF_Document* pDocument = nullptr; CPDF_Page* pPage = nullptr; if (m_pRenderStatus->m_pContext->GetPageCache()) { pPage = m_pRenderStatus->m_pContext->GetPageCache()->GetPage(); pDocument = pPage->m_pDocument; } else { pDocument = m_pImageObject->GetImage()->GetDocument(); } CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : nullptr; CPDF_Object* pCSObj = m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectFor( "ColorSpace"); CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources); if (!pColorSpace) return StartDIBSource(); int format = pColorSpace->GetFamily(); if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) { m_BlendType = FXDIB_BLEND_DARKEN; } pDocument->GetPageData()->ReleaseColorSpace(pCSObj); return StartDIBSource(); }
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); nonstd::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj( m_pSyntax->ReadNextObject()); if (!key.IsEmpty()) { FX_DWORD dwObjNum = pObj ? pObj->GetObjNum() : 0; if (dwObjNum) pDict->SetAtReference(key, m_pDocument, dwObjNum); else pDict->SetAt(key, pObj.release()); } } _PDF_ReplaceAbbr(pDict); CPDF_Object* pCSObj = NULL; if (pDict->KeyExist(FX_BSTRC("ColorSpace"))) { pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace")); if (pCSObj->IsName()) { 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); } } } } 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(); } } }
FX_BOOL CPDF_ImageRenderer::StartRenderDIBSource() { if (m_Loader.m_pBitmap == NULL) { return FALSE; } m_BitmapAlpha = 255; const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState; if (pGeneralState) { m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255); } m_pDIBSource = m_Loader.m_pBitmap; if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader.m_pMask == NULL) { return StartBitmapAlpha(); } if (pGeneralState && pGeneralState->m_pTR) { if (!pGeneralState->m_pTransferFunc) { ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR); } if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m_bIdentity) { m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached); if (m_Loader.m_bCached && m_Loader.m_pMask) { m_Loader.m_pMask = m_Loader.m_pMask->Clone(); } m_Loader.m_bCached = FALSE; } } m_FillArgb = 0; m_bPatternColor = FALSE; m_pPattern = NULL; if (m_pDIBSource->IsAlphaMask()) { CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor(); if (pColor && pColor->IsPattern()) { m_pPattern = pColor->GetPattern(); if (m_pPattern != NULL) { m_bPatternColor = TRUE; } } m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject); } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) { m_pClone = m_pDIBSource->Clone(); m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pRenderStatus->m_Options.m_ForeColor); m_pDIBSource = m_pClone; } m_Flags = 0; if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) { m_Flags |= RENDER_FORCE_DOWNSAMPLE; } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) { m_Flags |= RENDER_FORCE_HALFTONE; } if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) { CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue( FX_BSTRC("Filter")); if (pFilters) { if (pFilters->IsName()) { CFX_ByteStringC bsDecodeType = pFilters->GetConstString(); if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) { m_Flags |= FXRENDER_IMAGE_LOSSY; } } else if (CPDF_Array* pArray = pFilters->AsArray()) { for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { CFX_ByteStringC bsDecodeType = pArray->GetConstString(i); if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) { m_Flags |= FXRENDER_IMAGE_LOSSY; break; } } } } } if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) { m_Flags |= FXDIB_NOSMOOTH; } else if (m_pImageObject->m_pImage->IsInterpol()) { m_Flags |= FXDIB_INTERPOL; } if (m_Loader.m_pMask) { return DrawMaskedImage(); } if (m_bPatternColor) { return DrawPatternImage(m_pObj2Device); } if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP && pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) { CPDF_Document* pDocument = NULL; CPDF_Page* pPage = NULL; if (m_pRenderStatus->m_pContext->m_pPageCache) { pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage(); pDocument = pPage->m_pDocument; } else { pDocument = m_pImageObject->m_pImage->GetDocument(); } CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL; CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue( FX_BSTRC("ColorSpace")); CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources); if (pColorSpace) { int format = pColorSpace->GetFamily(); if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) { m_BlendType = FXDIB_BLEND_DARKEN; } pDocument->GetPageData()->ReleaseColorSpace(pCSObj); } } return StartDIBSource(); }
bool CPDF_CIDFont::Load() { if (m_pFontDict->GetStringFor("Subtype") == "TrueType") { LoadGB2312(); return true; } CPDF_Array* pFonts = m_pFontDict->GetArrayFor("DescendantFonts"); if (!pFonts || pFonts->GetCount() != 1) return false; CPDF_Dictionary* pCIDFontDict = pFonts->GetDictAt(0); if (!pCIDFontDict) return false; m_BaseFont = pCIDFontDict->GetStringFor("BaseFont"); if ((m_BaseFont.Compare("CourierStd") == 0 || m_BaseFont.Compare("CourierStd-Bold") == 0 || m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || m_BaseFont.Compare("CourierStd-Oblique") == 0) && !IsEmbedded()) { m_bAdobeCourierStd = true; } CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictFor("FontDescriptor"); if (pFontDesc) LoadFontDescriptor(pFontDesc); CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectFor("Encoding"); if (!pEncoding) return false; CFX_ByteString subtype = pCIDFontDict->GetStringFor("Subtype"); m_bType1 = (subtype == "CIDFontType0"); CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; if (pEncoding->IsName()) { CFX_ByteString cmap = pEncoding->GetString(); bool bPromptCJK = m_pFontFile && m_bType1; m_pCMap = manager.GetPredefinedCMap(cmap, bPromptCJK); if (!m_pCMap) return false; } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { m_pCMap = pdfium::MakeUnique<CPDF_CMap>(); CPDF_StreamAcc acc; acc.LoadAllData(pStream, false); m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); } else { return false; } m_Charset = m_pCMap->m_Charset; if (m_Charset == CIDSET_UNKNOWN) { CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDictFor("CIDSystemInfo"); if (pCIDInfo) { m_Charset = CharsetFromOrdering(pCIDInfo->GetStringFor("Ordering").AsStringC()); } } if (m_Charset != CIDSET_UNKNOWN) { bool bPromptCJK = !m_pFontFile && (m_pCMap->m_Coding == CIDCODING_CID || pCIDFontDict->KeyExist("W")); m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, bPromptCJK); } if (m_Font.GetFace()) { if (m_bType1) FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); else FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding); } m_DefaultWidth = pCIDFontDict->GetIntegerFor("DW", 1000); CPDF_Array* pWidthArray = pCIDFontDict->GetArrayFor("W"); if (pWidthArray) LoadMetricsArray(pWidthArray, &m_WidthList, 1); if (!IsEmbedded()) LoadSubstFont(); if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) { CPDF_Object* pmap = pCIDFontDict->GetDirectObjectFor("CIDToGIDMap"); if (pmap) { if (CPDF_Stream* pStream = pmap->AsStream()) { m_pStreamAcc = pdfium::MakeUnique<CPDF_StreamAcc>(); m_pStreamAcc->LoadAllData(pStream, false); } else if (pmap->GetString() == "Identity") { #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ if (m_pFontFile) m_bCIDIsGID = true; #else m_bCIDIsGID = true; #endif } } } CheckFontMetrics(); if (IsVertWriting()) { pWidthArray = pCIDFontDict->GetArrayFor("W2"); if (pWidthArray) LoadMetricsArray(pWidthArray, &m_VertMetrics, 3); CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayFor("DW2"); if (pDefaultArray) { m_DefaultVY = pDefaultArray->GetIntegerAt(0); m_DefaultW1 = pDefaultArray->GetIntegerAt(1); } else { m_DefaultVY = 880; m_DefaultW1 = -1000; } } return true; }
bool CPDF_CIDFont::Load() { if (m_pFontDict->GetStringFor("Subtype") == "TrueType") { LoadGB2312(); return true; } const CPDF_Array* pFonts = m_pFontDict->GetArrayFor("DescendantFonts"); if (!pFonts || pFonts->size() != 1) return false; const CPDF_Dictionary* pCIDFontDict = pFonts->GetDictAt(0); if (!pCIDFontDict) return false; m_BaseFont = pCIDFontDict->GetStringFor("BaseFont"); if ((m_BaseFont.Compare("CourierStd") == 0 || m_BaseFont.Compare("CourierStd-Bold") == 0 || m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || m_BaseFont.Compare("CourierStd-Oblique") == 0) && !IsEmbedded()) { m_bAdobeCourierStd = true; } const CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictFor("FontDescriptor"); if (pFontDesc) LoadFontDescriptor(pFontDesc); CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectFor("Encoding"); if (!pEncoding) return false; ByteString subtype = pCIDFontDict->GetStringFor("Subtype"); m_bType1 = (subtype == "CIDFontType0"); CPDF_CMapManager* manager = GetFontGlobals()->GetCMapManager(); if (pEncoding->IsName()) { ByteString cmap = pEncoding->GetString(); m_pCMap = manager->GetPredefinedCMap(cmap); if (!m_pCMap) return false; } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(pStream); pAcc->LoadAllDataFiltered(); m_pCMap = pdfium::MakeRetain<CPDF_CMap>(); m_pCMap->LoadEmbedded(pAcc->GetSpan()); } else { return false; } m_Charset = m_pCMap->GetCharset(); if (m_Charset == CIDSET_UNKNOWN) { const CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDictFor("CIDSystemInfo"); if (pCIDInfo) { m_Charset = CPDF_CMapParser::CharsetFromOrdering( pCIDInfo->GetStringFor("Ordering").AsStringView()); } } if (m_Charset != CIDSET_UNKNOWN) { m_pCID2UnicodeMap = manager->GetCID2UnicodeMap(m_Charset); } if (m_Font.GetFace()) { if (m_bType1) FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); else FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->GetCoding()); } m_DefaultWidth = pCIDFontDict->GetIntegerFor("DW", 1000); const CPDF_Array* pWidthArray = pCIDFontDict->GetArrayFor("W"); if (pWidthArray) LoadMetricsArray(pWidthArray, &m_WidthList, 1); if (!IsEmbedded()) LoadSubstFont(); const CPDF_Object* pmap = pCIDFontDict->GetDirectObjectFor("CIDToGIDMap"); if (pmap) { if (const CPDF_Stream* pStream = pmap->AsStream()) { m_pStreamAcc = pdfium::MakeRetain<CPDF_StreamAcc>(pStream); m_pStreamAcc->LoadAllDataFiltered(); } else if (m_pFontFile && pmap->GetString() == "Identity") { m_bCIDIsGID = true; } } CheckFontMetrics(); if (IsVertWriting()) { pWidthArray = pCIDFontDict->GetArrayFor("W2"); if (pWidthArray) LoadMetricsArray(pWidthArray, &m_VertMetrics, 3); const CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayFor("DW2"); if (pDefaultArray) { m_DefaultVY = pDefaultArray->GetIntegerAt(0); m_DefaultW1 = pDefaultArray->GetIntegerAt(1); } } return true; }
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); }