OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/cfx_facecache.h" | 7 #include "core/fxge/include/cfx_facecache.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 #endif | 82 #endif |
83 { | 83 { |
84 } | 84 } |
85 | 85 |
86 CFX_FaceCache::~CFX_FaceCache() { | 86 CFX_FaceCache::~CFX_FaceCache() { |
87 #ifdef _SKIA_SUPPORT_ | 87 #ifdef _SKIA_SUPPORT_ |
88 SkSafeUnref(m_pTypeface); | 88 SkSafeUnref(m_pTypeface); |
89 #endif | 89 #endif |
90 } | 90 } |
91 | 91 |
92 CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, | 92 CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(const CFX_Font* pFont, |
93 uint32_t glyph_index, | 93 uint32_t glyph_index, |
94 FX_BOOL bFontStyle, | 94 FX_BOOL bFontStyle, |
95 const CFX_Matrix* pMatrix, | 95 const CFX_Matrix* pMatrix, |
96 int dest_width, | 96 int dest_width, |
97 int anti_alias) { | 97 int anti_alias) { |
98 if (!m_Face) | 98 if (!m_Face) |
99 return nullptr; | 99 return nullptr; |
100 | 100 |
101 FXFT_Matrix ft_matrix; | 101 FXFT_Matrix ft_matrix; |
102 ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536); | 102 ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 } else { | 216 } else { |
217 ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, | 217 ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, |
218 dest_pitch); | 218 dest_pitch); |
219 GammaAdjust(pDestBuf, bmheight, dest_pitch, | 219 GammaAdjust(pDestBuf, bmheight, dest_pitch, |
220 CFX_GEModule::Get()->GetTextGammaTable()); | 220 CFX_GEModule::Get()->GetTextGammaTable()); |
221 } | 221 } |
222 } | 222 } |
223 return pGlyphBitmap; | 223 return pGlyphBitmap; |
224 } | 224 } |
225 | 225 |
226 const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, | 226 const CFX_PathData* CFX_FaceCache::LoadGlyphPath(const CFX_Font* pFont, |
227 uint32_t glyph_index, | 227 uint32_t glyph_index, |
228 int dest_width) { | 228 int dest_width) { |
229 if (!m_Face || glyph_index == kInvalidGlyphIndex || dest_width < 0) | 229 if (!m_Face || glyph_index == kInvalidGlyphIndex || dest_width < 0) |
230 return nullptr; | 230 return nullptr; |
231 | 231 |
232 uint32_t key = glyph_index; | 232 uint32_t key = glyph_index; |
233 auto* pSubstFont = pFont->GetSubstFont(); | 233 auto* pSubstFont = pFont->GetSubstFont(); |
234 if (pSubstFont) { | 234 if (pSubstFont) { |
235 if (pSubstFont->m_Weight < 0 || pSubstFont->m_ItalicAngle < 0) | 235 if (pSubstFont->m_Weight < 0 || pSubstFont->m_ItalicAngle < 0) |
236 return nullptr; | 236 return nullptr; |
237 uint32_t weight = static_cast<uint32_t>(pSubstFont->m_Weight); | 237 uint32_t weight = static_cast<uint32_t>(pSubstFont->m_Weight); |
238 uint32_t angle = static_cast<uint32_t>(pSubstFont->m_ItalicAngle); | 238 uint32_t angle = static_cast<uint32_t>(pSubstFont->m_ItalicAngle); |
239 uint32_t key_modifier = (weight / 16) << 15; | 239 uint32_t key_modifier = (weight / 16) << 15; |
240 key_modifier += (angle / 2) << 21; | 240 key_modifier += (angle / 2) << 21; |
241 key_modifier += (static_cast<uint32_t>(dest_width) / 16) << 25; | 241 key_modifier += (static_cast<uint32_t>(dest_width) / 16) << 25; |
242 if (pFont->IsVertical()) | 242 if (pFont->IsVertical()) |
243 key_modifier += 1U << 31; | 243 key_modifier += 1U << 31; |
244 key += key_modifier; | 244 key += key_modifier; |
245 } | 245 } |
246 auto it = m_PathMap.find(key); | 246 auto it = m_PathMap.find(key); |
247 if (it != m_PathMap.end()) | 247 if (it != m_PathMap.end()) |
248 return it->second.get(); | 248 return it->second.get(); |
249 | 249 |
250 CFX_PathData* pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width); | 250 CFX_PathData* pGlyphPath = pFont->LoadGlyphPathImpl(glyph_index, dest_width); |
251 m_PathMap[key] = std::unique_ptr<CFX_PathData>(pGlyphPath); | 251 m_PathMap[key] = std::unique_ptr<CFX_PathData>(pGlyphPath); |
252 return pGlyphPath; | 252 return pGlyphPath; |
253 } | 253 } |
254 | 254 |
255 const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, | 255 const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(const CFX_Font* pFont, |
256 uint32_t glyph_index, | 256 uint32_t glyph_index, |
257 FX_BOOL bFontStyle, | 257 FX_BOOL bFontStyle, |
258 const CFX_Matrix* pMatrix, | 258 const CFX_Matrix* pMatrix, |
259 int dest_width, | 259 int dest_width, |
260 int anti_alias, | 260 int anti_alias, |
261 int& text_flags) { | 261 int& text_flags) { |
262 if (glyph_index == kInvalidGlyphIndex) | 262 if (glyph_index == kInvalidGlyphIndex) |
263 return nullptr; | 263 return nullptr; |
264 | 264 |
265 _CFX_UniqueKeyGen keygen; | 265 _CFX_UniqueKeyGen keygen; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 anti_alias); | 342 anti_alias); |
343 } | 343 } |
344 CFX_ByteString FaceGlyphsKey2(keygen.m_Key, keygen.m_KeyLen); | 344 CFX_ByteString FaceGlyphsKey2(keygen.m_Key, keygen.m_KeyLen); |
345 text_flags |= FXTEXT_NO_NATIVETEXT; | 345 text_flags |= FXTEXT_NO_NATIVETEXT; |
346 return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey2, glyph_index, | 346 return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey2, glyph_index, |
347 bFontStyle, dest_width, anti_alias); | 347 bFontStyle, dest_width, anti_alias); |
348 #endif | 348 #endif |
349 } | 349 } |
350 | 350 |
351 #ifdef _SKIA_SUPPORT_ | 351 #ifdef _SKIA_SUPPORT_ |
352 CFX_TypeFace* CFX_FaceCache::GetDeviceCache(CFX_Font* pFont) { | 352 CFX_TypeFace* CFX_FaceCache::GetDeviceCache(const CFX_Font* pFont) { |
353 if (!m_pTypeface) { | 353 if (!m_pTypeface) { |
354 m_pTypeface = | 354 m_pTypeface = |
355 SkTypeface::MakeFromStream( | 355 SkTypeface::MakeFromStream( |
356 new SkMemoryStream(pFont->GetFontData(), pFont->GetSize())) | 356 new SkMemoryStream(pFont->GetFontData(), pFont->GetSize())) |
357 .release(); | 357 .release(); |
358 } | 358 } |
359 return m_pTypeface; | 359 return m_pTypeface; |
360 } | 360 } |
361 #endif | 361 #endif |
362 | 362 |
363 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ | 363 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ |
364 void CFX_FaceCache::InitPlatform() {} | 364 void CFX_FaceCache::InitPlatform() {} |
365 #endif | 365 #endif |
366 | 366 |
367 CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap( | 367 CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap( |
368 CFX_Font* pFont, | 368 const CFX_Font* pFont, |
369 const CFX_Matrix* pMatrix, | 369 const CFX_Matrix* pMatrix, |
370 const CFX_ByteString& FaceGlyphsKey, | 370 const CFX_ByteString& FaceGlyphsKey, |
371 uint32_t glyph_index, | 371 uint32_t glyph_index, |
372 FX_BOOL bFontStyle, | 372 FX_BOOL bFontStyle, |
373 int dest_width, | 373 int dest_width, |
374 int anti_alias) { | 374 int anti_alias) { |
375 CFX_SizeGlyphCache* pSizeCache; | 375 CFX_SizeGlyphCache* pSizeCache; |
376 auto it = m_SizeMap.find(FaceGlyphsKey); | 376 auto it = m_SizeMap.find(FaceGlyphsKey); |
377 if (it == m_SizeMap.end()) { | 377 if (it == m_SizeMap.end()) { |
378 pSizeCache = new CFX_SizeGlyphCache; | 378 pSizeCache = new CFX_SizeGlyphCache; |
379 m_SizeMap[FaceGlyphsKey] = std::unique_ptr<CFX_SizeGlyphCache>(pSizeCache); | 379 m_SizeMap[FaceGlyphsKey] = std::unique_ptr<CFX_SizeGlyphCache>(pSizeCache); |
380 } else { | 380 } else { |
381 pSizeCache = it->second.get(); | 381 pSizeCache = it->second.get(); |
382 } | 382 } |
383 auto it2 = pSizeCache->m_GlyphMap.find(glyph_index); | 383 auto it2 = pSizeCache->m_GlyphMap.find(glyph_index); |
384 if (it2 != pSizeCache->m_GlyphMap.end()) | 384 if (it2 != pSizeCache->m_GlyphMap.end()) |
385 return it2->second; | 385 return it2->second; |
386 | 386 |
387 CFX_GlyphBitmap* pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, | 387 CFX_GlyphBitmap* pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, |
388 pMatrix, dest_width, anti_alias); | 388 pMatrix, dest_width, anti_alias); |
389 pSizeCache->m_GlyphMap[glyph_index] = pGlyphBitmap; | 389 pSizeCache->m_GlyphMap[glyph_index] = pGlyphBitmap; |
390 return pGlyphBitmap; | 390 return pGlyphBitmap; |
391 } | 391 } |
OLD | NEW |