FX_BOOL CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device, FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions) { CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL; CPDF_CharPosList CharPosList; CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size); int FXGE_flags = 0; if (pOptions) { FX_DWORD dwFlags = pOptions->m_Flags; if (dwFlags & RENDER_CLEARTYPE) { FXGE_flags |= FXTEXT_CLEARTYPE; if (dwFlags & RENDER_BGR_STRIPE) { FXGE_flags |= FXTEXT_BGR_STRIPE; } } if (dwFlags & RENDER_NOTEXTSMOOTH) { FXGE_flags |= FXTEXT_NOSMOOTH; } if (dwFlags & RENDER_PRINTGRAPHICTEXT) { FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT; } if (dwFlags & RENDER_NO_NATIVETEXT) { FXGE_flags |= FXTEXT_NO_NATIVETEXT; } if (dwFlags & RENDER_PRINTIMAGETEXT) { FXGE_flags |= FXTEXT_PRINTIMAGETEXT; } } else { FXGE_flags = FXTEXT_CLEARTYPE; } if (pFont->GetFontType() & PDFFONT_CIDFONT) { FXGE_flags |= FXFONT_CIDFONT; } return pDevice->DrawNormalText(CharPosList.m_nChars, CharPosList.m_pCharPos, &pFont->m_Font, pCache, font_size, pText2Device, fill_argb, FXGE_flags); }
FX_BOOL CPDF_TextRenderer::DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState, FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag) { CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL; CPDF_CharPosList CharPosList; CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size); return pDevice->DrawTextPath(CharPosList.m_nChars, CharPosList.m_pCharPos, &pFont->m_Font, pCache, font_size, pText2User, pUser2Device, pGraphState, fill_argb, stroke_argb, pClippingPath, nFlag); }
// static bool CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice, int nChars, uint32_t* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont, FX_FLOAT font_size, const CFX_Matrix* pText2Device, FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions) { CPDF_CharPosList CharPosList; CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size); if (CharPosList.m_nChars == 0) return true; int FXGE_flags = 0; if (pOptions) { uint32_t dwFlags = pOptions->m_Flags; if (dwFlags & RENDER_CLEARTYPE) { FXGE_flags |= FXTEXT_CLEARTYPE; if (dwFlags & RENDER_BGR_STRIPE) { FXGE_flags |= FXTEXT_BGR_STRIPE; } } if (dwFlags & RENDER_NOTEXTSMOOTH) { FXGE_flags |= FXTEXT_NOSMOOTH; } if (dwFlags & RENDER_PRINTGRAPHICTEXT) { FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT; } if (dwFlags & RENDER_NO_NATIVETEXT) { FXGE_flags |= FXTEXT_NO_NATIVETEXT; } if (dwFlags & RENDER_PRINTIMAGETEXT) { FXGE_flags |= FXTEXT_PRINTIMAGETEXT; } } else { FXGE_flags = FXTEXT_CLEARTYPE; } if (pFont->IsCIDFont()) { FXGE_flags |= FXFONT_CIDFONT; } bool bDraw = true; int32_t fontPosition = CharPosList.m_pCharPos[0].m_FallbackFontPosition; uint32_t startIndex = 0; for (uint32_t i = 0; i < CharPosList.m_nChars; i++) { int32_t curFontPosition = CharPosList.m_pCharPos[i].m_FallbackFontPosition; if (fontPosition == curFontPosition) continue; auto* font = fontPosition == -1 ? &pFont->m_Font : pFont->m_FontFallbacks[fontPosition].get(); if (!pDevice->DrawNormalText( i - startIndex, CharPosList.m_pCharPos + startIndex, font, font_size, pText2Device, fill_argb, FXGE_flags)) { bDraw = false; } fontPosition = curFontPosition; startIndex = i; } auto* font = fontPosition == -1 ? &pFont->m_Font : pFont->m_FontFallbacks[fontPosition].get(); if (!pDevice->DrawNormalText(CharPosList.m_nChars - startIndex, CharPosList.m_pCharPos + startIndex, font, font_size, pText2Device, fill_argb, FXGE_flags)) { bDraw = false; } return bDraw; }