| 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 "core/fpdfapi/fpdf_render/render_int.h" | 7 #include "core/fpdfapi/fpdf_render/render_int.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_font/cpdf_cidfont.h" | 9 #include "core/fpdfapi/fpdf_font/cpdf_cidfont.h" |
| 10 #include "core/fpdfapi/fpdf_font/cpdf_type3char.h" | 10 #include "core/fpdfapi/fpdf_font/cpdf_type3char.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 } | 142 } |
| 143 } else { | 143 } else { |
| 144 if (_IsScanLine8bpp(pBuf + line * pitch, width)) { | 144 if (_IsScanLine8bpp(pBuf + line * pitch, width)) { |
| 145 return line; | 145 return line; |
| 146 } | 146 } |
| 147 } | 147 } |
| 148 line += line_step; | 148 line += line_step; |
| 149 } | 149 } |
| 150 return -1; | 150 return -1; |
| 151 } | 151 } |
| 152 |
| 152 CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, | 153 CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, |
| 153 uint32_t charcode, | 154 uint32_t charcode, |
| 154 const CFX_Matrix* pMatrix, | 155 const CFX_Matrix* pMatrix, |
| 155 FX_FLOAT retinaScaleX, | 156 FX_FLOAT retinaScaleX, |
| 156 FX_FLOAT retinaScaleY) { | 157 FX_FLOAT retinaScaleY) { |
| 157 const CPDF_Type3Char* pChar = m_pFont->LoadChar(charcode); | 158 const CPDF_Type3Char* pChar = m_pFont->LoadChar(charcode); |
| 158 if (!pChar || !pChar->m_pBitmap) | 159 if (!pChar || !pChar->m_pBitmap) |
| 159 return nullptr; | 160 return nullptr; |
| 160 | 161 |
| 161 CFX_DIBitmap* pBitmap = pChar->m_pBitmap; | 162 CFX_DIBitmap* pBitmap = pChar->m_pBitmap.get(); |
| 162 CFX_Matrix image_matrix, text_matrix; | 163 CFX_Matrix image_matrix, text_matrix; |
| 163 image_matrix = pChar->m_ImageMatrix; | 164 image_matrix = pChar->m_ImageMatrix; |
| 164 text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0); | 165 text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0); |
| 165 image_matrix.Concat(text_matrix); | 166 image_matrix.Concat(text_matrix); |
| 166 CFX_DIBitmap* pResBitmap = NULL; | 167 std::unique_ptr<CFX_DIBitmap> pResBitmap; |
| 167 int left = 0; | 168 int left = 0; |
| 168 int top = 0; | 169 int top = 0; |
| 169 if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && | 170 if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && |
| 170 FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) { | 171 FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) { |
| 171 int top_line = _DetectFirstLastScan(pBitmap, TRUE); | 172 int top_line = _DetectFirstLastScan(pBitmap, TRUE); |
| 172 int bottom_line = _DetectFirstLastScan(pBitmap, FALSE); | 173 int bottom_line = _DetectFirstLastScan(pBitmap, FALSE); |
| 173 if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) { | 174 if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) { |
| 174 FX_FLOAT top_y = image_matrix.d + image_matrix.f; | 175 FX_FLOAT top_y = image_matrix.d + image_matrix.f; |
| 175 FX_FLOAT bottom_y = image_matrix.f; | 176 FX_FLOAT bottom_y = image_matrix.f; |
| 176 FX_BOOL bFlipped = top_y > bottom_y; | 177 FX_BOOL bFlipped = top_y > bottom_y; |
| 177 if (bFlipped) { | 178 if (bFlipped) { |
| 178 FX_FLOAT temp = top_y; | 179 FX_FLOAT temp = top_y; |
| 179 top_y = bottom_y; | 180 top_y = bottom_y; |
| 180 bottom_y = temp; | 181 bottom_y = temp; |
| 181 } | 182 } |
| 182 pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line); | 183 pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line); |
| 183 pResBitmap = pBitmap->StretchTo( | 184 pResBitmap.reset(pBitmap->StretchTo( |
| 184 (int)(FXSYS_round(image_matrix.a) * retinaScaleX), | 185 (int)(FXSYS_round(image_matrix.a) * retinaScaleX), |
| 185 (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * | 186 (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * |
| 186 retinaScaleY)); | 187 retinaScaleY))); |
| 187 top = top_line; | 188 top = top_line; |
| 188 if (image_matrix.a < 0) { | 189 if (image_matrix.a < 0) { |
| 189 image_matrix.Scale(retinaScaleX, retinaScaleY); | 190 image_matrix.Scale(retinaScaleX, retinaScaleY); |
| 190 left = FXSYS_round(image_matrix.e + image_matrix.a); | 191 left = FXSYS_round(image_matrix.e + image_matrix.a); |
| 191 } else { | 192 } else { |
| 192 left = FXSYS_round(image_matrix.e); | 193 left = FXSYS_round(image_matrix.e); |
| 193 } | 194 } |
| 194 } | 195 } |
| 195 } | 196 } |
| 196 if (!pResBitmap) { | 197 if (!pResBitmap) { |
| 197 image_matrix.Scale(retinaScaleX, retinaScaleY); | 198 image_matrix.Scale(retinaScaleX, retinaScaleY); |
| 198 pResBitmap = pBitmap->TransformTo(&image_matrix, left, top); | 199 pResBitmap.reset(pBitmap->TransformTo(&image_matrix, left, top)); |
| 199 } | 200 } |
| 200 if (!pResBitmap) { | 201 if (!pResBitmap) |
| 201 return NULL; | 202 return nullptr; |
| 202 } | 203 |
| 203 CFX_GlyphBitmap* pGlyph = new CFX_GlyphBitmap; | 204 CFX_GlyphBitmap* pGlyph = new CFX_GlyphBitmap; |
| 204 pGlyph->m_Left = left; | 205 pGlyph->m_Left = left; |
| 205 pGlyph->m_Top = -top; | 206 pGlyph->m_Top = -top; |
| 206 pGlyph->m_Bitmap.TakeOver(pResBitmap); | 207 pGlyph->m_Bitmap.TakeOver(pResBitmap.get()); |
| 207 delete pResBitmap; | |
| 208 return pGlyph; | 208 return pGlyph; |
| 209 } | 209 } |
| 210 | 210 |
| 211 FX_BOOL CPDF_RenderStatus::ProcessText(const CPDF_TextObject* textobj, | 211 FX_BOOL CPDF_RenderStatus::ProcessText(const CPDF_TextObject* textobj, |
| 212 const CFX_Matrix* pObj2Device, | 212 const CFX_Matrix* pObj2Device, |
| 213 CFX_PathData* pClippingPath) { | 213 CFX_PathData* pClippingPath) { |
| 214 if (textobj->m_nChars == 0) { | 214 if (textobj->m_nChars == 0) { |
| 215 return TRUE; | 215 return TRUE; |
| 216 } | 216 } |
| 217 int text_render_mode = textobj->m_TextState.GetObject()->m_TextMode; | 217 int text_render_mode = textobj->m_TextState.GetObject()->m_TextMode; |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 } | 416 } |
| 417 if (fill_alpha == 255) { | 417 if (fill_alpha == 255) { |
| 418 CPDF_RenderStatus status; | 418 CPDF_RenderStatus status; |
| 419 status.Initialize(m_pContext, m_pDevice, NULL, NULL, this, pStates, | 419 status.Initialize(m_pContext, m_pDevice, NULL, NULL, this, pStates, |
| 420 &Options, pType3Char->m_pForm->m_Transparency, | 420 &Options, pType3Char->m_pForm->m_Transparency, |
| 421 m_bDropObjects, pFormResource, FALSE, pType3Char, | 421 m_bDropObjects, pFormResource, FALSE, pType3Char, |
| 422 fill_argb); | 422 fill_argb); |
| 423 status.m_Type3FontCache.Append(m_Type3FontCache); | 423 status.m_Type3FontCache.Append(m_Type3FontCache); |
| 424 status.m_Type3FontCache.Add(pType3Font); | 424 status.m_Type3FontCache.Add(pType3Font); |
| 425 m_pDevice->SaveState(); | 425 m_pDevice->SaveState(); |
| 426 status.RenderObjectList(pType3Char->m_pForm, &matrix); | 426 status.RenderObjectList(pType3Char->m_pForm.get(), &matrix); |
| 427 m_pDevice->RestoreState(); | 427 m_pDevice->RestoreState(); |
| 428 } else { | 428 } else { |
| 429 CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox(); | 429 CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox(); |
| 430 rect_f.Transform(&matrix); | 430 rect_f.Transform(&matrix); |
| 431 FX_RECT rect = rect_f.GetOutterRect(); | 431 FX_RECT rect = rect_f.GetOutterRect(); |
| 432 CFX_FxgeDevice bitmap_device; | 432 CFX_FxgeDevice bitmap_device; |
| 433 if (!bitmap_device.Create((int)(rect.Width() * sa), | 433 if (!bitmap_device.Create((int)(rect.Width() * sa), |
| 434 (int)(rect.Height() * sd), FXDIB_Argb)) { | 434 (int)(rect.Height() * sd), FXDIB_Argb)) { |
| 435 return TRUE; | 435 return TRUE; |
| 436 } | 436 } |
| 437 bitmap_device.GetBitmap()->Clear(0); | 437 bitmap_device.GetBitmap()->Clear(0); |
| 438 CPDF_RenderStatus status; | 438 CPDF_RenderStatus status; |
| 439 status.Initialize(m_pContext, &bitmap_device, NULL, NULL, this, pStates, | 439 status.Initialize(m_pContext, &bitmap_device, NULL, NULL, this, pStates, |
| 440 &Options, pType3Char->m_pForm->m_Transparency, | 440 &Options, pType3Char->m_pForm->m_Transparency, |
| 441 m_bDropObjects, pFormResource, FALSE, pType3Char, | 441 m_bDropObjects, pFormResource, FALSE, pType3Char, |
| 442 fill_argb); | 442 fill_argb); |
| 443 status.m_Type3FontCache.Append(m_Type3FontCache); | 443 status.m_Type3FontCache.Append(m_Type3FontCache); |
| 444 status.m_Type3FontCache.Add(pType3Font); | 444 status.m_Type3FontCache.Add(pType3Font); |
| 445 matrix.TranslateI(-rect.left, -rect.top); | 445 matrix.TranslateI(-rect.left, -rect.top); |
| 446 matrix.Scale(sa, sd); | 446 matrix.Scale(sa, sd); |
| 447 status.RenderObjectList(pType3Char->m_pForm, &matrix); | 447 status.RenderObjectList(pType3Char->m_pForm.get(), &matrix); |
| 448 m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top); | 448 m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top); |
| 449 } | 449 } |
| 450 delete pStates; | 450 delete pStates; |
| 451 } else if (pType3Char->m_pBitmap) { | 451 } else if (pType3Char->m_pBitmap) { |
| 452 if (device_class == FXDC_DISPLAY) { | 452 if (device_class == FXDC_DISPLAY) { |
| 453 CPDF_Type3Cache* pCache = GetCachedType3(pType3Font); | 453 CPDF_Type3Cache* pCache = GetCachedType3(pType3Font); |
| 454 refTypeCache.m_dwCount++; | 454 refTypeCache.m_dwCount++; |
| 455 CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd); | 455 CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd); |
| 456 if (!pBitmap) { | 456 if (!pBitmap) { |
| 457 continue; | 457 continue; |
| 458 } | 458 } |
| 459 int origin_x = FXSYS_round(matrix.e); | 459 int origin_x = FXSYS_round(matrix.e); |
| 460 int origin_y = FXSYS_round(matrix.f); | 460 int origin_y = FXSYS_round(matrix.f); |
| 461 if (pGlyphAndPos) { | 461 if (pGlyphAndPos) { |
| 462 pGlyphAndPos[iChar].m_pGlyph = pBitmap; | 462 pGlyphAndPos[iChar].m_pGlyph = pBitmap; |
| 463 pGlyphAndPos[iChar].m_OriginX = origin_x; | 463 pGlyphAndPos[iChar].m_OriginX = origin_x; |
| 464 pGlyphAndPos[iChar].m_OriginY = origin_y; | 464 pGlyphAndPos[iChar].m_OriginY = origin_y; |
| 465 } else { | 465 } else { |
| 466 m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, | 466 m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, |
| 467 origin_y - pBitmap->m_Top, fill_argb); | 467 origin_y - pBitmap->m_Top, fill_argb); |
| 468 } | 468 } |
| 469 } else { | 469 } else { |
| 470 CFX_Matrix image_matrix = pType3Char->m_ImageMatrix; | 470 CFX_Matrix image_matrix = pType3Char->m_ImageMatrix; |
| 471 image_matrix.Concat(matrix); | 471 image_matrix.Concat(matrix); |
| 472 CPDF_ImageRenderer renderer; | 472 CPDF_ImageRenderer renderer; |
| 473 if (renderer.Start(this, pType3Char->m_pBitmap, fill_argb, 255, | 473 if (renderer.Start(this, pType3Char->m_pBitmap.get(), fill_argb, 255, |
| 474 &image_matrix, 0, FALSE)) { | 474 &image_matrix, 0, FALSE)) { |
| 475 renderer.Continue(NULL); | 475 renderer.Continue(nullptr); |
| 476 } | 476 } |
| 477 if (!renderer.m_Result) { | 477 if (!renderer.m_Result) |
| 478 return FALSE; | 478 return FALSE; |
| 479 } | |
| 480 } | 479 } |
| 481 } | 480 } |
| 482 } | 481 } |
| 483 if (pGlyphAndPos) { | 482 if (pGlyphAndPos) { |
| 484 FX_RECT rect = | 483 FX_RECT rect = |
| 485 FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd); | 484 FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd); |
| 486 CFX_DIBitmap bitmap; | 485 CFX_DIBitmap bitmap; |
| 487 if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), | 486 if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), |
| 488 FXDIB_8bppMask)) { | 487 FXDIB_8bppMask)) { |
| 489 FX_Free(pGlyphAndPos); | 488 FX_Free(pGlyphAndPos); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, | 777 matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, |
| 779 charpos.m_OriginY); | 778 charpos.m_OriginY); |
| 780 path.m_Path.New()->Append(pPath, &matrix); | 779 path.m_Path.New()->Append(pPath, &matrix); |
| 781 path.m_Matrix = *pTextMatrix; | 780 path.m_Matrix = *pTextMatrix; |
| 782 path.m_bStroke = bStroke; | 781 path.m_bStroke = bStroke; |
| 783 path.m_FillType = bFill ? FXFILL_WINDING : 0; | 782 path.m_FillType = bFill ? FXFILL_WINDING : 0; |
| 784 path.CalcBoundingBox(); | 783 path.CalcBoundingBox(); |
| 785 ProcessPath(&path, pObj2Device); | 784 ProcessPath(&path, pObj2Device); |
| 786 } | 785 } |
| 787 } | 786 } |
| OLD | NEW |