// static void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y, CPDF_Font* pFont, FX_FLOAT font_size, const CFX_Matrix* pMatrix, const CFX_ByteString& str, FX_ARGB fill_argb, FX_ARGB stroke_argb, const CFX_GraphStateData* pGraphState, const CPDF_RenderOptions* pOptions) { if (pFont->IsType3Font()) return; int nChars = pFont->CountChar(str.c_str(), str.GetLength()); if (nChars <= 0) return; int offset = 0; uint32_t* pCharCodes; FX_FLOAT* pCharPos; std::vector<uint32_t> codes; std::vector<FX_FLOAT> positions; if (nChars == 1) { pCharCodes = reinterpret_cast<uint32_t*>( pFont->GetNextChar(str.c_str(), str.GetLength(), offset)); pCharPos = nullptr; } else { codes.resize(nChars); positions.resize(nChars - 1); FX_FLOAT cur_pos = 0; for (int i = 0; i < nChars; i++) { codes[i] = pFont->GetNextChar(str.c_str(), str.GetLength(), offset); if (i) positions[i - 1] = cur_pos; cur_pos += pFont->GetCharWidthF(codes[i]) * font_size / 1000; } pCharCodes = codes.data(); pCharPos = positions.data(); } CFX_Matrix matrix; if (pMatrix) matrix = *pMatrix; matrix.e = origin_x; matrix.f = origin_y; if (stroke_argb == 0) { DrawNormalText(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, fill_argb, pOptions); } else { DrawTextPath(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, nullptr, pGraphState, fill_argb, stroke_argb, nullptr, 0); } }
void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y, CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pMatrix, const CFX_ByteString& str, FX_ARGB fill_argb, FX_ARGB stroke_argb, const CFX_GraphStateData* pGraphState, const CPDF_RenderOptions* pOptions) { int nChars = pFont->CountChar(str, str.GetLength()); if (nChars == 0) { return; } FX_DWORD charcode; int offset = 0; FX_DWORD* pCharCodes; FX_FLOAT* pCharPos; if (nChars == 1) { charcode = pFont->GetNextChar(str, str.GetLength(), offset); pCharCodes = (FX_DWORD*)(uintptr_t)charcode; pCharPos = NULL; } else { pCharCodes = FX_Alloc(FX_DWORD, nChars); pCharPos = FX_Alloc(FX_FLOAT, nChars - 1); FX_FLOAT cur_pos = 0; for (int i = 0; i < nChars; i++) { pCharCodes[i] = pFont->GetNextChar(str, str.GetLength(), offset); if (i) { pCharPos[i - 1] = cur_pos; } cur_pos += pFont->GetCharWidthF(pCharCodes[i]) * font_size / 1000; } } CFX_AffineMatrix matrix; if (pMatrix) { matrix = *pMatrix; } matrix.e = origin_x; matrix.f = origin_y; if (pFont->GetFontType() == PDFFONT_TYPE3) ; else if (stroke_argb == 0) { DrawNormalText(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, fill_argb, pOptions); } else DrawTextPath(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, NULL, pGraphState, fill_argb, stroke_argb, NULL); if (nChars > 1) { FX_Free(pCharCodes); FX_Free(pCharPos); } }