OLD | NEW |
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 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1549 SkGlyphCache * const fGlyphCache; | 1549 SkGlyphCache * const fGlyphCache; |
1550 SkBlitter * const fBlitter; | 1550 SkBlitter * const fBlitter; |
1551 const SkRegion* const fClip; | 1551 const SkRegion* const fClip; |
1552 const SkDraw& fDraw; | 1552 const SkDraw& fDraw; |
1553 const SkPaint& fPaint; | 1553 const SkPaint& fPaint; |
1554 const SkIRect fClipBounds; | 1554 const SkIRect fClipBounds; |
1555 }; | 1555 }; |
1556 | 1556 |
1557 ////////////////////////////////////////////////////////////////////////////////
//////////////////// | 1557 ////////////////////////////////////////////////////////////////////////////////
//////////////////// |
1558 | 1558 |
| 1559 SkPaint::FakeGamma SkDraw::fakeGamma() const { |
| 1560 return fDevice->imageInfo().isLinear() ? SkPaint::FakeGamma::On : SkPaint::F
akeGamma::Off; |
| 1561 } |
| 1562 |
1559 void SkDraw::drawText(const char text[], size_t byteLength, | 1563 void SkDraw::drawText(const char text[], size_t byteLength, |
1560 SkScalar x, SkScalar y, const SkPaint& paint) const { | 1564 SkScalar x, SkScalar y, const SkPaint& paint) const { |
1561 SkASSERT(byteLength == 0 || text != nullptr); | 1565 SkASSERT(byteLength == 0 || text != nullptr); |
1562 | 1566 |
1563 SkDEBUGCODE(this->validate();) | 1567 SkDEBUGCODE(this->validate();) |
1564 | 1568 |
1565 // nothing to draw | 1569 // nothing to draw |
1566 if (text == nullptr || byteLength == 0 || fRC->isEmpty()) { | 1570 if (text == nullptr || byteLength == 0 || fRC->isEmpty()) { |
1567 return; | 1571 return; |
1568 } | 1572 } |
1569 | 1573 |
1570 // SkScalarRec doesn't currently have a way of representing hairline stroke
and | 1574 // SkScalarRec doesn't currently have a way of representing hairline stroke
and |
1571 // will fill if its frame-width is 0. | 1575 // will fill if its frame-width is 0. |
1572 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { | 1576 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { |
1573 this->drawText_asPaths(text, byteLength, x, y, paint); | 1577 this->drawText_asPaths(text, byteLength, x, y, paint); |
1574 return; | 1578 return; |
1575 } | 1579 } |
1576 | 1580 |
1577 SkAutoGlyphCache autoCache(paint, &fDevice->surfaceProps(), fMatrix); | 1581 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->fakeGamma(), f
Matrix); |
1578 SkGlyphCache* cache = autoCache.getCache(); | |
1579 | 1582 |
1580 // The Blitter Choose needs to be live while using the blitter below. | 1583 // The Blitter Choose needs to be live while using the blitter below. |
1581 SkAutoBlitterChoose blitterChooser(fDst, *fMatrix, paint); | 1584 SkAutoBlitterChoose blitterChooser(fDst, *fMatrix, paint); |
1582 SkAAClipBlitterWrapper wrapper(*fRC, blitterChooser.get()); | 1585 SkAAClipBlitterWrapper wrapper(*fRC, blitterChooser.get()); |
1583 DrawOneGlyph drawOneGlyph(*this, paint, cache, wrapper.getBlitter(
)); | 1586 DrawOneGlyph drawOneGlyph(*this, paint, cache.get(), wrapper.getBl
itter()); |
1584 | 1587 |
1585 SkFindAndPlaceGlyph::ProcessText( | 1588 SkFindAndPlaceGlyph::ProcessText( |
1586 paint.getTextEncoding(), text, byteLength, | 1589 paint.getTextEncoding(), text, byteLength, |
1587 {x, y}, *fMatrix, paint.getTextAlign(), cache, drawOneGlyph); | 1590 {x, y}, *fMatrix, paint.getTextAlign(), cache.get(), drawOneGlyph); |
1588 } | 1591 } |
1589 | 1592 |
1590 ////////////////////////////////////////////////////////////////////////////// | 1593 ////////////////////////////////////////////////////////////////////////////// |
1591 | 1594 |
1592 void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength, | 1595 void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength, |
1593 const SkScalar pos[], int scalarsPerPosition, | 1596 const SkScalar pos[], int scalarsPerPosition, |
1594 const SkPoint& offset, const SkPaint& origPaint
) const { | 1597 const SkPoint& offset, const SkPaint& origPaint
) const { |
1595 // setup our std paint, in hopes of getting hits in the cache | 1598 // setup our std paint, in hopes of getting hits in the cache |
1596 SkPaint paint(origPaint); | 1599 SkPaint paint(origPaint); |
1597 SkScalar matrixScale = paint.setupForAsPaths(); | 1600 SkScalar matrixScale = paint.setupForAsPaths(); |
1598 | 1601 |
1599 SkMatrix matrix; | 1602 SkMatrix matrix; |
1600 matrix.setScale(matrixScale, matrixScale); | 1603 matrix.setScale(matrixScale, matrixScale); |
1601 | 1604 |
1602 // Temporarily jam in kFill, so we only ever ask for the raw outline from th
e cache. | 1605 // Temporarily jam in kFill, so we only ever ask for the raw outline from th
e cache. |
1603 paint.setStyle(SkPaint::kFill_Style); | 1606 paint.setStyle(SkPaint::kFill_Style); |
1604 paint.setPathEffect(nullptr); | 1607 paint.setPathEffect(nullptr); |
1605 | 1608 |
1606 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); | 1609 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); |
1607 SkAutoGlyphCache autoCache(paint, &fDevice->surfaceProps(), nullptr); | 1610 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->fakeGamma()
, nullptr); |
1608 SkGlyphCache* cache = autoCache.getCache(); | |
1609 | 1611 |
1610 const char* stop = text + byteLength; | 1612 const char* stop = text + byteLength; |
1611 SkTextAlignProc alignProc(paint.getTextAlign()); | 1613 SkTextAlignProc alignProc(paint.getTextAlign()); |
1612 SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition); | 1614 SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition); |
1613 | 1615 |
1614 // Now restore the original settings, so we "draw" with whatever style/strok
ing. | 1616 // Now restore the original settings, so we "draw" with whatever style/strok
ing. |
1615 paint.setStyle(origPaint.getStyle()); | 1617 paint.setStyle(origPaint.getStyle()); |
1616 paint.setPathEffect(origPaint.getPathEffect()); | 1618 paint.setPathEffect(origPaint.getPathEffect()); |
1617 | 1619 |
1618 while (text < stop) { | 1620 while (text < stop) { |
1619 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1621 const SkGlyph& glyph = glyphCacheProc(cache.get(), &text, 0, 0); |
1620 if (glyph.fWidth) { | 1622 if (glyph.fWidth) { |
1621 const SkPath* path = cache->findPath(glyph); | 1623 const SkPath* path = cache->findPath(glyph); |
1622 if (path) { | 1624 if (path) { |
1623 SkPoint tmsLoc; | 1625 SkPoint tmsLoc; |
1624 tmsProc(pos, &tmsLoc); | 1626 tmsProc(pos, &tmsLoc); |
1625 SkPoint loc; | 1627 SkPoint loc; |
1626 alignProc(tmsLoc, glyph, &loc); | 1628 alignProc(tmsLoc, glyph, &loc); |
1627 | 1629 |
1628 matrix[SkMatrix::kMTransX] = loc.fX; | 1630 matrix[SkMatrix::kMTransX] = loc.fX; |
1629 matrix[SkMatrix::kMTransY] = loc.fY; | 1631 matrix[SkMatrix::kMTransY] = loc.fY; |
(...skipping 19 matching lines...) Expand all Loading... |
1649 // nothing to draw | 1651 // nothing to draw |
1650 if (text == nullptr || byteLength == 0 || fRC->isEmpty()) { | 1652 if (text == nullptr || byteLength == 0 || fRC->isEmpty()) { |
1651 return; | 1653 return; |
1652 } | 1654 } |
1653 | 1655 |
1654 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { | 1656 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { |
1655 this->drawPosText_asPaths(text, byteLength, pos, scalarsPerPosition, off
set, paint); | 1657 this->drawPosText_asPaths(text, byteLength, pos, scalarsPerPosition, off
set, paint); |
1656 return; | 1658 return; |
1657 } | 1659 } |
1658 | 1660 |
1659 SkAutoGlyphCache autoCache(paint, &fDevice->surfaceProps(), fMatrix); | 1661 SkAutoGlyphCache cache(paint, &fDevice->surfaceProps(), this->fakeGamma(), f
Matrix); |
1660 SkGlyphCache* cache = autoCache.getCache(); | |
1661 | 1662 |
1662 // The Blitter Choose needs to be live while using the blitter below. | 1663 // The Blitter Choose needs to be live while using the blitter below. |
1663 SkAutoBlitterChoose blitterChooser(fDst, *fMatrix, paint); | 1664 SkAutoBlitterChoose blitterChooser(fDst, *fMatrix, paint); |
1664 SkAAClipBlitterWrapper wrapper(*fRC, blitterChooser.get()); | 1665 SkAAClipBlitterWrapper wrapper(*fRC, blitterChooser.get()); |
1665 DrawOneGlyph drawOneGlyph(*this, paint, cache, wrapper.getBlitter(
)); | 1666 DrawOneGlyph drawOneGlyph(*this, paint, cache.get(), wrapper.getBl
itter()); |
1666 SkPaint::Align textAlignment = paint.getTextAlign(); | 1667 SkPaint::Align textAlignment = paint.getTextAlign(); |
1667 | 1668 |
1668 SkFindAndPlaceGlyph::ProcessPosText( | 1669 SkFindAndPlaceGlyph::ProcessPosText( |
1669 paint.getTextEncoding(), text, byteLength, | 1670 paint.getTextEncoding(), text, byteLength, |
1670 offset, *fMatrix, pos, scalarsPerPosition, textAlignment, cache, drawOne
Glyph); | 1671 offset, *fMatrix, pos, scalarsPerPosition, textAlignment, cache.get(), d
rawOneGlyph); |
1671 } | 1672 } |
1672 | 1673 |
1673 #if defined _WIN32 && _MSC_VER >= 1300 | 1674 #if defined _WIN32 && _MSC_VER >= 1300 |
1674 #pragma warning ( pop ) | 1675 #pragma warning ( pop ) |
1675 #endif | 1676 #endif |
1676 | 1677 |
1677 /////////////////////////////////////////////////////////////////////////////// | 1678 /////////////////////////////////////////////////////////////////////////////// |
1678 | 1679 |
1679 static SkScan::HairRCProc ChooseHairProc(bool doAntiAlias) { | 1680 static SkScan::HairRCProc ChooseHairProc(bool doAntiAlias) { |
1680 return doAntiAlias ? SkScan::AntiHairLine : SkScan::HairLine; | 1681 return doAntiAlias ? SkScan::AntiHairLine : SkScan::HairLine; |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2055 mask->fImage = SkMask::AllocImage(size); | 2056 mask->fImage = SkMask::AllocImage(size); |
2056 memset(mask->fImage, 0, mask->computeImageSize()); | 2057 memset(mask->fImage, 0, mask->computeImageSize()); |
2057 } | 2058 } |
2058 | 2059 |
2059 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2060 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
2060 draw_into_mask(*mask, devPath, style); | 2061 draw_into_mask(*mask, devPath, style); |
2061 } | 2062 } |
2062 | 2063 |
2063 return true; | 2064 return true; |
2064 } | 2065 } |
OLD | NEW |