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

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

Issue 2350763002: Revert of Pdfium: Fix fonts leaking on ClosePage. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: Created 4 years, 3 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
« no previous file with comments | « core/fxge/ge/cfx_fontcache.cpp ('k') | core/fxge/ifx_renderdevicedriver.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_renderdevice.h" 7 #include "core/fxge/include/cfx_renderdevice.h"
8 8
9 #include "core/fxcrt/include/fx_safe_types.h" 9 #include "core/fxcrt/include/fx_safe_types.h"
10 #include "core/fxge/include/cfx_autofontcache.h" 10 #include "core/fxge/include/cfx_autofontcache.h"
11 #include "core/fxge/include/cfx_facecache.h" 11 #include "core/fxge/include/cfx_facecache.h"
12 #include "core/fxge/include/cfx_fontcache.h"
12 #include "core/fxge/include/cfx_fxgedevice.h" 13 #include "core/fxge/include/cfx_fxgedevice.h"
13 #include "core/fxge/include/cfx_graphstatedata.h" 14 #include "core/fxge/include/cfx_graphstatedata.h"
14 #include "core/fxge/include/cfx_pathdata.h" 15 #include "core/fxge/include/cfx_pathdata.h"
15 #include "core/fxge/include/ifx_renderdevicedriver.h" 16 #include "core/fxge/include/ifx_renderdevicedriver.h"
16 17
17 #if defined _SKIA_SUPPORT_ 18 #if defined _SKIA_SUPPORT_
18 #include "third_party/skia/include/core/SkTypes.h" 19 #include "third_party/skia/include/core/SkTypes.h"
19 #endif 20 #endif
20 21
21 namespace { 22 namespace {
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 int bitmap_alpha, 817 int bitmap_alpha,
817 int blend_type) { 818 int blend_type) {
818 return m_pDeviceDriver->SetBitsWithMask(pBitmap, pMask, left, top, 819 return m_pDeviceDriver->SetBitsWithMask(pBitmap, pMask, left, top,
819 bitmap_alpha, blend_type); 820 bitmap_alpha, blend_type);
820 } 821 }
821 #endif 822 #endif
822 823
823 FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, 824 FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars,
824 const FXTEXT_CHARPOS* pCharPos, 825 const FXTEXT_CHARPOS* pCharPos,
825 CFX_Font* pFont, 826 CFX_Font* pFont,
827 CFX_FontCache* pCache,
826 FX_FLOAT font_size, 828 FX_FLOAT font_size,
827 const CFX_Matrix* pText2Device, 829 const CFX_Matrix* pText2Device,
828 uint32_t fill_color, 830 uint32_t fill_color,
829 uint32_t text_flags) { 831 uint32_t text_flags) {
830 int nativetext_flags = text_flags; 832 int nativetext_flags = text_flags;
831 if (m_DeviceClass != FXDC_DISPLAY) { 833 if (m_DeviceClass != FXDC_DISPLAY) {
832 if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) { 834 if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) {
833 if (ShouldDrawDeviceText(pFont, text_flags) && 835 if (ShouldDrawDeviceText(pFont, text_flags) &&
834 m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pText2Device, 836 m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache,
835 font_size, fill_color)) { 837 pText2Device, font_size,
838 fill_color)) {
836 return TRUE; 839 return TRUE;
837 } 840 }
838 } 841 }
839 if (FXARGB_A(fill_color) < 255) 842 if (FXARGB_A(fill_color) < 255)
840 return FALSE; 843 return FALSE;
841 } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) { 844 } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) {
842 if (ShouldDrawDeviceText(pFont, text_flags) && 845 if (ShouldDrawDeviceText(pFont, text_flags) &&
843 m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pText2Device, 846 m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache,
844 font_size, fill_color)) { 847 pText2Device, font_size, fill_color)) {
845 return TRUE; 848 return TRUE;
846 } 849 }
847 } 850 }
848 CFX_Matrix char2device; 851 CFX_Matrix char2device;
849 CFX_Matrix text2Device; 852 CFX_Matrix text2Device;
850 if (pText2Device) { 853 if (pText2Device) {
851 char2device = *pText2Device; 854 char2device = *pText2Device;
852 text2Device = *pText2Device; 855 text2Device = *pText2Device;
853 } 856 }
854 char2device.Scale(font_size, -font_size); 857 char2device.Scale(font_size, -font_size);
855 if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f || 858 if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f ||
856 ((m_DeviceClass == FXDC_PRINTER) && 859 ((m_DeviceClass == FXDC_PRINTER) &&
857 !(text_flags & FXTEXT_PRINTIMAGETEXT))) { 860 !(text_flags & FXTEXT_PRINTIMAGETEXT))) {
858 if (pFont->GetFace() || 861 if (pFont->GetFace() ||
859 (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) { 862 (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
860 int nPathFlags = 863 int nPathFlags =
861 (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH; 864 (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH;
862 return DrawTextPath(nChars, pCharPos, pFont, font_size, pText2Device, 865 return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size,
863 nullptr, nullptr, fill_color, 0, nullptr, nPathFlags); 866 pText2Device, nullptr, nullptr, fill_color, 0,
867 nullptr, nPathFlags);
864 } 868 }
865 } 869 }
866 int anti_alias = FXFT_RENDER_MODE_MONO; 870 int anti_alias = FXFT_RENDER_MODE_MONO;
867 bool bNormal = false; 871 bool bNormal = false;
868 if ((text_flags & FXTEXT_NOSMOOTH) == 0) { 872 if ((text_flags & FXTEXT_NOSMOOTH) == 0) {
869 if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) { 873 if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) {
870 if (!CFX_GEModule::Get()->GetFontMgr()->FTLibrarySupportsHinting()) { 874 if (!CFX_GEModule::Get()->GetFontMgr()->FTLibrarySupportsHinting()) {
871 // Some Freetype implementations (like the one packaged with Fedora) do 875 // Some Freetype implementations (like the one packaged with Fedora) do
872 // not support hinting due to patents 6219025, 6239783, 6307566, 876 // not support hinting due to patents 6219025, 6239783, 6307566,
873 // 6225973, 6243070, 6393145, 6421054, 6282327, and 6624828; the latest 877 // 6225973, 6243070, 6393145, 6421054, 6282327, and 6624828; the latest
(...skipping 10 matching lines...) Expand all
884 888
885 bool bClearType = false; 889 bool bClearType = false;
886 if (pFont->GetFace() || 890 if (pFont->GetFace() ||
887 (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) { 891 (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) {
888 bClearType = !!(text_flags & FXTEXT_CLEARTYPE); 892 bClearType = !!(text_flags & FXTEXT_CLEARTYPE);
889 } 893 }
890 bNormal = !bClearType; 894 bNormal = !bClearType;
891 } 895 }
892 } 896 }
893 } 897 }
898 if (!pCache)
899 pCache = CFX_GEModule::Get()->GetFontCache();
900 CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
901 CFX_AutoFontCache autoFontCache(pCache, pFont);
894 std::vector<FXTEXT_GLYPHPOS> glyphs(nChars); 902 std::vector<FXTEXT_GLYPHPOS> glyphs(nChars);
895 CFX_Matrix matrixCTM = GetCTM(); 903 CFX_Matrix matrixCTM = GetCTM();
896 FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a); 904 FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a);
897 FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d); 905 FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d);
898 CFX_Matrix deviceCtm = char2device; 906 CFX_Matrix deviceCtm = char2device;
899 deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0); 907 deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0);
900 text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0); 908 text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0);
901 for (size_t i = 0; i < glyphs.size(); ++i) { 909 for (size_t i = 0; i < glyphs.size(); ++i) {
902 FXTEXT_GLYPHPOS& glyph = glyphs[i]; 910 FXTEXT_GLYPHPOS& glyph = glyphs[i];
903 const FXTEXT_CHARPOS& charpos = pCharPos[i]; 911 const FXTEXT_CHARPOS& charpos = pCharPos[i];
904 glyph.m_fOriginX = charpos.m_OriginX; 912 glyph.m_fOriginX = charpos.m_OriginX;
905 glyph.m_fOriginY = charpos.m_OriginY; 913 glyph.m_fOriginY = charpos.m_OriginY;
906 text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY); 914 text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);
907 if (anti_alias < FXFT_RENDER_MODE_LCD) 915 if (anti_alias < FXFT_RENDER_MODE_LCD)
908 glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX); 916 glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);
909 else 917 else
910 glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX); 918 glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX);
911 glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY); 919 glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY);
912 if (charpos.m_bGlyphAdjust) { 920 if (charpos.m_bGlyphAdjust) {
913 CFX_Matrix new_matrix( 921 CFX_Matrix new_matrix(
914 charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], 922 charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
915 charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0); 923 charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
916 new_matrix.Concat(deviceCtm); 924 new_matrix.Concat(deviceCtm);
917 glyph.m_pGlyph = pFont->LoadGlyphBitmap( 925 glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(
918 charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix, 926 pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix,
919 charpos.m_FontCharWidth, anti_alias, nativetext_flags); 927 charpos.m_FontCharWidth, anti_alias, nativetext_flags);
920 } else { 928 } else {
921 glyph.m_pGlyph = pFont->LoadGlyphBitmap( 929 glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(
922 charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm, 930 pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm,
923 charpos.m_FontCharWidth, anti_alias, nativetext_flags); 931 charpos.m_FontCharWidth, anti_alias, nativetext_flags);
924 } 932 }
925 } 933 }
926 if (anti_alias < FXFT_RENDER_MODE_LCD && glyphs.size() > 1) 934 if (anti_alias < FXFT_RENDER_MODE_LCD && glyphs.size() > 1)
927 AdjustGlyphSpace(&glyphs); 935 AdjustGlyphSpace(&glyphs);
928 936
929 FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(glyphs, anti_alias); 937 FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(glyphs, anti_alias);
930 if (scale_x > 1 && scale_y > 1) { 938 if (scale_x > 1 && scale_y > 1) {
931 bmp_rect1.left--; 939 bmp_rect1.left--;
932 bmp_rect1.top--; 940 bmp_rect1.top--;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 if (bitmap.IsAlphaMask()) 1041 if (bitmap.IsAlphaMask())
1034 SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color); 1042 SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color);
1035 else 1043 else
1036 SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top); 1044 SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top);
1037 return TRUE; 1045 return TRUE;
1038 } 1046 }
1039 1047
1040 FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, 1048 FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars,
1041 const FXTEXT_CHARPOS* pCharPos, 1049 const FXTEXT_CHARPOS* pCharPos,
1042 CFX_Font* pFont, 1050 CFX_Font* pFont,
1051 CFX_FontCache* pCache,
1043 FX_FLOAT font_size, 1052 FX_FLOAT font_size,
1044 const CFX_Matrix* pText2User, 1053 const CFX_Matrix* pText2User,
1045 const CFX_Matrix* pUser2Device, 1054 const CFX_Matrix* pUser2Device,
1046 const CFX_GraphStateData* pGraphState, 1055 const CFX_GraphStateData* pGraphState,
1047 uint32_t fill_color, 1056 uint32_t fill_color,
1048 FX_ARGB stroke_color, 1057 FX_ARGB stroke_color,
1049 CFX_PathData* pClippingPath, 1058 CFX_PathData* pClippingPath,
1050 int nFlag) { 1059 int nFlag) {
1060 if (!pCache)
1061 pCache = CFX_GEModule::Get()->GetFontCache();
1062 CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
1063 CFX_AutoFontCache autoFontCache(pCache, pFont);
1051 for (int iChar = 0; iChar < nChars; iChar++) { 1064 for (int iChar = 0; iChar < nChars; iChar++) {
1052 const FXTEXT_CHARPOS& charpos = pCharPos[iChar]; 1065 const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
1053 CFX_Matrix matrix; 1066 CFX_Matrix matrix;
1054 if (charpos.m_bGlyphAdjust) { 1067 if (charpos.m_bGlyphAdjust) {
1055 matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], 1068 matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
1056 charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0); 1069 charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
1057 } 1070 }
1058 matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, 1071 matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX,
1059 charpos.m_OriginY); 1072 charpos.m_OriginY);
1060 const CFX_PathData* pPath = 1073 const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(
1061 pFont->LoadGlyphPath(charpos.m_GlyphIndex, charpos.m_FontCharWidth); 1074 pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
1062 if (!pPath) 1075 if (!pPath)
1063 continue; 1076 continue;
1064 matrix.Concat(*pText2User); 1077 matrix.Concat(*pText2User);
1065 CFX_PathData TransformedPath(*pPath); 1078 CFX_PathData TransformedPath(*pPath);
1066 TransformedPath.Transform(&matrix); 1079 TransformedPath.Transform(&matrix);
1067 if (fill_color || stroke_color) { 1080 if (fill_color || stroke_color) {
1068 int fill_mode = nFlag; 1081 int fill_mode = nFlag;
1069 if (fill_color) 1082 if (fill_color)
1070 fill_mode |= FXFILL_WINDING; 1083 fill_mode |= FXFILL_WINDING;
1071 fill_mode |= FX_FILL_TEXT_MODE; 1084 fill_mode |= FX_FILL_TEXT_MODE;
1072 if (!DrawPathWithBlend(&TransformedPath, pUser2Device, pGraphState, 1085 if (!DrawPathWithBlend(&TransformedPath, pUser2Device, pGraphState,
1073 fill_color, stroke_color, fill_mode, 1086 fill_color, stroke_color, fill_mode,
1074 FXDIB_BLEND_NORMAL)) { 1087 FXDIB_BLEND_NORMAL)) {
1075 return FALSE; 1088 return FALSE;
1076 } 1089 }
1077 } 1090 }
1078 if (pClippingPath) 1091 if (pClippingPath)
1079 pClippingPath->Append(&TransformedPath, pUser2Device); 1092 pClippingPath->Append(&TransformedPath, pUser2Device);
1080 } 1093 }
1081 return TRUE; 1094 return TRUE;
1082 } 1095 }
OLDNEW
« no previous file with comments | « core/fxge/ge/cfx_fontcache.cpp ('k') | core/fxge/ifx_renderdevicedriver.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698