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

Side by Side Diff: src/ports/SkFontHost_FreeType.cpp

Issue 1737693006: Change type of SkGlyph::fAdvance[XY] to float. (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Should be float, not SkScalar. Created 4 years, 9 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 | « src/pdf/SkPDFFont.cpp ('k') | src/ports/SkFontHost_mac.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 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkAdvancedTypefaceMetrics.h" 8 #include "SkAdvancedTypefaceMetrics.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
(...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 while (glyphIndex != 0) { 999 while (glyphIndex != 0) {
1000 if (glyphIndex == glyph) { 1000 if (glyphIndex == glyph) {
1001 return charCode; 1001 return charCode;
1002 } 1002 }
1003 charCode = FT_Get_Next_Char( fFace, charCode, &glyphIndex ); 1003 charCode = FT_Get_Next_Char( fFace, charCode, &glyphIndex );
1004 } 1004 }
1005 1005
1006 return 0; 1006 return 0;
1007 } 1007 }
1008 1008
1009 static SkScalar SkFT_FixedToScalar(FT_Fixed x) {
1010 return SkFixedToScalar(x);
1011 }
1012
1009 void SkScalerContext_FreeType::generateAdvance(SkGlyph* glyph) { 1013 void SkScalerContext_FreeType::generateAdvance(SkGlyph* glyph) {
1010 /* unhinted and light hinted text have linearly scaled advances 1014 /* unhinted and light hinted text have linearly scaled advances
1011 * which are very cheap to compute with some font formats... 1015 * which are very cheap to compute with some font formats...
1012 */ 1016 */
1013 if (fDoLinearMetrics) { 1017 if (fDoLinearMetrics) {
1014 SkAutoMutexAcquire ac(gFTMutex); 1018 SkAutoMutexAcquire ac(gFTMutex);
1015 1019
1016 if (this->setupSize()) { 1020 if (this->setupSize()) {
1017 glyph->zeroMetrics(); 1021 glyph->zeroMetrics();
1018 return; 1022 return;
1019 } 1023 }
1020 1024
1021 FT_Error error; 1025 FT_Error error;
1022 FT_Fixed advance; 1026 FT_Fixed advance;
1023 1027
1024 error = FT_Get_Advance( fFace, glyph->getGlyphID(), 1028 error = FT_Get_Advance( fFace, glyph->getGlyphID(),
1025 fLoadGlyphFlags | FT_ADVANCE_FLAG_FAST_ONLY, 1029 fLoadGlyphFlags | FT_ADVANCE_FLAG_FAST_ONLY,
1026 &advance ); 1030 &advance );
1027 if (0 == error) { 1031 if (0 == error) {
1028 glyph->fRsbDelta = 0; 1032 glyph->fRsbDelta = 0;
1029 glyph->fLsbDelta = 0; 1033 glyph->fLsbDelta = 0;
1030 glyph->fAdvanceX = SkFixedMul(fMatrix22.xx, advance); 1034 const SkScalar advanceScalar = SkFT_FixedToScalar(advance);
1031 glyph->fAdvanceY = - SkFixedMul(fMatrix22.yx, advance); 1035 glyph->fAdvanceX = SkScalarToFloat(fMatrix22Scalar.getScaleX() * adv anceScalar);
1036 glyph->fAdvanceY = -SkScalarToFloat(fMatrix22Scalar.getSkewY() * adv anceScalar);
1032 return; 1037 return;
1033 } 1038 }
1034 } 1039 }
1035 1040
1036 /* otherwise, we need to load/hint the glyph, which is slower */ 1041 /* otherwise, we need to load/hint the glyph, which is slower */
1037 this->generateMetrics(glyph); 1042 this->generateMetrics(glyph);
1038 return; 1043 return;
1039 } 1044 }
1040 1045
1041 void SkScalerContext_FreeType::getBBoxForCurrentGlyph(SkGlyph* glyph, 1046 void SkScalerContext_FreeType::getBBoxForCurrentGlyph(SkGlyph* glyph,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 } 1106 }
1102 } 1107 }
1103 } 1108 }
1104 1109
1105 inline void scaleGlyphMetrics(SkGlyph& glyph, SkScalar scale) { 1110 inline void scaleGlyphMetrics(SkGlyph& glyph, SkScalar scale) {
1106 glyph.fWidth *= scale; 1111 glyph.fWidth *= scale;
1107 glyph.fHeight *= scale; 1112 glyph.fHeight *= scale;
1108 glyph.fTop *= scale; 1113 glyph.fTop *= scale;
1109 glyph.fLeft *= scale; 1114 glyph.fLeft *= scale;
1110 1115
1111 SkFixed fixedScale = SkScalarToFixed(scale); 1116 float floatScale = SkScalarToFloat(scale);
1112 glyph.fAdvanceX = SkFixedMul(glyph.fAdvanceX, fixedScale); 1117 glyph.fAdvanceX *= floatScale;
1113 glyph.fAdvanceY = SkFixedMul(glyph.fAdvanceY, fixedScale); 1118 glyph.fAdvanceY *= floatScale;
1114 } 1119 }
1115 1120
1116 void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) { 1121 void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) {
1117 SkAutoMutexAcquire ac(gFTMutex); 1122 SkAutoMutexAcquire ac(gFTMutex);
1118 1123
1119 glyph->fRsbDelta = 0; 1124 glyph->fRsbDelta = 0;
1120 glyph->fLsbDelta = 0; 1125 glyph->fLsbDelta = 0;
1121 1126
1122 FT_Error err; 1127 FT_Error err;
1123 1128
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 break; 1179 break;
1175 1180
1176 default: 1181 default:
1177 SkDEBUGFAIL("unknown glyph format"); 1182 SkDEBUGFAIL("unknown glyph format");
1178 glyph->zeroMetrics(); 1183 glyph->zeroMetrics();
1179 return; 1184 return;
1180 } 1185 }
1181 1186
1182 if (fRec.fFlags & SkScalerContext::kVertical_Flag) { 1187 if (fRec.fFlags & SkScalerContext::kVertical_Flag) {
1183 if (fDoLinearMetrics) { 1188 if (fDoLinearMetrics) {
1184 glyph->fAdvanceX = -SkFixedMul(fMatrix22.xy, fFace->glyph->linearVer tAdvance); 1189 const SkScalar advanceScalar = SkFT_FixedToScalar(fFace->glyph->line arVertAdvance);
1185 glyph->fAdvanceY = SkFixedMul(fMatrix22.yy, fFace->glyph->linearVert Advance); 1190 glyph->fAdvanceX = -SkScalarToFloat(fMatrix22Scalar.getSkewX() * adv anceScalar);
1191 glyph->fAdvanceY = SkScalarToFloat(fMatrix22Scalar.getScaleY() * adv anceScalar);
1186 } else { 1192 } else {
1187 glyph->fAdvanceX = -SkFDot6ToFixed(fFace->glyph->advance.x); 1193 glyph->fAdvanceX = -SkFDot6ToFloat(fFace->glyph->advance.x);
1188 glyph->fAdvanceY = SkFDot6ToFixed(fFace->glyph->advance.y); 1194 glyph->fAdvanceY = SkFDot6ToFloat(fFace->glyph->advance.y);
1189 } 1195 }
1190 } else { 1196 } else {
1191 if (fDoLinearMetrics) { 1197 if (fDoLinearMetrics) {
1192 glyph->fAdvanceX = SkFixedMul(fMatrix22.xx, fFace->glyph->linearHori Advance); 1198 const SkScalar advanceScalar = SkFT_FixedToScalar(fFace->glyph->line arHoriAdvance);
1193 glyph->fAdvanceY = -SkFixedMul(fMatrix22.yx, fFace->glyph->linearHor iAdvance); 1199 glyph->fAdvanceX = SkScalarToFloat(fMatrix22Scalar.getScaleX() * adv anceScalar);
1200 glyph->fAdvanceY = -SkScalarToFloat(fMatrix22Scalar.getSkewY() * adv anceScalar);
1194 } else { 1201 } else {
1195 glyph->fAdvanceX = SkFDot6ToFixed(fFace->glyph->advance.x); 1202 glyph->fAdvanceX = SkFDot6ToFloat(fFace->glyph->advance.x);
1196 glyph->fAdvanceY = -SkFDot6ToFixed(fFace->glyph->advance.y); 1203 glyph->fAdvanceY = -SkFDot6ToFloat(fFace->glyph->advance.y);
1197 1204
1198 if (fRec.fFlags & kDevKernText_Flag) { 1205 if (fRec.fFlags & kDevKernText_Flag) {
1199 glyph->fRsbDelta = SkToS8(fFace->glyph->rsb_delta); 1206 glyph->fRsbDelta = SkToS8(fFace->glyph->rsb_delta);
1200 glyph->fLsbDelta = SkToS8(fFace->glyph->lsb_delta); 1207 glyph->fLsbDelta = SkToS8(fFace->glyph->lsb_delta);
1201 } 1208 }
1202 } 1209 }
1203 } 1210 }
1204 1211
1205 // If the font isn't scalable, scale the metrics from the non-scalable strik e. 1212 // If the font isn't scalable, scale the metrics from the non-scalable strik e.
1206 // This means do not try to scale embedded bitmaps; only scale bitmaps in bi tmap only fonts. 1213 // This means do not try to scale embedded bitmaps; only scale bitmaps in bi tmap only fonts.
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
1807 SkDEBUGF(("Requested font axis not found: %s '%c%c%c%c'\n", 1814 SkDEBUGF(("Requested font axis not found: %s '%c%c%c%c'\n",
1808 name.c_str(), 1815 name.c_str(),
1809 (skTag >> 24) & 0xFF, 1816 (skTag >> 24) & 0xFF,
1810 (skTag >> 16) & 0xFF, 1817 (skTag >> 16) & 0xFF,
1811 (skTag >> 8) & 0xFF, 1818 (skTag >> 8) & 0xFF,
1812 (skTag) & 0xFF)); 1819 (skTag) & 0xFF));
1813 } 1820 }
1814 } 1821 }
1815 ) 1822 )
1816 } 1823 }
OLDNEW
« no previous file with comments | « src/pdf/SkPDFFont.cpp ('k') | src/ports/SkFontHost_mac.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698