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

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

Issue 1866293003: Decouple contrast boost from fake gamma. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Improve ignorePreBlend API, add storage type to enum Created 4 years, 8 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 | « include/core/SkPaint.h ('k') | src/core/SkGlyphCache.h » ('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 #define __STDC_LIMIT_MACROS 7 #define __STDC_LIMIT_MACROS
8 8
9 #include "SkDraw.h" 9 #include "SkDraw.h"
10 #include "SkBlitter.h" 10 #include "SkBlitter.h"
(...skipping 1537 matching lines...) Expand 10 before | Expand all | Expand 10 after
1548 SkGlyphCache * const fGlyphCache; 1548 SkGlyphCache * const fGlyphCache;
1549 SkBlitter * const fBlitter; 1549 SkBlitter * const fBlitter;
1550 const SkRegion* const fClip; 1550 const SkRegion* const fClip;
1551 const SkDraw& fDraw; 1551 const SkDraw& fDraw;
1552 const SkPaint& fPaint; 1552 const SkPaint& fPaint;
1553 const SkIRect fClipBounds; 1553 const SkIRect fClipBounds;
1554 }; 1554 };
1555 1555
1556 //////////////////////////////////////////////////////////////////////////////// //////////////////// 1556 //////////////////////////////////////////////////////////////////////////////// ////////////////////
1557 1557
1558 SkPaint::FakeGamma SkDraw::fakeGamma() const { 1558 uint32_t SkDraw::scalerContextFlags() const {
1559 return fDevice->imageInfo().isLinear() ? SkPaint::FakeGamma::On : SkPaint::F akeGamma::Off; 1559 uint32_t flags = SkPaint::kBoostContrast_ScalerContextFlag;
1560 if (fDevice->imageInfo().isLinear()) {
1561 flags |= SkPaint::kFakeGamma_ScalerContextFlag;
1562 }
1563 return flags;
1560 } 1564 }
1561 1565
1562 void SkDraw::drawText(const char text[], size_t byteLength, 1566 void SkDraw::drawText(const char text[], size_t byteLength,
1563 SkScalar x, SkScalar y, const SkPaint& paint) const { 1567 SkScalar x, SkScalar y, const SkPaint& paint) const {
1564 SkASSERT(byteLength == 0 || text != nullptr); 1568 SkASSERT(byteLength == 0 || text != nullptr);
1565 1569
1566 SkDEBUGCODE(this->validate();) 1570 SkDEBUGCODE(this->validate();)
1567 1571
1568 // nothing to draw 1572 // nothing to draw
1569 if (text == nullptr || byteLength == 0 || fRC->isEmpty()) { 1573 if (text == nullptr || byteLength == 0 || fRC->isEmpty()) {
1570 return; 1574 return;
1571 } 1575 }
1572 1576
1573 // SkScalarRec doesn't currently have a way of representing hairline stroke and 1577 // SkScalarRec doesn't currently have a way of representing hairline stroke and
1574 // will fill if its frame-width is 0. 1578 // will fill if its frame-width is 0.
1575 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { 1579 if (ShouldDrawTextAsPaths(paint, *fMatrix)) {
1576 this->drawText_asPaths(text, byteLength, x, y, paint); 1580 this->drawText_asPaths(text, byteLength, x, y, paint);
1577 return; 1581 return;
1578 } 1582 }
1579 1583
1580 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->fakeGamma(), f Matrix); 1584 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->scalerContextF lags(), fMatrix);
1581 1585
1582 // The Blitter Choose needs to be live while using the blitter below. 1586 // The Blitter Choose needs to be live while using the blitter below.
1583 SkAutoBlitterChoose blitterChooser(fDst, *fMatrix, paint); 1587 SkAutoBlitterChoose blitterChooser(fDst, *fMatrix, paint);
1584 SkAAClipBlitterWrapper wrapper(*fRC, blitterChooser.get()); 1588 SkAAClipBlitterWrapper wrapper(*fRC, blitterChooser.get());
1585 DrawOneGlyph drawOneGlyph(*this, paint, cache.get(), wrapper.getBl itter()); 1589 DrawOneGlyph drawOneGlyph(*this, paint, cache.get(), wrapper.getBl itter());
1586 1590
1587 SkFindAndPlaceGlyph::ProcessText( 1591 SkFindAndPlaceGlyph::ProcessText(
1588 paint.getTextEncoding(), text, byteLength, 1592 paint.getTextEncoding(), text, byteLength,
1589 {x, y}, *fMatrix, paint.getTextAlign(), cache.get(), drawOneGlyph); 1593 {x, y}, *fMatrix, paint.getTextAlign(), cache.get(), drawOneGlyph);
1590 } 1594 }
1591 1595
1592 ////////////////////////////////////////////////////////////////////////////// 1596 //////////////////////////////////////////////////////////////////////////////
1593 1597
1594 void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength, 1598 void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength,
1595 const SkScalar pos[], int scalarsPerPosition, 1599 const SkScalar pos[], int scalarsPerPosition,
1596 const SkPoint& offset, const SkPaint& origPaint ) const { 1600 const SkPoint& offset, const SkPaint& origPaint ) const {
1597 // setup our std paint, in hopes of getting hits in the cache 1601 // setup our std paint, in hopes of getting hits in the cache
1598 SkPaint paint(origPaint); 1602 SkPaint paint(origPaint);
1599 SkScalar matrixScale = paint.setupForAsPaths(); 1603 SkScalar matrixScale = paint.setupForAsPaths();
1600 1604
1601 SkMatrix matrix; 1605 SkMatrix matrix;
1602 matrix.setScale(matrixScale, matrixScale); 1606 matrix.setScale(matrixScale, matrixScale);
1603 1607
1604 // Temporarily jam in kFill, so we only ever ask for the raw outline from th e cache. 1608 // Temporarily jam in kFill, so we only ever ask for the raw outline from th e cache.
1605 paint.setStyle(SkPaint::kFill_Style); 1609 paint.setStyle(SkPaint::kFill_Style);
1606 paint.setPathEffect(nullptr); 1610 paint.setPathEffect(nullptr);
1607 1611
1608 SkPaint::GlyphCacheProc glyphCacheProc = paint.getGlyphCacheProc(true); 1612 SkPaint::GlyphCacheProc glyphCacheProc = paint.getGlyphCacheProc(true);
1609 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->fakeGam ma(), nullptr); 1613 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->scalerContextF lags(), nullptr);
1610 1614
1611 const char* stop = text + byteLength; 1615 const char* stop = text + byteLength;
1612 SkTextAlignProc alignProc(paint.getTextAlign()); 1616 SkTextAlignProc alignProc(paint.getTextAlign());
1613 SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition); 1617 SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition);
1614 1618
1615 // Now restore the original settings, so we "draw" with whatever style/strok ing. 1619 // Now restore the original settings, so we "draw" with whatever style/strok ing.
1616 paint.setStyle(origPaint.getStyle()); 1620 paint.setStyle(origPaint.getStyle());
1617 paint.setPathEffect(sk_ref_sp(origPaint.getPathEffect())); 1621 paint.setPathEffect(sk_ref_sp(origPaint.getPathEffect()));
1618 1622
1619 while (text < stop) { 1623 while (text < stop) {
(...skipping 30 matching lines...) Expand all
1650 // nothing to draw 1654 // nothing to draw
1651 if (text == nullptr || byteLength == 0 || fRC->isEmpty()) { 1655 if (text == nullptr || byteLength == 0 || fRC->isEmpty()) {
1652 return; 1656 return;
1653 } 1657 }
1654 1658
1655 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { 1659 if (ShouldDrawTextAsPaths(paint, *fMatrix)) {
1656 this->drawPosText_asPaths(text, byteLength, pos, scalarsPerPosition, off set, paint); 1660 this->drawPosText_asPaths(text, byteLength, pos, scalarsPerPosition, off set, paint);
1657 return; 1661 return;
1658 } 1662 }
1659 1663
1660 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->fakeGamma(), f Matrix); 1664 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->scalerContextF lags(), fMatrix);
1661 1665
1662 // The Blitter Choose needs to be live while using the blitter below. 1666 // The Blitter Choose needs to be live while using the blitter below.
1663 SkAutoBlitterChoose blitterChooser(fDst, *fMatrix, paint); 1667 SkAutoBlitterChoose blitterChooser(fDst, *fMatrix, paint);
1664 SkAAClipBlitterWrapper wrapper(*fRC, blitterChooser.get()); 1668 SkAAClipBlitterWrapper wrapper(*fRC, blitterChooser.get());
1665 DrawOneGlyph drawOneGlyph(*this, paint, cache.get(), wrapper.getBl itter()); 1669 DrawOneGlyph drawOneGlyph(*this, paint, cache.get(), wrapper.getBl itter());
1666 SkPaint::Align textAlignment = paint.getTextAlign(); 1670 SkPaint::Align textAlignment = paint.getTextAlign();
1667 1671
1668 SkFindAndPlaceGlyph::ProcessPosText( 1672 SkFindAndPlaceGlyph::ProcessPosText(
1669 paint.getTextEncoding(), text, byteLength, 1673 paint.getTextEncoding(), text, byteLength,
1670 offset, *fMatrix, pos, scalarsPerPosition, textAlignment, cache.get(), d rawOneGlyph); 1674 offset, *fMatrix, pos, scalarsPerPosition, textAlignment, cache.get(), d rawOneGlyph);
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
2064 mask->fImage = SkMask::AllocImage(size); 2068 mask->fImage = SkMask::AllocImage(size);
2065 memset(mask->fImage, 0, mask->computeImageSize()); 2069 memset(mask->fImage, 0, mask->computeImageSize());
2066 } 2070 }
2067 2071
2068 if (SkMask::kJustComputeBounds_CreateMode != mode) { 2072 if (SkMask::kJustComputeBounds_CreateMode != mode) {
2069 draw_into_mask(*mask, devPath, style); 2073 draw_into_mask(*mask, devPath, style);
2070 } 2074 }
2071 2075
2072 return true; 2076 return true;
2073 } 2077 }
OLDNEW
« no previous file with comments | « include/core/SkPaint.h ('k') | src/core/SkGlyphCache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698