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

Side by Side Diff: core/src/fxge/ge/fx_ge_text.cpp

Issue 497863002: Bounds check in CFX_Font::LoadGlyphPath(). (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: use const size_t in place of #define. Created 6 years, 4 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "../../../include/fxge/fx_ge.h" 7 #include "../../../include/fxge/fx_ge.h"
8 #include "../../../include/fxge/fx_freetype.h" 8 #include "../../../include/fxge/fx_freetype.h"
9 #include "../../../include/fxcodec/fx_codec.h" 9 #include "../../../include/fxcodec/fx_codec.h"
10 #include "text_int.h" 10 #include "text_int.h"
(...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Fac e_UnitsPerEM(m_Face); 1219 int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Fac e_UnitsPerEM(m_Face);
1220 if (max_width == min_width) { 1220 if (max_width == min_width) {
1221 return; 1221 return;
1222 } 1222 }
1223 int param = min_param + (max_param - min_param) * (dest_width - min_widt h) / (max_width - min_width); 1223 int param = min_param + (max_param - min_param) * (dest_width - min_widt h) / (max_width - min_width);
1224 coords[1] = param; 1224 coords[1] = param;
1225 } 1225 }
1226 FXFT_Free(m_Face, pMasters); 1226 FXFT_Free(m_Face, pMasters);
1227 FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords); 1227 FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
1228 } 1228 }
1229 extern const char g_AngleSkew[30] = { 1229 static const size_t ANGLESKEW_ARRAY_SIZE = 30;
1230 static const char g_AngleSkew[ANGLESKEW_ARRAY_SIZE] = {
1230 0, 2, 3, 5, 7, 9, 11, 12, 14, 16, 1231 0, 2, 3, 5, 7, 9, 11, 12, 14, 16,
1231 18, 19, 21, 23, 25, 27, 29, 31, 32, 34, 1232 18, 19, 21, 23, 25, 27, 29, 31, 32, 34,
1232 36, 38, 40, 42, 45, 47, 49, 51, 53, 55, 1233 36, 38, 40, 42, 45, 47, 49, 51, 53, 55,
1233 }; 1234 };
1234 static const FX_BYTE g_WeightPow[100] = { 1235 static const size_t WEIGHTPOW_ARRAY_SIZE = 100;
1236 static const FX_BYTE g_WeightPow[WEIGHTPOW_ARRAY_SIZE] = {
1235 0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 1237 0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20,
1236 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36, 1238 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36,
1237 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 1239 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42,
1238 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 1240 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47,
1239 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 1241 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51,
1240 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 1242 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53,
1241 }; 1243 };
1242 extern const FX_BYTE g_WeightPow_11[100] = { 1244 static const FX_BYTE g_WeightPow_11[WEIGHTPOW_ARRAY_SIZE] = {
1243 0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 1245 0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22,
1244 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40, 1246 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40,
1245 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 1247 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46,
1246 46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52, 1248 46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52,
1247 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 1249 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56,
1248 56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 1250 56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58,
1249 }; 1251 };
1250 extern const FX_BYTE g_WeightPow_SHIFTJIS[100] = { 1252 static const FX_BYTE g_WeightPow_SHIFTJIS[WEIGHTPOW_ARRAY_SIZE] = {
1251 0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28, 1253 0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28,
1252 30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50, 1254 30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50,
1253 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55, 1255 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,
1254 55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 5 8, 58, 58, 1256 55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 5 8, 58, 58,
1255 58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 1257 58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,
1256 }; 1258 };
1257 static void _GammaAdjust(FX_LPBYTE pData, int nWid, int nHei, int src_pitch, FX_ LPCBYTE gammaTable) 1259 static void _GammaAdjust(FX_LPBYTE pData, int nWid, int nHei, int src_pitch, FX_ LPCBYTE gammaTable)
1258 { 1260 {
1259 int count = nHei * src_pitch; 1261 int count = nHei * src_pitch;
1260 for(int i = 0; i < count; i++) { 1262 for(int i = 0; i < count; i++) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 const CFX_SubstFont* pSubstFont = pFont->GetSubstFont(); 1318 const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();
1317 if (pSubstFont) { 1319 if (pSubstFont) {
1318 bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle; 1320 bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle;
1319 int skew = 0; 1321 int skew = 0;
1320 if (bUseCJKSubFont) { 1322 if (bUseCJKSubFont) {
1321 skew = pSubstFont->m_bItlicCJK ? -15 : 0; 1323 skew = pSubstFont->m_bItlicCJK ? -15 : 0;
1322 } else { 1324 } else {
1323 skew = pSubstFont->m_ItalicAngle; 1325 skew = pSubstFont->m_ItalicAngle;
1324 } 1326 }
1325 if (skew) { 1327 if (skew) {
1326 skew = skew <= -30 ? -58 : -g_AngleSkew[-skew]; 1328 skew = skew <= -ANGLESKEW_ARRAY_SIZE ? -58 : -g_AngleSkew[-skew];
1327 if (pFont->IsVertical()) { 1329 if (pFont->IsVertical()) {
1328 ft_matrix.yx += ft_matrix.yy * skew / 100; 1330 ft_matrix.yx += ft_matrix.yy * skew / 100;
1329 } else { 1331 } else {
1330 ft_matrix.xy += -ft_matrix.xx * skew / 100; 1332 ft_matrix.xy += -ft_matrix.xx * skew / 100;
1331 } 1333 }
1332 } 1334 }
1333 if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) { 1335 if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
1334 pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont() ->m_Weight); 1336 pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont() ->m_Weight);
1335 } 1337 }
1336 } 1338 }
1337 int transflag = FXFT_Get_Face_Internal_Flag(m_Face); 1339 int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
1338 FXFT_Set_Transform(m_Face, &ft_matrix, 0); 1340 FXFT_Set_Transform(m_Face, &ft_matrix, 0);
1339 int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BIT MAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING); 1341 int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BIT MAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);
1340 int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags); 1342 int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
1341 if (error) { 1343 if (error) {
1342 FXFT_Set_Face_Internal_Flag(m_Face, transflag); 1344 FXFT_Set_Face_Internal_Flag(m_Face, transflag);
1343 return NULL; 1345 return NULL;
1344 } 1346 }
1345 int weight = 0; 1347 int weight = 0;
1346 if (bUseCJKSubFont) { 1348 if (bUseCJKSubFont) {
1347 weight = pSubstFont->m_WeightCJK; 1349 weight = pSubstFont->m_WeightCJK;
1348 } else { 1350 } else {
1349 weight = pSubstFont ? pSubstFont->m_Weight : 0; 1351 weight = pSubstFont ? pSubstFont->m_Weight : 0;
1350 } 1352 }
1351 if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) { 1353 if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) {
1352 int index = (weight - 400) / 10; 1354 int index = (weight - 400) / 10;
1353 if (index >= 100) { 1355 if (index >= WEIGHTPOW_ARRAY_SIZE) {
1354 FXFT_Set_Face_Internal_Flag(m_Face, transflag); 1356 FXFT_Set_Face_Internal_Flag(m_Face, transflag);
1355 return NULL; 1357 return NULL;
1356 } 1358 }
1357 int level = 0; 1359 int level = 0;
1358 if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) { 1360 if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
1359 level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs((int)(ft_matrix .xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655; 1361 level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs((int)(ft_matrix .xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;
1360 } else { 1362 } else {
1361 level = g_WeightPow_11[index] * (FXSYS_abs((int)(ft_matrix.xx)) + FX SYS_abs((int)(ft_matrix.xy))) / 36655; 1363 level = g_WeightPow_11[index] * (FXSYS_abs((int)(ft_matrix.xx)) + FX SYS_abs((int)(ft_matrix.xy))) / 36655;
1362 } 1364 }
1363 FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level); 1365 FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1628 CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width) 1630 CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width)
1629 { 1631 {
1630 if (m_Face == NULL) { 1632 if (m_Face == NULL) {
1631 return NULL; 1633 return NULL;
1632 } 1634 }
1633 FXFT_Set_Pixel_Sizes(m_Face, 0, 64); 1635 FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
1634 FXFT_Matrix ft_matrix = {65536, 0, 0, 65536}; 1636 FXFT_Matrix ft_matrix = {65536, 0, 0, 65536};
1635 if (m_pSubstFont) { 1637 if (m_pSubstFont) {
1636 if (m_pSubstFont->m_ItalicAngle) { 1638 if (m_pSubstFont->m_ItalicAngle) {
1637 int skew = m_pSubstFont->m_ItalicAngle; 1639 int skew = m_pSubstFont->m_ItalicAngle;
1638 skew = skew <= -30 ? -58 : -g_AngleSkew[-skew]; 1640 skew = skew <= -ANGLESKEW_ARRAY_SIZE ? -58 : -g_AngleSkew[-skew];
1639 if (m_bVertical) { 1641 if (m_bVertical) {
1640 ft_matrix.yx += ft_matrix.yy * skew / 100; 1642 ft_matrix.yx += ft_matrix.yy * skew / 100;
1641 } else { 1643 } else {
1642 ft_matrix.xy += -ft_matrix.xx * skew / 100; 1644 ft_matrix.xy += -ft_matrix.xx * skew / 100;
1643 } 1645 }
1644 } 1646 }
1645 if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) { 1647 if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
1646 AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight); 1648 AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight);
1647 } 1649 }
1648 } 1650 }
1649 int transflag = FXFT_Get_Face_Internal_Flag(m_Face); 1651 int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
1650 FXFT_Set_Transform(m_Face, &ft_matrix, 0); 1652 FXFT_Set_Transform(m_Face, &ft_matrix, 0);
1651 int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BIT MAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING; 1653 int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BIT MAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING;
1652 int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags); 1654 int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
1653 if (error) { 1655 if (error) {
1654 FXFT_Set_Face_Internal_Flag(m_Face, transflag); 1656 FXFT_Set_Face_Internal_Flag(m_Face, transflag);
1655 return NULL; 1657 return NULL;
1656 } 1658 }
1657 if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSu bstFont->m_Weight > 400) { 1659 if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSu bstFont->m_Weight > 400) {
1660 int index = (m_pSubstFont->m_Weight - 400) / 10;
1661 if (index >= WEIGHTPOW_ARRAY_SIZE)
1662 index = WEIGHTPOW_ARRAY_SIZE - 1;
1658 int level = 0; 1663 int level = 0;
1659 if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) { 1664 if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
1660 level = g_WeightPow_SHIFTJIS[(m_pSubstFont->m_Weight - 400) / 10] * 2 * 65536 / 36655; 1665 level = g_WeightPow_SHIFTJIS[index] * 2 * 65536 / 36655;
1661 } else { 1666 } else {
1662 level = g_WeightPow[(m_pSubstFont->m_Weight - 400) / 10] * 2; 1667 level = g_WeightPow[index] * 2;
1663 } 1668 }
1664 FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level); 1669 FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
1665 } 1670 }
1666 FXFT_Outline_Funcs funcs; 1671 FXFT_Outline_Funcs funcs;
1667 funcs.move_to = _Outline_MoveTo; 1672 funcs.move_to = _Outline_MoveTo;
1668 funcs.line_to = _Outline_LineTo; 1673 funcs.line_to = _Outline_LineTo;
1669 funcs.conic_to = _Outline_ConicTo; 1674 funcs.conic_to = _Outline_ConicTo;
1670 funcs.cubic_to = _Outline_CubicTo; 1675 funcs.cubic_to = _Outline_CubicTo;
1671 funcs.shift = 0; 1676 funcs.shift = 0;
1672 funcs.delta = 0; 1677 funcs.delta = 0;
(...skipping 28 matching lines...) Expand all
1701 { 1706 {
1702 va_list argList; 1707 va_list argList;
1703 va_start(argList, count); 1708 va_start(argList, count);
1704 for (int i = 0; i < count; i ++) { 1709 for (int i = 0; i < count; i ++) {
1705 int p = va_arg(argList, int); 1710 int p = va_arg(argList, int);
1706 ((FX_DWORD*)m_Key)[i] = p; 1711 ((FX_DWORD*)m_Key)[i] = p;
1707 } 1712 }
1708 va_end(argList); 1713 va_end(argList);
1709 m_KeyLen = count * sizeof(FX_DWORD); 1714 m_KeyLen = count * sizeof(FX_DWORD);
1710 } 1715 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698