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

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

Issue 615053005: avoid extra math work in MackRec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 2 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 /* 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 "SkPaint.h" 8 #include "SkPaint.h"
9 #include "SkAnnotation.h" 9 #include "SkAnnotation.h"
10 #include "SkAutoKern.h" 10 #include "SkAutoKern.h"
(...skipping 1461 matching lines...) Expand 10 before | Expand all | Expand 10 after
1472 } 1472 }
1473 1473
1474 #define assert_byte(x) SkASSERT(0 == ((x) >> 8)) 1474 #define assert_byte(x) SkASSERT(0 == ((x) >> 8))
1475 1475
1476 // Beyond this size, LCD doesn't appreciably improve quality, but it always 1476 // Beyond this size, LCD doesn't appreciably improve quality, but it always
1477 // cost more RAM and draws slower, so we set a cap. 1477 // cost more RAM and draws slower, so we set a cap.
1478 #ifndef SK_MAX_SIZE_FOR_LCDTEXT 1478 #ifndef SK_MAX_SIZE_FOR_LCDTEXT
1479 #define SK_MAX_SIZE_FOR_LCDTEXT 48 1479 #define SK_MAX_SIZE_FOR_LCDTEXT 48
1480 #endif 1480 #endif
1481 1481
1482 static bool tooBigForLCD(const SkScalerContext::Rec& rec) { 1482 const SkScalar gMaxSize2ForLCDText = SK_MAX_SIZE_FOR_LCDTEXT * SK_MAX_SIZE_FOR_L CDTEXT;
1483 SkScalar area = rec.fPost2x2[0][0] * rec.fPost2x2[1][1] - 1483
robertphillips 2014/10/01 19:58:41 too_big_for_lcd ?
1484 rec.fPost2x2[1][0] * rec.fPost2x2[0][1]; 1484 static bool tooBigForLCD(const SkScalerContext::Rec& rec, bool checkPost2x2) {
1485 SkScalar size = SkScalarSqrt(SkScalarAbs(area)) * rec.fTextSize; 1485 SkScalar size = rec.fTextSize;
1486 return size > SkIntToScalar(SK_MAX_SIZE_FOR_LCDTEXT); 1486 if (checkPost2x2) {
1487 SkScalar area = rec.fPost2x2[0][0] * rec.fPost2x2[1][1] -
1488 rec.fPost2x2[1][0] * rec.fPost2x2[0][1];
1489 size *= SkScalarAbs(area);
1490 }
1491 return size > gMaxSize2ForLCDText;
1487 } 1492 }
1488 1493
1489 /* 1494 /*
1490 * Return the scalar with only limited fractional precision. Used to consolidat e matrices 1495 * Return the scalar with only limited fractional precision. Used to consolidat e matrices
1491 * that vary only slightly when we create our key into the font cache, since th e font scaler 1496 * that vary only slightly when we create our key into the font cache, since th e font scaler
1492 * typically returns the same looking resuts for tiny changes in the matrix. 1497 * typically returns the same looking resuts for tiny changes in the matrix.
1493 */ 1498 */
1494 static SkScalar sk_relax(SkScalar x) { 1499 static SkScalar sk_relax(SkScalar x) {
1495 int n = sk_float_round2int(x * 1024); 1500 int n = sk_float_round2int(x * 1024);
1496 return n / 1024.0f; 1501 return n / 1024.0f;
1497 } 1502 }
1498 1503
1499 void SkScalerContext::MakeRec(const SkPaint& paint, 1504 void SkScalerContext::MakeRec(const SkPaint& paint,
1500 const SkDeviceProperties* deviceProperties, 1505 const SkDeviceProperties* deviceProperties,
1501 const SkMatrix* deviceMatrix, 1506 const SkMatrix* deviceMatrix,
1502 Rec* rec) { 1507 Rec* rec) {
1503 SkASSERT(deviceMatrix == NULL || !deviceMatrix->hasPerspective()); 1508 SkASSERT(deviceMatrix == NULL || !deviceMatrix->hasPerspective());
1504 1509
1505 SkTypeface* typeface = paint.getTypeface(); 1510 SkTypeface* typeface = paint.getTypeface();
1506 if (NULL == typeface) { 1511 if (NULL == typeface) {
1507 typeface = SkTypeface::GetDefaultTypeface(); 1512 typeface = SkTypeface::GetDefaultTypeface();
1508 } 1513 }
1509 rec->fFontID = typeface->uniqueID(); 1514 rec->fFontID = typeface->uniqueID();
1510 rec->fTextSize = paint.getTextSize(); 1515 rec->fTextSize = paint.getTextSize();
1511 rec->fPreScaleX = paint.getTextScaleX(); 1516 rec->fPreScaleX = paint.getTextScaleX();
1512 rec->fPreSkewX = paint.getTextSkewX(); 1517 rec->fPreSkewX = paint.getTextSkewX();
1513 1518
1519 bool checkPost2x2 = false;
1520
1514 if (deviceMatrix) { 1521 if (deviceMatrix) {
1515 rec->fPost2x2[0][0] = sk_relax(deviceMatrix->getScaleX()); 1522 const SkMatrix::TypeMask mask = deviceMatrix->getType();
1516 rec->fPost2x2[0][1] = sk_relax(deviceMatrix->getSkewX()); 1523 if (mask & SkMatrix::kScale_Mask) {
1517 rec->fPost2x2[1][0] = sk_relax(deviceMatrix->getSkewY()); 1524 rec->fPost2x2[0][0] = sk_relax(deviceMatrix->getScaleX());
1518 rec->fPost2x2[1][1] = sk_relax(deviceMatrix->getScaleY()); 1525 rec->fPost2x2[1][1] = sk_relax(deviceMatrix->getScaleY());
1526 checkPost2x2 = true;
1527 } else {
1528 rec->fPost2x2[0][0] = rec->fPost2x2[1][1] = SK_Scalar1;
1529 }
1530 if (mask & SkMatrix::kAffine_Mask) {
1531 rec->fPost2x2[0][1] = sk_relax(deviceMatrix->getSkewX());
1532 rec->fPost2x2[1][0] = sk_relax(deviceMatrix->getSkewY());
1533 checkPost2x2 = true;
1534 } else {
1535 rec->fPost2x2[0][1] = rec->fPost2x2[1][0] = 0;
1536 }
1519 } else { 1537 } else {
1520 rec->fPost2x2[0][0] = rec->fPost2x2[1][1] = SK_Scalar1; 1538 rec->fPost2x2[0][0] = rec->fPost2x2[1][1] = SK_Scalar1;
1521 rec->fPost2x2[0][1] = rec->fPost2x2[1][0] = 0; 1539 rec->fPost2x2[0][1] = rec->fPost2x2[1][0] = 0;
1522 } 1540 }
1523 1541
1524 SkPaint::Style style = paint.getStyle(); 1542 SkPaint::Style style = paint.getStyle();
1525 SkScalar strokeWidth = paint.getStrokeWidth(); 1543 SkScalar strokeWidth = paint.getStrokeWidth();
1526 1544
1527 unsigned flags = 0; 1545 unsigned flags = 0;
1528 1546
(...skipping 30 matching lines...) Expand all
1559 } 1577 }
1560 } else { 1578 } else {
1561 rec->fFrameWidth = 0; 1579 rec->fFrameWidth = 0;
1562 rec->fMiterLimit = 0; 1580 rec->fMiterLimit = 0;
1563 rec->fStrokeJoin = 0; 1581 rec->fStrokeJoin = 0;
1564 } 1582 }
1565 1583
1566 rec->fMaskFormat = SkToU8(computeMaskFormat(paint)); 1584 rec->fMaskFormat = SkToU8(computeMaskFormat(paint));
1567 1585
1568 if (SkMask::kLCD16_Format == rec->fMaskFormat || SkMask::kLCD32_Format == re c->fMaskFormat) { 1586 if (SkMask::kLCD16_Format == rec->fMaskFormat || SkMask::kLCD32_Format == re c->fMaskFormat) {
1569 if (tooBigForLCD(*rec)) { 1587 if (tooBigForLCD(*rec, checkPost2x2)) {
1570 rec->fMaskFormat = SkMask::kA8_Format; 1588 rec->fMaskFormat = SkMask::kA8_Format;
1571 flags |= SkScalerContext::kGenA8FromLCD_Flag; 1589 flags |= SkScalerContext::kGenA8FromLCD_Flag;
1572 } else { 1590 } else {
1573 SkPixelGeometry geometry = deviceProperties 1591 SkPixelGeometry geometry = deviceProperties
1574 ? deviceProperties->fPixelGeometry 1592 ? deviceProperties->fPixelGeometry
1575 : SkSurfacePropsDefaultPixelGeometry(); 1593 : SkSurfacePropsDefaultPixelGeometry();
1576 switch (geometry) { 1594 switch (geometry) {
1577 case kUnknown_SkPixelGeometry: 1595 case kUnknown_SkPixelGeometry:
1578 // eeek, can't support LCD 1596 // eeek, can't support LCD
1579 rec->fMaskFormat = SkMask::kA8_Format; 1597 rec->fMaskFormat = SkMask::kA8_Format;
(...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after
2557 return 0 == this->getAlpha(); 2575 return 0 == this->getAlpha();
2558 case SkXfermode::kDst_Mode: 2576 case SkXfermode::kDst_Mode:
2559 return true; 2577 return true;
2560 default: 2578 default:
2561 break; 2579 break;
2562 } 2580 }
2563 } 2581 }
2564 return false; 2582 return false;
2565 } 2583 }
2566 2584
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