FX_RECT CPWL_Wnd::PWLtoWnd(const CFX_FloatRect& rect) const { CFX_FloatRect rcTemp = rect; CFX_Matrix mt = GetWindowMatrix(); mt.TransformRect(rcTemp); return FX_RECT((int32_t)(rcTemp.left + 0.5), (int32_t)(rcTemp.bottom + 0.5), (int32_t)(rcTemp.right + 0.5), (int32_t)(rcTemp.top + 0.5)); }
CPDF_CIDFont::CPDF_CIDFont() : m_pCID2UnicodeMap(nullptr), m_bCIDIsGID(false), m_bAnsiWidthsFixed(false), m_bAdobeCourierStd(false) { for (size_t i = 0; i < FX_ArraySize(m_CharBBox); ++i) m_CharBBox[i] = FX_RECT(-1, -1, -1, -1); }
void CPDF_RenderContext::GetBackground(const RetainPtr<CFX_DIBitmap>& pBuffer, const CPDF_PageObject* pObj, const CPDF_RenderOptions* pOptions, CFX_Matrix* pFinalMatrix) { CFX_DefaultRenderDevice device; device.Attach(pBuffer, false, nullptr, false); device.FillRect(FX_RECT(0, 0, device.GetWidth(), device.GetHeight()), 0xffffffff); Render(&device, pObj, pOptions, pFinalMatrix); }
FX_RECT CPDF_Type3Font::GetCharBBox(uint32_t charcode, int level) { const CPDF_Type3Char* pChar = LoadChar(charcode, level); return pChar ? pChar->m_BBox : FX_RECT(); }
bool CFX_RenderDevice::SetClip_Rect(const CFX_RectF& rtClip) { return SetClip_Rect(FX_RECT(static_cast<int32_t>(floor(rtClip.left)), static_cast<int32_t>(floor(rtClip.top)), static_cast<int32_t>(ceil(rtClip.right())), static_cast<int32_t>(ceil(rtClip.bottom())))); }
FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode) { if (charcode < 256 && m_CharBBox[charcode].right != -1) return m_CharBBox[charcode]; FX_RECT rect; bool bVert = false; int glyph_index = GlyphFromCharCode(charcode, &bVert); FXFT_Face face = m_Font.GetFace(); if (face) { if (FXFT_Is_Face_Tricky(face)) { int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); if (!err) { FXFT_BBox cbox; FXFT_Glyph glyph; err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph); if (!err) { FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox); int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem; int pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem; if (pixel_size_x == 0 || pixel_size_y == 0) { rect = FX_RECT(cbox.xMin, cbox.yMax, cbox.xMax, cbox.yMin); } else { rect = FX_RECT(cbox.xMin * 1000 / pixel_size_x, cbox.yMax * 1000 / pixel_size_y, cbox.xMax * 1000 / pixel_size_x, cbox.yMin * 1000 / pixel_size_y); } rect.top = std::min(rect.top, static_cast<int>(FXFT_Get_Face_Ascender(face))); rect.bottom = std::max( rect.bottom, static_cast<int>(FXFT_Get_Face_Descender(face))); FXFT_Done_Glyph(glyph); } } } else { int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE); if (err == 0) { rect = FX_RECT(TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face), TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face), TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face), TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face)); rect.top += rect.top / 64; } } } if (!m_pFontFile && m_Charset == CIDSET_JAPAN1) { uint16_t CID = CIDFromCharCode(charcode); const uint8_t* pTransform = GetCIDTransform(CID); if (pTransform && !bVert) { CFX_Matrix matrix(CIDTransformToFloat(pTransform[0]), CIDTransformToFloat(pTransform[1]), CIDTransformToFloat(pTransform[2]), CIDTransformToFloat(pTransform[3]), CIDTransformToFloat(pTransform[4]) * 1000, CIDTransformToFloat(pTransform[5]) * 1000); CFX_FloatRect rect_f(rect); matrix.TransformRect(rect_f); rect = rect_f.GetOuterRect(); } } if (charcode < 256) m_CharBBox[charcode] = rect; return rect; }
CPDF_CIDFont::CPDF_CIDFont(CPDF_Document* pDocument, CPDF_Dictionary* pFontDict) : CPDF_Font(pDocument, pFontDict) { for (size_t i = 0; i < FX_ArraySize(m_CharBBox); ++i) m_CharBBox[i] = FX_RECT(-1, -1, -1, -1); }