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

Side by Side Diff: src/core/SkPaint.cpp

Issue 152073003: Adding code to calculate Underline Thickness from Font Metrics, this will be useful when Skia is us… (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Adding Bitfield to Font Metrics Structure Created 6 years, 10 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
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkPaint.h" 9 #include "SkPaint.h"
10 #include "SkAnnotation.h" 10 #include "SkAnnotation.h"
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 } 1280 }
1281 1281
1282 FontMetrics storage; 1282 FontMetrics storage;
1283 if (NULL == metrics) { 1283 if (NULL == metrics) {
1284 metrics = &storage; 1284 metrics = &storage;
1285 } 1285 }
1286 1286
1287 paint.descriptorProc(NULL, zoomPtr, FontMetricsDescProc, metrics, true); 1287 paint.descriptorProc(NULL, zoomPtr, FontMetricsDescProc, metrics, true);
1288 1288
1289 if (scale) { 1289 if (scale) {
1290 // Assuming Font will have correct metrics for Underline Thickness and P osition
1291 metrics->fFontMetricsFlag = 0x03;
1292
1290 metrics->fTop = SkScalarMul(metrics->fTop, scale); 1293 metrics->fTop = SkScalarMul(metrics->fTop, scale);
1291 metrics->fAscent = SkScalarMul(metrics->fAscent, scale); 1294 metrics->fAscent = SkScalarMul(metrics->fAscent, scale);
1292 metrics->fDescent = SkScalarMul(metrics->fDescent, scale); 1295 metrics->fDescent = SkScalarMul(metrics->fDescent, scale);
1293 metrics->fBottom = SkScalarMul(metrics->fBottom, scale); 1296 metrics->fBottom = SkScalarMul(metrics->fBottom, scale);
1294 metrics->fLeading = SkScalarMul(metrics->fLeading, scale); 1297 metrics->fLeading = SkScalarMul(metrics->fLeading, scale);
1295 metrics->fAvgCharWidth = SkScalarMul(metrics->fAvgCharWidth, scale); 1298 metrics->fAvgCharWidth = SkScalarMul(metrics->fAvgCharWidth, scale);
1296 metrics->fXMin = SkScalarMul(metrics->fXMin, scale); 1299 metrics->fXMin = SkScalarMul(metrics->fXMin, scale);
1297 metrics->fXMax = SkScalarMul(metrics->fXMax, scale); 1300 metrics->fXMax = SkScalarMul(metrics->fXMax, scale);
1298 metrics->fXHeight = SkScalarMul(metrics->fXHeight, scale); 1301 metrics->fXHeight = SkScalarMul(metrics->fXHeight, scale);
1302
1303 metrics->fUnderlineThickness = SkScalarMul(metrics->fUnderlineThickness, scale);
1304 // Following is to check if we have faulty underline thciness metrics
1305 if ( (metrics->fUnderlineThickness == 0) || (metrics->fUnderlineThicknes s >= metrics->fAscent/2))
bungeman-skia 2014/02/17 19:10:06 Why would these checks only be done when there is
h.joshi 2014/02/18 05:48:48 Added these to check faulty font metrics for Under
1306 {
1307 metrics->fFontMetricsFlag = metrics->fFontMetricsFlag ^ FontMetrics ::kUnderlineThinknessIsValid_FontMetricFlag;
1308 }
1309
1310 metrics->fUnderlinePosition = SkScalarMul(metrics->fUnderlinePosition, s cale);
1311 // Following is to check if we have faulty underlien position metrics
1312 if(SkScalarAbs(metrics->fUnderlinePosition) >= (metrics->fDescent + metr ics->fLeading))
1313 {
1314 metrics->fFontMetricsFlag = metrics->fFontMetricsFlag ^FontMetrics:: kUnderlinePositionIsValid_FontMetricsflag;
1315 }
1299 } 1316 }
1300 return metrics->fDescent - metrics->fAscent + metrics->fLeading; 1317 return metrics->fDescent - metrics->fAscent + metrics->fLeading;
1301 } 1318 }
1302 1319
1303 /////////////////////////////////////////////////////////////////////////////// 1320 ///////////////////////////////////////////////////////////////////////////////
1304 1321
1305 static void set_bounds(const SkGlyph& g, SkRect* bounds, SkScalar scale) { 1322 static void set_bounds(const SkGlyph& g, SkRect* bounds, SkScalar scale) {
1306 bounds->set(g.fLeft * scale, 1323 bounds->set(g.fLeft * scale,
1307 g.fTop * scale, 1324 g.fTop * scale,
1308 (g.fLeft + g.fWidth) * scale, 1325 (g.fLeft + g.fWidth) * scale,
(...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after
2250 this->getMaskFilter()->computeFastBounds(*storage, storage); 2267 this->getMaskFilter()->computeFastBounds(*storage, storage);
2251 } 2268 }
2252 2269
2253 if (this->getImageFilter()) { 2270 if (this->getImageFilter()) {
2254 this->getImageFilter()->computeFastBounds(*storage, storage); 2271 this->getImageFilter()->computeFastBounds(*storage, storage);
2255 } 2272 }
2256 2273
2257 return *storage; 2274 return *storage;
2258 } 2275 }
2259 2276
2277 bool SkPaint::isFontMetricsFlagSet(FontMetrics * fObject, FontMetrics::FontMetri csFlags flag) const
2278 {
2279 if(fObject != NULL) {
2280 return SkToBool(fObject->fFontMetricsFlag & flag);
2281 }
2282 return false;
2283 }
2284
2260 #ifdef SK_DEVELOPER 2285 #ifdef SK_DEVELOPER
2261 void SkPaint::toString(SkString* str) const { 2286 void SkPaint::toString(SkString* str) const {
2262 str->append("<dl><dt>SkPaint:</dt><dd><dl>"); 2287 str->append("<dl><dt>SkPaint:</dt><dd><dl>");
2263 2288
2264 SkTypeface* typeface = this->getTypeface(); 2289 SkTypeface* typeface = this->getTypeface();
2265 if (NULL != typeface) { 2290 if (NULL != typeface) {
2266 SkDynamicMemoryWStream ostream; 2291 SkDynamicMemoryWStream ostream;
2267 typeface->serialize(&ostream); 2292 typeface->serialize(&ostream);
2268 SkAutoTUnref<SkData> data(ostream.copyToData()); 2293 SkAutoTUnref<SkData> data(ostream.copyToData());
2269 2294
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
2543 case SkXfermode::kPlus_Mode: 2568 case SkXfermode::kPlus_Mode:
2544 return 0 == this->getAlpha(); 2569 return 0 == this->getAlpha();
2545 case SkXfermode::kDst_Mode: 2570 case SkXfermode::kDst_Mode:
2546 return true; 2571 return true;
2547 default: 2572 default:
2548 break; 2573 break;
2549 } 2574 }
2550 } 2575 }
2551 return false; 2576 return false;
2552 } 2577 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698