OLD | NEW |
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 "render_int.h" | 7 #include "render_int.h" |
8 | 8 |
9 #include "core/include/fpdfapi/fpdf_pageobj.h" | 9 #include "core/include/fpdfapi/fpdf_pageobj.h" |
10 #include "core/include/fpdfapi/fpdf_render.h" | 10 #include "core/include/fpdfapi/fpdf_render.h" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 top = top_line; | 156 top = top_line; |
157 if (image_matrix.a < 0) { | 157 if (image_matrix.a < 0) { |
158 image_matrix.Scale(retinaScaleX, retinaScaleY); | 158 image_matrix.Scale(retinaScaleX, retinaScaleY); |
159 left = FXSYS_round(image_matrix.e + image_matrix.a); | 159 left = FXSYS_round(image_matrix.e + image_matrix.a); |
160 } else { | 160 } else { |
161 left = FXSYS_round(image_matrix.e); | 161 left = FXSYS_round(image_matrix.e); |
162 } | 162 } |
163 } else { | 163 } else { |
164 } | 164 } |
165 } | 165 } |
166 if (pResBitmap == NULL) { | 166 if (!pResBitmap) { |
167 image_matrix.Scale(retinaScaleX, retinaScaleY); | 167 image_matrix.Scale(retinaScaleX, retinaScaleY); |
168 pResBitmap = pBitmap->TransformTo(&image_matrix, left, top); | 168 pResBitmap = pBitmap->TransformTo(&image_matrix, left, top); |
169 } | 169 } |
170 if (pResBitmap == NULL) { | 170 if (!pResBitmap) { |
171 return NULL; | 171 return NULL; |
172 } | 172 } |
173 CFX_GlyphBitmap* pGlyph = new CFX_GlyphBitmap; | 173 CFX_GlyphBitmap* pGlyph = new CFX_GlyphBitmap; |
174 pGlyph->m_Left = left; | 174 pGlyph->m_Left = left; |
175 pGlyph->m_Top = -top; | 175 pGlyph->m_Top = -top; |
176 pGlyph->m_Bitmap.TakeOver(pResBitmap); | 176 pGlyph->m_Bitmap.TakeOver(pResBitmap); |
177 delete pResBitmap; | 177 delete pResBitmap; |
178 return pGlyph; | 178 return pGlyph; |
179 } | 179 } |
180 void _CPDF_UniqueKeyGen::Generate(int count, ...) { | 180 void _CPDF_UniqueKeyGen::Generate(int count, ...) { |
(...skipping 24 matching lines...) Expand all Loading... |
205 if (pClippingPath) { | 205 if (pClippingPath) { |
206 bClip = TRUE; | 206 bClip = TRUE; |
207 } else { | 207 } else { |
208 switch (text_render_mode) { | 208 switch (text_render_mode) { |
209 case 0: | 209 case 0: |
210 case 4: | 210 case 4: |
211 bFill = TRUE; | 211 bFill = TRUE; |
212 break; | 212 break; |
213 case 1: | 213 case 1: |
214 case 5: | 214 case 5: |
215 if (pFont->GetFace() == NULL && | 215 if (!pFont->GetFace() && |
216 !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) { | 216 !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) { |
217 bFill = TRUE; | 217 bFill = TRUE; |
218 } else { | 218 } else { |
219 bStroke = TRUE; | 219 bStroke = TRUE; |
220 } | 220 } |
221 break; | 221 break; |
222 case 2: | 222 case 2: |
223 case 6: | 223 case 6: |
224 if (pFont->GetFace() == NULL && | 224 if (!pFont->GetFace() && |
225 !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) { | 225 !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) { |
226 bFill = TRUE; | 226 bFill = TRUE; |
227 } else { | 227 } else { |
228 bFill = bStroke = TRUE; | 228 bFill = bStroke = TRUE; |
229 } | 229 } |
230 break; | 230 break; |
231 case 3: | 231 case 3: |
232 case 7: | 232 case 7: |
233 return TRUE; | 233 return TRUE; |
234 default: | 234 default: |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, | 292 m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, |
293 textobj->m_pCharPos, pFont, font_size, &text_matrix, pDeviceMatrix, | 293 textobj->m_pCharPos, pFont, font_size, &text_matrix, pDeviceMatrix, |
294 textobj->m_GraphState, fill_argb, stroke_argb, pClippingPath, flag); | 294 textobj->m_GraphState, fill_argb, stroke_argb, pClippingPath, flag); |
295 } | 295 } |
296 text_matrix.Concat(*pObj2Device); | 296 text_matrix.Concat(*pObj2Device); |
297 return CPDF_TextRenderer::DrawNormalText( | 297 return CPDF_TextRenderer::DrawNormalText( |
298 m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, | 298 m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, |
299 pFont, font_size, &text_matrix, fill_argb, &m_Options); | 299 pFont, font_size, &text_matrix, fill_argb, &m_Options); |
300 } | 300 } |
301 CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont) { | 301 CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont) { |
302 if (pFont->m_pDocument == NULL) { | 302 if (!pFont->m_pDocument) { |
303 return NULL; | 303 return NULL; |
304 } | 304 } |
305 pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict(), FALSE); | 305 pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict(), FALSE); |
306 return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont); | 306 return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont); |
307 } | 307 } |
308 static void ReleaseCachedType3(CPDF_Type3Font* pFont) { | 308 static void ReleaseCachedType3(CPDF_Type3Font* pFont) { |
309 if (pFont->m_pDocument == NULL) { | 309 if (!pFont->m_pDocument) { |
310 return; | 310 return; |
311 } | 311 } |
312 pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont); | 312 pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont); |
313 pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict()); | 313 pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict()); |
314 } | 314 } |
315 FX_BOOL CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext) { | 315 FX_BOOL CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext) { |
316 if (m_pBitmap || m_pForm == NULL) { | 316 if (m_pBitmap || !m_pForm) { |
317 return TRUE; | 317 return TRUE; |
318 } | 318 } |
319 if (m_pForm->CountObjects() == 1 && !m_bColored) { | 319 if (m_pForm->CountObjects() == 1 && !m_bColored) { |
320 CPDF_PageObject* pPageObj = | 320 CPDF_PageObject* pPageObj = |
321 m_pForm->GetObjectAt(m_pForm->GetFirstObjectPosition()); | 321 m_pForm->GetObjectAt(m_pForm->GetFirstObjectPosition()); |
322 if (pPageObj->m_Type == PDFPAGE_IMAGE) { | 322 if (pPageObj->m_Type == PDFPAGE_IMAGE) { |
323 CPDF_ImageObject* pImage = (CPDF_ImageObject*)pPageObj; | 323 CPDF_ImageObject* pImage = (CPDF_ImageObject*)pPageObj; |
324 m_ImageMatrix = pImage->m_Matrix; | 324 m_ImageMatrix = pImage->m_Matrix; |
325 const CFX_DIBSource* pSource = pImage->m_pImage->LoadDIBSource(); | 325 const CFX_DIBSource* pSource = pImage->m_pImage->LoadDIBSource(); |
326 if (pSource) { | 326 if (pSource) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 FX_DWORD* pChars = textobj->m_pCharCodes; | 376 FX_DWORD* pChars = textobj->m_pCharCodes; |
377 if (textobj->m_nChars == 1) { | 377 if (textobj->m_nChars == 1) { |
378 pChars = (FX_DWORD*)(&textobj->m_pCharCodes); | 378 pChars = (FX_DWORD*)(&textobj->m_pCharCodes); |
379 } | 379 } |
380 for (int iChar = 0; iChar < textobj->m_nChars; iChar++) { | 380 for (int iChar = 0; iChar < textobj->m_nChars; iChar++) { |
381 FX_DWORD charcode = pChars[iChar]; | 381 FX_DWORD charcode = pChars[iChar]; |
382 if (charcode == (FX_DWORD)-1) { | 382 if (charcode == (FX_DWORD)-1) { |
383 continue; | 383 continue; |
384 } | 384 } |
385 CPDF_Type3Char* pType3Char = pType3Font->LoadChar(charcode); | 385 CPDF_Type3Char* pType3Char = pType3Font->LoadChar(charcode); |
386 if (pType3Char == NULL) { | 386 if (!pType3Char) { |
387 continue; | 387 continue; |
388 } | 388 } |
389 CFX_Matrix matrix = char_matrix; | 389 CFX_Matrix matrix = char_matrix; |
390 matrix.e += iChar ? textobj->m_pCharPos[iChar - 1] : 0; | 390 matrix.e += iChar ? textobj->m_pCharPos[iChar - 1] : 0; |
391 matrix.Concat(text_matrix); | 391 matrix.Concat(text_matrix); |
392 matrix.Concat(*pObj2Device); | 392 matrix.Concat(*pObj2Device); |
393 if (!pType3Char->LoadBitmap(m_pContext)) { | 393 if (!pType3Char->LoadBitmap(m_pContext)) { |
394 if (pGlyphAndPos) { | 394 if (pGlyphAndPos) { |
395 for (int i = 0; i < iChar; i++) { | 395 for (int i = 0; i < iChar; i++) { |
396 FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[i]; | 396 FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[i]; |
397 if (glyph.m_pGlyph == NULL) { | 397 if (!glyph.m_pGlyph) { |
398 continue; | 398 continue; |
399 } | 399 } |
400 m_pDevice->SetBitMask(&glyph.m_pGlyph->m_Bitmap, | 400 m_pDevice->SetBitMask(&glyph.m_pGlyph->m_Bitmap, |
401 glyph.m_OriginX + glyph.m_pGlyph->m_Left, | 401 glyph.m_OriginX + glyph.m_pGlyph->m_Left, |
402 glyph.m_OriginY - glyph.m_pGlyph->m_Top, | 402 glyph.m_OriginY - glyph.m_pGlyph->m_Top, |
403 fill_argb); | 403 fill_argb); |
404 } | 404 } |
405 FX_Free(pGlyphAndPos); | 405 FX_Free(pGlyphAndPos); |
406 pGlyphAndPos = NULL; | 406 pGlyphAndPos = NULL; |
407 } | 407 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 matrix.Scale(sa, sd); | 445 matrix.Scale(sa, sd); |
446 status.RenderObjectList(pType3Char->m_pForm, &matrix); | 446 status.RenderObjectList(pType3Char->m_pForm, &matrix); |
447 m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top); | 447 m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top); |
448 } | 448 } |
449 delete pStates; | 449 delete pStates; |
450 } else if (pType3Char->m_pBitmap) { | 450 } else if (pType3Char->m_pBitmap) { |
451 if (device_class == FXDC_DISPLAY) { | 451 if (device_class == FXDC_DISPLAY) { |
452 CPDF_Type3Cache* pCache = GetCachedType3(pType3Font); | 452 CPDF_Type3Cache* pCache = GetCachedType3(pType3Font); |
453 refTypeCache.m_dwCount++; | 453 refTypeCache.m_dwCount++; |
454 CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd); | 454 CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd); |
455 if (pBitmap == NULL) { | 455 if (!pBitmap) { |
456 continue; | 456 continue; |
457 } | 457 } |
458 int origin_x = FXSYS_round(matrix.e); | 458 int origin_x = FXSYS_round(matrix.e); |
459 int origin_y = FXSYS_round(matrix.f); | 459 int origin_y = FXSYS_round(matrix.f); |
460 if (pGlyphAndPos) { | 460 if (pGlyphAndPos) { |
461 pGlyphAndPos[iChar].m_pGlyph = pBitmap; | 461 pGlyphAndPos[iChar].m_pGlyph = pBitmap; |
462 pGlyphAndPos[iChar].m_OriginX = origin_x; | 462 pGlyphAndPos[iChar].m_OriginX = origin_x; |
463 pGlyphAndPos[iChar].m_OriginY = origin_y; | 463 pGlyphAndPos[iChar].m_OriginY = origin_y; |
464 } else { | 464 } else { |
465 m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, | 465 m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, |
(...skipping 18 matching lines...) Expand all Loading... |
484 FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd); | 484 FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd); |
485 CFX_DIBitmap bitmap; | 485 CFX_DIBitmap bitmap; |
486 if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), | 486 if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), |
487 FXDIB_8bppMask)) { | 487 FXDIB_8bppMask)) { |
488 FX_Free(pGlyphAndPos); | 488 FX_Free(pGlyphAndPos); |
489 return TRUE; | 489 return TRUE; |
490 } | 490 } |
491 bitmap.Clear(0); | 491 bitmap.Clear(0); |
492 for (int iChar = 0; iChar < textobj->m_nChars; iChar++) { | 492 for (int iChar = 0; iChar < textobj->m_nChars; iChar++) { |
493 FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar]; | 493 FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar]; |
494 if (glyph.m_pGlyph == NULL) { | 494 if (!glyph.m_pGlyph) { |
495 continue; | 495 continue; |
496 } | 496 } |
497 bitmap.TransferBitmap( | 497 bitmap.TransferBitmap( |
498 (int)((glyph.m_OriginX + glyph.m_pGlyph->m_Left - rect.left) * sa), | 498 (int)((glyph.m_OriginX + glyph.m_pGlyph->m_Left - rect.left) * sa), |
499 (int)((glyph.m_OriginY - glyph.m_pGlyph->m_Top - rect.top) * sd), | 499 (int)((glyph.m_OriginY - glyph.m_pGlyph->m_Top - rect.top) * sd), |
500 glyph.m_pGlyph->m_Bitmap.GetWidth(), | 500 glyph.m_pGlyph->m_Bitmap.GetWidth(), |
501 glyph.m_pGlyph->m_Bitmap.GetHeight(), &glyph.m_pGlyph->m_Bitmap, 0, | 501 glyph.m_pGlyph->m_Bitmap.GetHeight(), &glyph.m_pGlyph->m_Bitmap, 0, |
502 0); | 502 0); |
503 } | 503 } |
504 m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb); | 504 m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode); | 550 charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode); |
551 #endif | 551 #endif |
552 if (!pFont->IsEmbedded() && pFont->GetFontType() != PDFFONT_CIDFONT) { | 552 if (!pFont->IsEmbedded() && pFont->GetFontType() != PDFFONT_CIDFONT) { |
553 charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode); | 553 charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode); |
554 } else { | 554 } else { |
555 charpos.m_FontCharWidth = 0; | 555 charpos.m_FontCharWidth = 0; |
556 } | 556 } |
557 charpos.m_OriginX = iChar ? pCharPos[iChar - 1] : 0; | 557 charpos.m_OriginX = iChar ? pCharPos[iChar - 1] : 0; |
558 charpos.m_OriginY = 0; | 558 charpos.m_OriginY = 0; |
559 charpos.m_bGlyphAdjust = FALSE; | 559 charpos.m_bGlyphAdjust = FALSE; |
560 if (pCIDFont == NULL) { | 560 if (!pCIDFont) { |
561 continue; | 561 continue; |
562 } | 562 } |
563 FX_WORD CID = pCIDFont->CIDFromCharCode(CharCode); | 563 FX_WORD CID = pCIDFont->CIDFromCharCode(CharCode); |
564 if (bVertWriting) { | 564 if (bVertWriting) { |
565 charpos.m_OriginY = charpos.m_OriginX; | 565 charpos.m_OriginY = charpos.m_OriginX; |
566 charpos.m_OriginX = 0; | 566 charpos.m_OriginX = 0; |
567 short vx, vy; | 567 short vx, vy; |
568 pCIDFont->GetVertOrigin(CID, vx, vy); | 568 pCIDFont->GetVertOrigin(CID, vx, vy); |
569 charpos.m_OriginX -= FontSize * vx / 1000; | 569 charpos.m_OriginX -= FontSize * vx / 1000; |
570 charpos.m_OriginY -= FontSize * vy / 1000; | 570 charpos.m_OriginY -= FontSize * vy / 1000; |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 } | 755 } |
756 CFX_FaceCache* pFaceCache = pCache->GetCachedFace(&pFont->m_Font); | 756 CFX_FaceCache* pFaceCache = pCache->GetCachedFace(&pFont->m_Font); |
757 FX_FONTCACHE_DEFINE(pCache, &pFont->m_Font); | 757 FX_FONTCACHE_DEFINE(pCache, &pFont->m_Font); |
758 CPDF_CharPosList CharPosList; | 758 CPDF_CharPosList CharPosList; |
759 CharPosList.Load(textobj->m_nChars, textobj->m_pCharCodes, | 759 CharPosList.Load(textobj->m_nChars, textobj->m_pCharCodes, |
760 textobj->m_pCharPos, pFont, font_size); | 760 textobj->m_pCharPos, pFont, font_size); |
761 for (FX_DWORD i = 0; i < CharPosList.m_nChars; i++) { | 761 for (FX_DWORD i = 0; i < CharPosList.m_nChars; i++) { |
762 FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i]; | 762 FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i]; |
763 const CFX_PathData* pPath = pFaceCache->LoadGlyphPath( | 763 const CFX_PathData* pPath = pFaceCache->LoadGlyphPath( |
764 &pFont->m_Font, charpos.m_GlyphIndex, charpos.m_FontCharWidth); | 764 &pFont->m_Font, charpos.m_GlyphIndex, charpos.m_FontCharWidth); |
765 if (pPath == NULL) { | 765 if (!pPath) { |
766 continue; | 766 continue; |
767 } | 767 } |
768 CPDF_PathObject path; | 768 CPDF_PathObject path; |
769 path.m_GraphState = textobj->m_GraphState; | 769 path.m_GraphState = textobj->m_GraphState; |
770 path.m_ColorState = textobj->m_ColorState; | 770 path.m_ColorState = textobj->m_ColorState; |
771 CFX_Matrix matrix; | 771 CFX_Matrix matrix; |
772 if (charpos.m_bGlyphAdjust) | 772 if (charpos.m_bGlyphAdjust) |
773 matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], | 773 matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], |
774 charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0); | 774 charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0); |
775 matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, | 775 matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, |
776 charpos.m_OriginY); | 776 charpos.m_OriginY); |
777 path.m_Path.New()->Append(pPath, &matrix); | 777 path.m_Path.New()->Append(pPath, &matrix); |
778 path.m_Matrix = *pTextMatrix; | 778 path.m_Matrix = *pTextMatrix; |
779 path.m_bStroke = bStroke; | 779 path.m_bStroke = bStroke; |
780 path.m_FillType = bFill ? FXFILL_WINDING : 0; | 780 path.m_FillType = bFill ? FXFILL_WINDING : 0; |
781 path.CalcBoundingBox(); | 781 path.CalcBoundingBox(); |
782 ProcessPath(&path, pObj2Device); | 782 ProcessPath(&path, pObj2Device); |
783 } | 783 } |
784 } | 784 } |
785 | 785 |
786 CFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width) { | 786 CFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width) { |
787 int glyph_index = GlyphFromCharCode(charcode); | 787 int glyph_index = GlyphFromCharCode(charcode); |
788 if (!m_Font.GetFace()) | 788 if (!m_Font.GetFace()) |
789 return nullptr; | 789 return nullptr; |
790 return m_Font.LoadGlyphPath(glyph_index, dest_width); | 790 return m_Font.LoadGlyphPath(glyph_index, dest_width); |
791 } | 791 } |
OLD | NEW |