Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: core/fxge/ge/fx_ge_font.cpp

Issue 2169793002: Use smart pointers for CFX_Font and CFX_Type3Font classes (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: style fixes Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "core/fxge/include/fx_font.h" 7 #include "core/fxge/include/fx_font.h"
8 8
9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
10 #include "core/fxge/ge/fx_text_int.h" 10 #include "core/fxge/ge/fx_text_int.h"
(...skipping 14 matching lines...) Expand all
25 FXFM_ENCODING_ADOBE_LATIN_1, FXFM_ENCODING_OLD_LATIN_2, 25 FXFM_ENCODING_ADOBE_LATIN_1, FXFM_ENCODING_OLD_LATIN_2,
26 FXFM_ENCODING_APPLE_ROMAN, 26 FXFM_ENCODING_APPLE_ROMAN,
27 }; 27 };
28 28
29 CFX_UnicodeEncodingEx* _FXFM_CreateFontEncoding(CFX_Font* pFont, 29 CFX_UnicodeEncodingEx* _FXFM_CreateFontEncoding(CFX_Font* pFont,
30 uint32_t nEncodingID) { 30 uint32_t nEncodingID) {
31 if (FXFT_Select_Charmap(pFont->GetFace(), nEncodingID)) 31 if (FXFT_Select_Charmap(pFont->GetFace(), nEncodingID))
32 return nullptr; 32 return nullptr;
33 return new CFX_UnicodeEncodingEx(pFont, nEncodingID); 33 return new CFX_UnicodeEncodingEx(pFont, nEncodingID);
34 } 34 }
35
36 unsigned long FTStreamRead(FXFT_Stream stream,
37 unsigned long offset,
38 unsigned char* buffer,
39 unsigned long count) {
40 if (count == 0) {
dsinclair 2016/07/21 19:39:59 nit: no {}'s
Wei Li 2016/07/21 21:15:02 Done.
41 return 0;
42 }
43 IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
dsinclair 2016/07/21 19:39:59 nit: static_cast
Wei Li 2016/07/21 21:15:02 Done.
44 int res = pFile->ReadBlock(buffer, offset, count);
45 if (res) {
dsinclair 2016/07/21 19:39:59 ditto
Wei Li 2016/07/21 21:15:02 Removed this.
46 return count;
47 }
48 return 0;
dsinclair 2016/07/21 19:39:59 return res ? count : 0; ?
Wei Li 2016/07/21 21:15:03 Done.
49 }
50
51 void FTStreamClose(FXFT_Stream stream) {}
52
53 FX_BOOL LoadFileImp(FXFT_Library library,
54 FXFT_Face* Face,
55 IFX_FileRead* pFile,
56 int32_t faceIndex,
57 std::unique_ptr<FXFT_StreamRec>* stream) {
58 std::unique_ptr<FXFT_StreamRec> stream1(new FXFT_StreamRec());
59 stream1->base = nullptr;
60 stream1->size = (unsigned long)pFile->GetSize();
dsinclair 2016/07/21 19:39:59 nit: static_cast
Wei Li 2016/07/21 21:15:02 Done.
61 stream1->pos = 0;
62 stream1->descriptor.pointer = pFile;
63 stream1->close = FTStreamClose;
64 stream1->read = FTStreamRead;
65 FXFT_Open_Args args;
66 args.flags = FT_OPEN_STREAM;
67 args.stream = stream1.get();
68 if (FXFT_Open_Face(library, &args, faceIndex, Face))
69 return FALSE;
70 if (stream)
71 *stream = std::move(stream1);
72 return TRUE;
73 }
35 #endif // PDF_ENABLE_XFA 74 #endif // PDF_ENABLE_XFA
36 75
37 FXFT_Face FT_LoadFont(const uint8_t* pData, int size) { 76 FXFT_Face FT_LoadFont(const uint8_t* pData, int size) {
38 return CFX_GEModule::Get()->GetFontMgr()->GetFixedFace(pData, size, 0); 77 return CFX_GEModule::Get()->GetFontMgr()->GetFixedFace(pData, size, 0);
39 } 78 }
40 79
41 } // namespace 80 } // namespace
42 81
43 CFX_Font::CFX_Font() 82 CFX_Font::CFX_Font()
44 #ifdef PDF_ENABLE_XFA 83 #ifdef PDF_ENABLE_XFA
45 : m_bLogic(FALSE), 84 : m_bLogic(FALSE),
46 m_pOwnedStream(nullptr), 85 m_pOwnedStream(nullptr),
47 m_Face(nullptr), 86 m_Face(nullptr),
48 #else 87 #else
49 : m_Face(nullptr), 88 : m_Face(nullptr),
50 #endif // PDF_ENABLE_XFA 89 #endif // PDF_ENABLE_XFA
51 m_pSubstFont(nullptr),
52 m_pFontDataAllocation(nullptr),
53 m_pFontData(nullptr), 90 m_pFontData(nullptr),
54 m_pGsubData(nullptr), 91 m_pGsubData(nullptr),
55 m_dwSize(0), 92 m_dwSize(0),
56 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 93 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
57 m_pPlatformFont(nullptr), 94 m_pPlatformFont(nullptr),
58 #endif 95 #endif
59 m_bEmbedded(FALSE), 96 m_bEmbedded(FALSE),
60 m_bVertical(FALSE) { 97 m_bVertical(FALSE) {
61 } 98 }
62 99
63 #ifdef PDF_ENABLE_XFA 100 #ifdef PDF_ENABLE_XFA
64 FX_BOOL CFX_Font::LoadClone(const CFX_Font* pFont) { 101 FX_BOOL CFX_Font::LoadClone(const CFX_Font* pFont) {
65 if (!pFont) 102 if (!pFont)
66 return FALSE; 103 return FALSE;
67 104
68 m_bLogic = TRUE; 105 m_bLogic = TRUE;
69 if (pFont->m_pSubstFont) { 106 if (pFont->m_pSubstFont) {
70 m_pSubstFont = new CFX_SubstFont; 107 m_pSubstFont.reset(new CFX_SubstFont);
71 m_pSubstFont->m_Charset = pFont->m_pSubstFont->m_Charset; 108 m_pSubstFont->m_Charset = pFont->m_pSubstFont->m_Charset;
72 m_pSubstFont->m_ExtHandle = pFont->m_pSubstFont->m_ExtHandle; 109 m_pSubstFont->m_ExtHandle = pFont->m_pSubstFont->m_ExtHandle;
73 m_pSubstFont->m_SubstFlags = pFont->m_pSubstFont->m_SubstFlags; 110 m_pSubstFont->m_SubstFlags = pFont->m_pSubstFont->m_SubstFlags;
74 m_pSubstFont->m_Weight = pFont->m_pSubstFont->m_Weight; 111 m_pSubstFont->m_Weight = pFont->m_pSubstFont->m_Weight;
75 m_pSubstFont->m_Family = pFont->m_pSubstFont->m_Family; 112 m_pSubstFont->m_Family = pFont->m_pSubstFont->m_Family;
76 m_pSubstFont->m_ItalicAngle = pFont->m_pSubstFont->m_ItalicAngle; 113 m_pSubstFont->m_ItalicAngle = pFont->m_pSubstFont->m_ItalicAngle;
77 } 114 }
78 if (pFont->m_OtfFontData.GetSize()) { 115 if (pFont->m_OtfFontData.GetSize()) {
79 m_OtfFontData.AttachData(pFont->m_OtfFontData.GetBuffer(), 116 m_OtfFontData.AttachData(pFont->m_OtfFontData.GetBuffer(),
80 pFont->m_OtfFontData.GetSize()); 117 pFont->m_OtfFontData.GetSize());
81 } 118 }
82 m_Face = pFont->m_Face; 119 m_Face = pFont->m_Face;
83 m_bEmbedded = pFont->m_bEmbedded; 120 m_bEmbedded = pFont->m_bEmbedded;
84 m_bVertical = pFont->m_bVertical; 121 m_bVertical = pFont->m_bVertical;
85 m_dwSize = pFont->m_dwSize; 122 m_dwSize = pFont->m_dwSize;
86 m_pFontData = pFont->m_pFontData; 123 m_pFontData = pFont->m_pFontData;
87 m_pGsubData = pFont->m_pGsubData; 124 m_pGsubData = pFont->m_pGsubData;
88 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 125 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
89 m_pPlatformFont = pFont->m_pPlatformFont; 126 m_pPlatformFont = pFont->m_pPlatformFont;
90 #endif 127 #endif
91 m_pOwnedStream = pFont->m_pOwnedStream; 128 m_pOwnedStream = pFont->m_pOwnedStream;
92 return TRUE; 129 return TRUE;
93 } 130 }
94 #endif // PDF_ENABLE_XFA 131 #endif // PDF_ENABLE_XFA
95 132
96 CFX_Font::~CFX_Font() { 133 CFX_Font::~CFX_Font() {
97 delete m_pSubstFont;
98 FX_Free(m_pFontDataAllocation);
99 #ifdef PDF_ENABLE_XFA 134 #ifdef PDF_ENABLE_XFA
100 if (m_bLogic) { 135 if (m_bLogic) {
101 m_OtfFontData.DetachBuffer(); 136 m_OtfFontData.DetachBuffer();
102 return; 137 return;
103 } 138 }
104 #endif // PDF_ENABLE_XFA 139 #endif // PDF_ENABLE_XFA
105 if (m_Face) { 140 if (m_Face) {
106 #ifndef PDF_ENABLE_XFA 141 #ifndef PDF_ENABLE_XFA
107 if (FXFT_Get_Face_External_Stream(m_Face)) { 142 if (FXFT_Get_Face_External_Stream(m_Face)) {
108 FXFT_Clear_Face_External_Stream(m_Face); 143 FXFT_Clear_Face_External_Stream(m_Face);
109 } 144 }
110 #endif // PDF_ENABLE_XFA 145 #endif // PDF_ENABLE_XFA
111 if (m_bEmbedded) { 146 if (m_bEmbedded) {
112 DeleteFace(); 147 DeleteFace();
113 } else { 148 } else {
114 CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); 149 CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
115 } 150 }
116 } 151 }
117 #ifdef PDF_ENABLE_XFA 152 #ifdef PDF_ENABLE_XFA
118 FX_Free(m_pOwnedStream); 153 FX_Free(m_pOwnedStream);
119 #endif // PDF_ENABLE_XFA 154 #endif // PDF_ENABLE_XFA
120 FX_Free(m_pGsubData); 155 FX_Free(m_pGsubData);
121 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 156 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
122 ReleasePlatformResource(); 157 ReleasePlatformResource();
123 #endif 158 #endif
124 } 159 }
160
125 void CFX_Font::DeleteFace() { 161 void CFX_Font::DeleteFace() {
126 FXFT_Done_Face(m_Face); 162 FXFT_Done_Face(m_Face);
127 m_Face = nullptr; 163 m_Face = nullptr;
128 } 164 }
165
129 void CFX_Font::LoadSubst(const CFX_ByteString& face_name, 166 void CFX_Font::LoadSubst(const CFX_ByteString& face_name,
130 FX_BOOL bTrueType, 167 FX_BOOL bTrueType,
131 uint32_t flags, 168 uint32_t flags,
132 int weight, 169 int weight,
133 int italic_angle, 170 int italic_angle,
134 int CharsetCP, 171 int CharsetCP,
135 FX_BOOL bVertical) { 172 FX_BOOL bVertical) {
136 m_bEmbedded = FALSE; 173 m_bEmbedded = FALSE;
137 m_bVertical = bVertical; 174 m_bVertical = bVertical;
138 m_pSubstFont = new CFX_SubstFont; 175 m_pSubstFont.reset(new CFX_SubstFont);
139 m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont( 176 m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont(
140 face_name, bTrueType, flags, weight, italic_angle, CharsetCP, 177 face_name, bTrueType, flags, weight, italic_angle, CharsetCP,
141 m_pSubstFont); 178 m_pSubstFont.get());
142 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 179 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
143 if (m_pSubstFont->m_ExtHandle) { 180 if (m_pSubstFont->m_ExtHandle) {
144 m_pPlatformFont = m_pSubstFont->m_ExtHandle; 181 m_pPlatformFont = m_pSubstFont->m_ExtHandle;
145 m_pSubstFont->m_ExtHandle = nullptr; 182 m_pSubstFont->m_ExtHandle = nullptr;
146 } 183 }
147 #endif 184 #endif
148 if (m_Face) { 185 if (m_Face) {
149 m_pFontData = FXFT_Get_Face_Stream_Base(m_Face); 186 m_pFontData = FXFT_Get_Face_Stream_Base(m_Face);
150 m_dwSize = FXFT_Get_Face_Stream_Size(m_Face); 187 m_dwSize = FXFT_Get_Face_Stream_Size(m_Face);
151 } 188 }
152 } 189 }
190
153 #ifdef PDF_ENABLE_XFA 191 #ifdef PDF_ENABLE_XFA
154 extern "C" {
155 unsigned long _FTStreamRead(FXFT_Stream stream,
156 unsigned long offset,
157 unsigned char* buffer,
158 unsigned long count) {
159 if (count == 0) {
160 return 0;
161 }
162 IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
163 int res = pFile->ReadBlock(buffer, offset, count);
164 if (res) {
165 return count;
166 }
167 return 0;
168 }
169 void _FTStreamClose(FXFT_Stream stream) {}
170 };
171 FX_BOOL _LoadFile(FXFT_Library library,
172 FXFT_Face* Face,
173 IFX_FileRead* pFile,
174 FXFT_Stream* stream,
175 int32_t faceIndex = 0) {
176 FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(uint8_t, sizeof(FXFT_StreamRec));
177 stream1->base = nullptr;
178 stream1->size = (unsigned long)pFile->GetSize();
179 stream1->pos = 0;
180 stream1->descriptor.pointer = pFile;
181 stream1->close = _FTStreamClose;
182 stream1->read = _FTStreamRead;
183 FXFT_Open_Args args;
184 args.flags = FT_OPEN_STREAM;
185 args.stream = stream1;
186 if (FXFT_Open_Face(library, &args, faceIndex, Face)) {
187 FX_Free(stream1);
188 return FALSE;
189 }
190 if (stream) {
191 *stream = stream1;
192 }
193 return TRUE;
194 }
195
196 FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile, 192 FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile,
197 int nFaceIndex, 193 int nFaceIndex,
198 int* pFaceCount) { 194 int* pFaceCount) {
199 m_bEmbedded = FALSE; 195 m_bEmbedded = FALSE;
200 196
201 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); 197 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
202 pFontMgr->InitFTLibrary(); 198 pFontMgr->InitFTLibrary();
203 FXFT_Library library = pFontMgr->GetFTLibrary(); 199 FXFT_Library library = pFontMgr->GetFTLibrary();
204 200
205 FXFT_Stream stream = nullptr; 201 std::unique_ptr<FXFT_StreamRec> stream;
206 if (!_LoadFile(library, &m_Face, pFile, &stream, nFaceIndex)) 202 if (!LoadFileImp(library, &m_Face, pFile, nFaceIndex, &stream))
207 return FALSE; 203 return FALSE;
208 204
209 if (pFaceCount) 205 if (pFaceCount)
210 *pFaceCount = (int)m_Face->num_faces; 206 *pFaceCount = (int)m_Face->num_faces;
211 m_pOwnedStream = stream; 207 m_pOwnedStream = stream.release();
212 FXFT_Set_Pixel_Sizes(m_Face, 0, 64); 208 FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
213 return TRUE; 209 return TRUE;
214 } 210 }
215 #endif // PDF_ENABLE_XFA 211 #endif // PDF_ENABLE_XFA
216 212
217 int CFX_Font::GetGlyphWidth(uint32_t glyph_index) { 213 int CFX_Font::GetGlyphWidth(uint32_t glyph_index) {
218 if (!m_Face) { 214 if (!m_Face) {
219 return 0; 215 return 0;
220 } 216 }
221 if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) { 217 if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) {
222 AdjustMMParams(glyph_index, 0, 0); 218 AdjustMMParams(glyph_index, 0, 0);
223 } 219 }
224 int err = FXFT_Load_Glyph( 220 int err = FXFT_Load_Glyph(
225 m_Face, glyph_index, 221 m_Face, glyph_index,
226 FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); 222 FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
227 if (err) { 223 if (err) {
228 return 0; 224 return 0;
229 } 225 }
230 int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), 226 int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
231 FXFT_Get_Glyph_HoriAdvance(m_Face)); 227 FXFT_Get_Glyph_HoriAdvance(m_Face));
232 return width; 228 return width;
233 } 229 }
234 230
235 FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, uint32_t size) { 231 FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, uint32_t size) {
236 m_pFontDataAllocation = FX_Alloc(uint8_t, size); 232 std::vector<uint8_t> temp(data, data + size / sizeof(uint8_t));
dsinclair 2016/07/21 19:39:59 Why does this divide by uint8_t? Size is the numbe
Wei Li 2016/07/21 21:15:02 Right, thanks
237 FXSYS_memcpy(m_pFontDataAllocation, data, size); 233 m_pFontDataAllocation.swap(temp);
238 m_Face = FT_LoadFont(m_pFontDataAllocation, size); 234 m_Face = FT_LoadFont(m_pFontDataAllocation.data(), size);
239 m_pFontData = m_pFontDataAllocation; 235 m_pFontData = m_pFontDataAllocation.data();
240 m_bEmbedded = TRUE; 236 m_bEmbedded = TRUE;
241 m_dwSize = size; 237 m_dwSize = size;
242 return !!m_Face; 238 return !!m_Face;
243 } 239 }
244 240
245 FX_BOOL CFX_Font::IsTTFont() const { 241 FX_BOOL CFX_Font::IsTTFont() const {
246 if (!m_Face) 242 if (!m_Face)
247 return FALSE; 243 return FALSE;
248 return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; 244 return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT;
249 } 245 }
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 for (size_t i = 0; i < FX_ArraySize(g_EncodingID); ++i) { 527 for (size_t i = 0; i < FX_ArraySize(g_EncodingID); ++i) {
532 CFX_UnicodeEncodingEx* pFontEncoding = 528 CFX_UnicodeEncodingEx* pFontEncoding =
533 _FXFM_CreateFontEncoding(pFont, g_EncodingID[i]); 529 _FXFM_CreateFontEncoding(pFont, g_EncodingID[i]);
534 if (pFontEncoding) { 530 if (pFontEncoding) {
535 return pFontEncoding; 531 return pFontEncoding;
536 } 532 }
537 } 533 }
538 return nullptr; 534 return nullptr;
539 } 535 }
540 #endif // PDF_ENABLE_XFA 536 #endif // PDF_ENABLE_XFA
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698