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

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

Issue 977623002: Glyph positions maintain 32 bit integer part. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Warnings as errors on Windows. Created 5 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 | « include/core/SkFixed.h ('k') | src/core/SkDrawProcs.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 7
8 #include "SkDraw.h" 8 #include "SkDraw.h"
9 #include "SkBlitter.h" 9 #include "SkBlitter.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
(...skipping 1425 matching lines...) Expand 10 before | Expand all | Expand 10 after
1436 } 1436 }
1437 1437
1438 // disable warning : local variable used without having been initialized 1438 // disable warning : local variable used without having been initialized
1439 #if defined _WIN32 && _MSC_VER >= 1300 1439 #if defined _WIN32 && _MSC_VER >= 1300
1440 #pragma warning ( push ) 1440 #pragma warning ( push )
1441 #pragma warning ( disable : 4701 ) 1441 #pragma warning ( disable : 4701 )
1442 #endif 1442 #endif
1443 1443
1444 ////////////////////////////////////////////////////////////////////////////// 1444 //////////////////////////////////////////////////////////////////////////////
1445 1445
1446 static void D1G_RectClip(const SkDraw1Glyph& state, SkFixed fx, SkFixed fy, cons t SkGlyph& glyph) { 1446 static void D1G_RectClip(const SkDraw1Glyph& state, Sk48Dot16 fx, Sk48Dot16 fy, const SkGlyph& glyph) {
1447 int left = SkFixedFloorToInt(fx); 1447 int left = Sk48Dot16FloorToInt(fx);
1448 int top = SkFixedFloorToInt(fy); 1448 int top = Sk48Dot16FloorToInt(fy);
1449 SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0); 1449 SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0);
1450 SkASSERT((NULL == state.fClip && state.fAAClip) || 1450 SkASSERT((NULL == state.fClip && state.fAAClip) ||
1451 (state.fClip && NULL == state.fAAClip && state.fClip->isRect())); 1451 (state.fClip && NULL == state.fAAClip && state.fClip->isRect()));
1452 1452
1453 left += glyph.fLeft; 1453 left += glyph.fLeft;
1454 top += glyph.fTop; 1454 top += glyph.fTop;
1455 1455
1456 int right = left + glyph.fWidth; 1456 int right = left + glyph.fWidth;
1457 int bottom = top + glyph.fHeight; 1457 int bottom = top + glyph.fHeight;
1458 1458
(...skipping 18 matching lines...) Expand all
1477 return; // can't rasterize glyph 1477 return; // can't rasterize glyph
1478 } 1478 }
1479 } 1479 }
1480 1480
1481 mask.fRowBytes = glyph.rowBytes(); 1481 mask.fRowBytes = glyph.rowBytes();
1482 mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat); 1482 mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat);
1483 mask.fImage = aa; 1483 mask.fImage = aa;
1484 state.blitMask(mask, *bounds); 1484 state.blitMask(mask, *bounds);
1485 } 1485 }
1486 1486
1487 static void D1G_RgnClip(const SkDraw1Glyph& state, SkFixed fx, SkFixed fy, const SkGlyph& glyph) { 1487 static void D1G_RgnClip(const SkDraw1Glyph& state, Sk48Dot16 fx, Sk48Dot16 fy, c onst SkGlyph& glyph) {
1488 int left = SkFixedFloorToInt(fx); 1488 int left = Sk48Dot16FloorToInt(fx);
1489 int top = SkFixedFloorToInt(fy); 1489 int top = Sk48Dot16FloorToInt(fy);
1490 SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0); 1490 SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0);
1491 SkASSERT(!state.fClip->isRect()); 1491 SkASSERT(!state.fClip->isRect());
1492 1492
1493 SkMask mask; 1493 SkMask mask;
1494 1494
1495 left += glyph.fLeft; 1495 left += glyph.fLeft;
1496 top += glyph.fTop; 1496 top += glyph.fTop;
1497 1497
1498 mask.fBounds.set(left, top, left + glyph.fWidth, top + glyph.fHeight); 1498 mask.fBounds.set(left, top, left + glyph.fWidth, top + glyph.fHeight);
1499 SkRegion::Cliperator clipper(*state.fClip, mask.fBounds); 1499 SkRegion::Cliperator clipper(*state.fClip, mask.fBounds);
(...skipping 27 matching lines...) Expand all
1527 } 1527 }
1528 1528
1529 SkDraw1Glyph::Proc SkDraw1Glyph::init(const SkDraw* draw, SkBlitter* blitter, Sk GlyphCache* cache, 1529 SkDraw1Glyph::Proc SkDraw1Glyph::init(const SkDraw* draw, SkBlitter* blitter, Sk GlyphCache* cache,
1530 const SkPaint& pnt) { 1530 const SkPaint& pnt) {
1531 fDraw = draw; 1531 fDraw = draw;
1532 fBlitter = blitter; 1532 fBlitter = blitter;
1533 fCache = cache; 1533 fCache = cache;
1534 fPaint = &pnt; 1534 fPaint = &pnt;
1535 1535
1536 if (cache->isSubpixel()) { 1536 if (cache->isSubpixel()) {
1537 fHalfSampleX = fHalfSampleY = SkGlyph::kSubpixelRound; 1537 fHalfSampleX = fHalfSampleY = SkFixedToScalar(SkGlyph::kSubpixelRound);
1538 } else { 1538 } else {
1539 fHalfSampleX = fHalfSampleY = SK_FixedHalf; 1539 fHalfSampleX = fHalfSampleY = SK_ScalarHalf;
1540 } 1540 }
1541 1541
1542 if (hasCustomD1GProc(*draw)) { 1542 if (hasCustomD1GProc(*draw)) {
1543 // todo: fix this assumption about clips w/ custom 1543 // todo: fix this assumption about clips w/ custom
1544 fClip = draw->fClip; 1544 fClip = draw->fClip;
1545 fClipBounds = fClip->getBounds(); 1545 fClipBounds = fClip->getBounds();
1546 return draw->fProcs->fD1GProc; 1546 return draw->fProcs->fD1GProc;
1547 } 1547 }
1548 1548
1549 if (draw->fRC->isBW()) { 1549 if (draw->fRC->isBW()) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1640 SkAutoKern autokern; 1640 SkAutoKern autokern;
1641 SkDraw1Glyph d1g; 1641 SkDraw1Glyph d1g;
1642 SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache, paint); 1642 SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache, paint);
1643 1643
1644 SkFixed fxMask = ~0; 1644 SkFixed fxMask = ~0;
1645 SkFixed fyMask = ~0; 1645 SkFixed fyMask = ~0;
1646 if (cache->isSubpixel()) { 1646 if (cache->isSubpixel()) {
1647 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix); 1647 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix);
1648 if (kX_SkAxisAlignment == baseline) { 1648 if (kX_SkAxisAlignment == baseline) {
1649 fyMask = 0; 1649 fyMask = 0;
1650 d1g.fHalfSampleY = SK_FixedHalf; 1650 d1g.fHalfSampleY = SK_ScalarHalf;
1651 } else if (kY_SkAxisAlignment == baseline) { 1651 } else if (kY_SkAxisAlignment == baseline) {
1652 fxMask = 0; 1652 fxMask = 0;
1653 d1g.fHalfSampleX = SK_FixedHalf; 1653 d1g.fHalfSampleX = SK_ScalarHalf;
1654 } 1654 }
1655 } 1655 }
1656 1656
1657 SkFixed fx = SkScalarToFixed(x) + d1g.fHalfSampleX; 1657 Sk48Dot16 fx = SkScalarTo48Dot16(x + d1g.fHalfSampleX);
1658 SkFixed fy = SkScalarToFixed(y) + d1g.fHalfSampleY; 1658 Sk48Dot16 fy = SkScalarTo48Dot16(y + d1g.fHalfSampleY);
1659 1659
1660 while (text < stop) { 1660 while (text < stop) {
1661 const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fy Mask); 1661 const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fy Mask);
1662 1662
1663 fx += autokern.adjust(glyph); 1663 fx += autokern.adjust(glyph);
1664 1664
1665 if (glyph.fWidth) { 1665 if (glyph.fWidth) {
1666 proc(d1g, fx, fy, glyph); 1666 proc(d1g, fx, fy, glyph);
1667 } 1667 }
1668 1668
(...skipping 16 matching lines...) Expand all
1685 1685
1686 // Temporarily jam in kFill, so we only ever ask for the raw outline from th e cache. 1686 // Temporarily jam in kFill, so we only ever ask for the raw outline from th e cache.
1687 paint.setStyle(SkPaint::kFill_Style); 1687 paint.setStyle(SkPaint::kFill_Style);
1688 paint.setPathEffect(NULL); 1688 paint.setPathEffect(NULL);
1689 1689
1690 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); 1690 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc();
1691 SkAutoGlyphCache autoCache(paint, NULL, NULL); 1691 SkAutoGlyphCache autoCache(paint, NULL, NULL);
1692 SkGlyphCache* cache = autoCache.getCache(); 1692 SkGlyphCache* cache = autoCache.getCache();
1693 1693
1694 const char* stop = text + byteLength; 1694 const char* stop = text + byteLength;
1695 SkTextAlignProcScalar alignProc(paint.getTextAlign()); 1695 SkTextAlignProc alignProc(paint.getTextAlign());
1696 SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition); 1696 SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition);
1697 1697
1698 // Now restore the original settings, so we "draw" with whatever style/strok ing. 1698 // Now restore the original settings, so we "draw" with whatever style/strok ing.
1699 paint.setStyle(origPaint.getStyle()); 1699 paint.setStyle(origPaint.getStyle());
1700 paint.setPathEffect(origPaint.getPathEffect()); 1700 paint.setPathEffect(origPaint.getPathEffect());
1701 1701
1702 while (text < stop) { 1702 while (text < stop) {
1703 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); 1703 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
1704 if (glyph.fWidth) { 1704 if (glyph.fWidth) {
1705 const SkPath* path = cache->findPath(glyph); 1705 const SkPath* path = cache->findPath(glyph);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 SkTextMapStateProc tmsProc(*fMatrix, offset, scalarsPerPosition); 1763 SkTextMapStateProc tmsProc(*fMatrix, offset, scalarsPerPosition);
1764 1764
1765 if (cache->isSubpixel()) { 1765 if (cache->isSubpixel()) {
1766 // maybe we should skip the rounding if linearText is set 1766 // maybe we should skip the rounding if linearText is set
1767 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix); 1767 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix);
1768 1768
1769 SkFixed fxMask = ~0; 1769 SkFixed fxMask = ~0;
1770 SkFixed fyMask = ~0; 1770 SkFixed fyMask = ~0;
1771 if (kX_SkAxisAlignment == baseline) { 1771 if (kX_SkAxisAlignment == baseline) {
1772 fyMask = 0; 1772 fyMask = 0;
1773 d1g.fHalfSampleY = SK_FixedHalf; 1773 d1g.fHalfSampleY = SK_ScalarHalf;
1774 } else if (kY_SkAxisAlignment == baseline) { 1774 } else if (kY_SkAxisAlignment == baseline) {
1775 fxMask = 0; 1775 fxMask = 0;
1776 d1g.fHalfSampleX = SK_FixedHalf; 1776 d1g.fHalfSampleX = SK_ScalarHalf;
1777 } 1777 }
1778 1778
1779 if (SkPaint::kLeft_Align == paint.getTextAlign()) { 1779 if (SkPaint::kLeft_Align == paint.getTextAlign()) {
1780 while (text < stop) { 1780 while (text < stop) {
1781 SkPoint tmsLoc; 1781 SkPoint tmsLoc;
1782 tmsProc(pos, &tmsLoc); 1782 tmsProc(pos, &tmsLoc);
1783 SkFixed fx = SkScalarToFixed(tmsLoc.fX) + d1g.fHalfSampleX;
1784 SkFixed fy = SkScalarToFixed(tmsLoc.fY) + d1g.fHalfSampleY;
1785 1783
1786 const SkGlyph& glyph = glyphCacheProc(cache, &text, 1784 Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + d1g.fHalfSampleX);
1787 fx & fxMask, fy & fyMask); 1785 Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + d1g.fHalfSampleY);
1786
1787 const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fyMask);
1788 1788
1789 if (glyph.fWidth) { 1789 if (glyph.fWidth) {
1790 proc(d1g, fx, fy, glyph); 1790 proc(d1g, fx, fy, glyph);
1791 } 1791 }
1792 pos += scalarsPerPosition; 1792 pos += scalarsPerPosition;
1793 } 1793 }
1794 } else { 1794 } else {
1795 while (text < stop) { 1795 while (text < stop) {
1796 const char* currentText = text; 1796 const char* currentText = text;
1797 const SkGlyph& metricGlyph = glyphCacheProc(cache, &text, 0, 0); 1797 const SkGlyph& metricGlyph = glyphCacheProc(cache, &text, 0, 0);
1798 1798
1799 if (metricGlyph.fWidth) { 1799 if (metricGlyph.fWidth) {
1800 SkDEBUGCODE(SkFixed prevAdvX = metricGlyph.fAdvanceX;) 1800 SkDEBUGCODE(SkFixed prevAdvX = metricGlyph.fAdvanceX;)
1801 SkDEBUGCODE(SkFixed prevAdvY = metricGlyph.fAdvanceY;) 1801 SkDEBUGCODE(SkFixed prevAdvY = metricGlyph.fAdvanceY;)
1802 SkPoint tmsLoc; 1802 SkPoint tmsLoc;
1803 tmsProc(pos, &tmsLoc); 1803 tmsProc(pos, &tmsLoc);
1804 SkIPoint fixedLoc;
1805 alignProc(tmsLoc, metricGlyph, &fixedLoc);
1806 1804
1807 SkFixed fx = fixedLoc.fX + d1g.fHalfSampleX; 1805 SkPoint alignLoc;
1808 SkFixed fy = fixedLoc.fY + d1g.fHalfSampleY; 1806 alignProc(tmsLoc, metricGlyph, &alignLoc);
1807
1808 Sk48Dot16 fx = SkScalarTo48Dot16(alignLoc.fX + d1g.fHalfSamp leX);
1809 Sk48Dot16 fy = SkScalarTo48Dot16(alignLoc.fY + d1g.fHalfSamp leY);
1809 1810
1810 // have to call again, now that we've been "aligned" 1811 // have to call again, now that we've been "aligned"
1811 const SkGlyph& glyph = glyphCacheProc(cache, &currentText, 1812 const SkGlyph& glyph = glyphCacheProc(cache, &currentText,
1812 fx & fxMask, fy & fyMa sk); 1813 fx & fxMask, fy & fyMa sk);
1813 // the assumption is that the metrics haven't changed 1814 // the assumption is that the metrics haven't changed
1814 SkASSERT(prevAdvX == glyph.fAdvanceX); 1815 SkASSERT(prevAdvX == glyph.fAdvanceX);
1815 SkASSERT(prevAdvY == glyph.fAdvanceY); 1816 SkASSERT(prevAdvY == glyph.fAdvanceY);
1816 SkASSERT(glyph.fWidth); 1817 SkASSERT(glyph.fWidth);
1817 1818
1818 proc(d1g, fx, fy, glyph); 1819 proc(d1g, fx, fy, glyph);
1819 } 1820 }
1820 pos += scalarsPerPosition; 1821 pos += scalarsPerPosition;
1821 } 1822 }
1822 } 1823 }
1823 } else { // not subpixel 1824 } else { // not subpixel
1824 if (SkPaint::kLeft_Align == paint.getTextAlign()) { 1825 if (SkPaint::kLeft_Align == paint.getTextAlign()) {
1825 while (text < stop) { 1826 while (text < stop) {
1826 // the last 2 parameters are ignored 1827 // the last 2 parameters are ignored
1827 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); 1828 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
1828 1829
1829 if (glyph.fWidth) { 1830 if (glyph.fWidth) {
1830 SkPoint tmsLoc; 1831 SkPoint tmsLoc;
1831 tmsProc(pos, &tmsLoc); 1832 tmsProc(pos, &tmsLoc);
1832 1833
1833 proc(d1g, 1834 proc(d1g,
1834 SkScalarToFixed(tmsLoc.fX) + SK_FixedHalf, //d1g.fHalfS ampleX, 1835 SkScalarTo48Dot16(tmsLoc.fX + SK_ScalarHalf), //d1g.fHa lfSampleX,
1835 SkScalarToFixed(tmsLoc.fY) + SK_FixedHalf, //d1g.fHalfS ampleY, 1836 SkScalarTo48Dot16(tmsLoc.fY + SK_ScalarHalf), //d1g.fHa lfSampleY,
1836 glyph); 1837 glyph);
1837 } 1838 }
1838 pos += scalarsPerPosition; 1839 pos += scalarsPerPosition;
1839 } 1840 }
1840 } else { 1841 } else {
1841 while (text < stop) { 1842 while (text < stop) {
1842 // the last 2 parameters are ignored 1843 // the last 2 parameters are ignored
1843 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); 1844 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
1844 1845
1845 if (glyph.fWidth) { 1846 if (glyph.fWidth) {
1846 SkPoint tmsLoc; 1847 SkPoint tmsLoc;
1847 tmsProc(pos, &tmsLoc); 1848 tmsProc(pos, &tmsLoc);
1848 1849
1849 SkIPoint fixedLoc; 1850 SkPoint alignLoc;
1850 alignProc(tmsLoc, glyph, &fixedLoc); 1851 alignProc(tmsLoc, glyph, &alignLoc);
1851 1852
1852 proc(d1g, 1853 proc(d1g,
1853 fixedLoc.fX + SK_FixedHalf, //d1g.fHalfSampleX, 1854 SkScalarTo48Dot16(alignLoc.fX + SK_ScalarHalf), //d1g.f HalfSampleX,
1854 fixedLoc.fY + SK_FixedHalf, //d1g.fHalfSampleY, 1855 SkScalarTo48Dot16(alignLoc.fY + SK_ScalarHalf), //d1g.f HalfSampleY,
1855 glyph); 1856 glyph);
1856 } 1857 }
1857 pos += scalarsPerPosition; 1858 pos += scalarsPerPosition;
1858 } 1859 }
1859 } 1860 }
1860 } 1861 }
1861 } 1862 }
1862 1863
1863 #if defined _WIN32 && _MSC_VER >= 1300 1864 #if defined _WIN32 && _MSC_VER >= 1300
1864 #pragma warning ( pop ) 1865 #pragma warning ( pop )
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
2265 mask->fImage = SkMask::AllocImage(size); 2266 mask->fImage = SkMask::AllocImage(size);
2266 memset(mask->fImage, 0, mask->computeImageSize()); 2267 memset(mask->fImage, 0, mask->computeImageSize());
2267 } 2268 }
2268 2269
2269 if (SkMask::kJustComputeBounds_CreateMode != mode) { 2270 if (SkMask::kJustComputeBounds_CreateMode != mode) {
2270 draw_into_mask(*mask, devPath, style); 2271 draw_into_mask(*mask, devPath, style);
2271 } 2272 }
2272 2273
2273 return true; 2274 return true;
2274 } 2275 }
OLDNEW
« no previous file with comments | « include/core/SkFixed.h ('k') | src/core/SkDrawProcs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698