14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/android/cfpf_skiafont.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <algorithm>
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_system.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/android/cfpf_skiabufferfont.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/android/cfpf_skiafilefont.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/android/cfpf_skiafontdescriptor.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/android/cfpf_skiafontmgr.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/android/cfpf_skiapathfont.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_freetype.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FPF_EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em)
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFPF_SkiaFont::CFPF_SkiaFont()
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pFontMgr(nullptr),
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pFontDes(nullptr),
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_Face(nullptr),
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwStyle(0),
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_uCharset(0),
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwRefCount(0) {}
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFPF_SkiaFont::~CFPF_SkiaFont() {
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_Face)
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXFT_Done_Face(m_Face);
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFPF_SkiaFont::Release() {
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (--m_dwRefCount == 0)
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete this;
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFPF_SkiaFont* CFPF_SkiaFont::Retain() {
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwRefCount++;
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return this;
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFPF_SkiaFont::GetFamilyName() {
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return ByteString();
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return ByteString(FXFT_Get_Face_Family_Name(m_Face));
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFPF_SkiaFont::GetPsName() {
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return ByteString();
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FXFT_Get_Postscript_Name(m_Face);
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CFPF_SkiaFont::GetGlyphIndex(wchar_t wUnicode) {
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return wUnicode;
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (FXFT_Select_Charmap(m_Face, FXFT_ENCODING_UNICODE))
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FXFT_Get_Char_Index(m_Face, wUnicode);
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFPF_SkiaFont::GetGlyphWidth(int32_t iGlyphIndex) {
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (FXFT_Load_Glyph(
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_Face, iGlyphIndex,
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       FXFT_Get_Glyph_HoriAdvance(m_Face));
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFPF_SkiaFont::GetAscent() const {
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       FXFT_Get_Face_Ascender(m_Face));
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFPF_SkiaFont::GetDescent() const {
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       FXFT_Get_Face_Descender(m_Face));
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFPF_SkiaFont::GetGlyphBBox(int32_t iGlyphIndex, FX_RECT& rtBBox) {
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (FXFT_Is_Face_Tricky(m_Face)) {
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72))
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (FXFT_Load_Glyph(m_Face, iGlyphIndex,
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXFT_Glyph glyph;
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (FXFT_Get_Glyph(m_Face->glyph, &glyph)) {
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXFT_BBox cbox;
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t x_ppem = m_Face->size->metrics.x_ppem;
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t y_ppem = m_Face->size->metrics.y_ppem;
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rtBBox.left = FPF_EM_ADJUST(x_ppem, cbox.xMin);
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rtBBox.right = FPF_EM_ADJUST(x_ppem, cbox.xMax);
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rtBBox.top = FPF_EM_ADJUST(y_ppem, cbox.yMax);
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rtBBox.bottom = FPF_EM_ADJUST(y_ppem, cbox.yMin);
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rtBBox.top = std::min(rtBBox.top, GetAscent());
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rtBBox.bottom = std::max(rtBBox.bottom, GetDescent());
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXFT_Done_Glyph(glyph);
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (FXFT_Load_Glyph(
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_Face, iGlyphIndex,
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              FXFT_Get_Glyph_HoriBearingX(m_Face));
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FXFT_Get_Glyph_HoriBearingY(m_Face));
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtBBox.right = FPF_EM_ADJUST(
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXFT_Get_Face_UnitsPerEM(m_Face),
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face));
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtBBox.top = FPF_EM_ADJUST(
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXFT_Get_Face_UnitsPerEM(m_Face),
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face));
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFPF_SkiaFont::GetBBox(FX_RECT& rtBBox) {
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_Face) {
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              FXFT_Get_Face_xMin(m_Face));
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             FXFT_Get_Face_yMin(m_Face));
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               FXFT_Get_Face_xMax(m_Face));
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FXFT_Get_Face_yMax(m_Face));
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFPF_SkiaFont::GetHeight() const {
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       FXFT_Get_Face_Height(m_Face));
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFPF_SkiaFont::GetItalicAngle() const {
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  TT_Postscript* ttInfo =
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (TT_Postscript*)FT_Get_Sfnt_Table(m_Face, ft_sfnt_post);
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (ttInfo)
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return ttInfo->italicAngle;
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFPF_SkiaFont::GetFontData(uint32_t dwTable,
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    uint8_t* pBuffer,
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                    uint32_t dwSize) {
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_ULong ulSize = pdfium::base::checked_cast<FT_ULong>(dwSize);
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (FXFT_Load_Sfnt_Table(m_Face, dwTable, 0, pBuffer, &ulSize))
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pdfium::base::checked_cast<uint32_t>(ulSize);
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFPF_SkiaFont::InitFont(CFPF_SkiaFontMgr* pFontMgr,
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             CFPF_SkiaFontDescriptor* pFontDes,
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             const ByteStringView& bsFamily,
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             uint32_t dwStyle,
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             uint8_t uCharset) {
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFontMgr || !pFontDes)
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (pFontDes->GetType()) {
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FPF_SKIAFONTTYPE_Path: {
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFPF_SkiaPathFont* pFont = (CFPF_SkiaPathFont*)pFontDes;
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Face = pFontMgr->GetFontFace(pFont->m_pPath, pFont->m_iFaceIndex);
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FPF_SKIAFONTTYPE_File: {
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFPF_SkiaFileFont* pFont = (CFPF_SkiaFileFont*)pFontDes;
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Face = pFontMgr->GetFontFace(pFont->m_pFile, pFont->m_iFaceIndex);
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FPF_SKIAFONTTYPE_Buffer: {
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFPF_SkiaBufferFont* pFont = (CFPF_SkiaBufferFont*)pFontDes;
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Face = pFontMgr->GetFontFace((const uint8_t*)pFont->m_pBuffer,
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     pFont->m_szBuffer, pFont->m_iFaceIndex);
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_Face)
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwStyle = dwStyle;
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_uCharset = uCharset;
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFontMgr = pFontMgr;
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFontDes = pFontDes;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwRefCount = 1;
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
220