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 | 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" |
11 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
12 #include "SkDevice.h" | 12 #include "SkDevice.h" |
13 #include "SkDeviceLooper.h" | 13 #include "SkDeviceLooper.h" |
14 #include "SkFixed.h" | 14 #include "SkFixed.h" |
15 #include "SkMaskFilter.h" | 15 #include "SkMaskFilter.h" |
16 #include "SkPaint.h" | 16 #include "SkPaint.h" |
17 #include "SkPathEffect.h" | 17 #include "SkPathEffect.h" |
18 #include "SkRasterClip.h" | 18 #include "SkRasterClip.h" |
19 #include "SkRasterizer.h" | 19 #include "SkRasterizer.h" |
20 #include "SkRRect.h" | 20 #include "SkRRect.h" |
21 #include "SkScan.h" | 21 #include "SkScan.h" |
22 #include "SkShader.h" | 22 #include "SkShader.h" |
23 #include "SkSmallAllocator.h" | 23 #include "SkSmallAllocator.h" |
24 #include "SkString.h" | 24 #include "SkString.h" |
25 #include "SkStroke.h" | 25 #include "SkStroke.h" |
| 26 #include "SkTextMapStateProc.h" |
26 #include "SkTLazy.h" | 27 #include "SkTLazy.h" |
27 #include "SkUtils.h" | 28 #include "SkUtils.h" |
28 #include "SkVertState.h" | 29 #include "SkVertState.h" |
29 | 30 |
30 #include "SkAutoKern.h" | 31 #include "SkAutoKern.h" |
31 #include "SkBitmapProcShader.h" | 32 #include "SkBitmapProcShader.h" |
32 #include "SkDrawProcs.h" | 33 #include "SkDrawProcs.h" |
33 #include "SkMatrixUtils.h" | 34 #include "SkMatrixUtils.h" |
34 | 35 |
35 | 36 |
(...skipping 1595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1631 | 1632 |
1632 if (glyph.fWidth) { | 1633 if (glyph.fWidth) { |
1633 proc(d1g, fx, fy, glyph); | 1634 proc(d1g, fx, fy, glyph); |
1634 } | 1635 } |
1635 | 1636 |
1636 fx += glyph.fAdvanceX; | 1637 fx += glyph.fAdvanceX; |
1637 fy += glyph.fAdvanceY; | 1638 fy += glyph.fAdvanceY; |
1638 } | 1639 } |
1639 } | 1640 } |
1640 | 1641 |
1641 // last parameter is interpreted as SkFixed [x, y] | |
1642 // return the fixed position, which may be rounded or not by the caller | |
1643 // e.g. subpixel doesn't round | |
1644 typedef void (*AlignProc)(const SkPoint&, const SkGlyph&, SkIPoint*); | |
1645 | |
1646 static void leftAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint* ds
t) { | |
1647 dst->set(SkScalarToFixed(loc.fX), SkScalarToFixed(loc.fY)); | |
1648 } | |
1649 | |
1650 static void centerAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint*
dst) { | |
1651 dst->set(SkScalarToFixed(loc.fX) - (glyph.fAdvanceX >> 1), | |
1652 SkScalarToFixed(loc.fY) - (glyph.fAdvanceY >> 1)); | |
1653 } | |
1654 | |
1655 static void rightAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint* d
st) { | |
1656 dst->set(SkScalarToFixed(loc.fX) - glyph.fAdvanceX, | |
1657 SkScalarToFixed(loc.fY) - glyph.fAdvanceY); | |
1658 } | |
1659 | |
1660 static AlignProc pick_align_proc(SkPaint::Align align) { | |
1661 static const AlignProc gProcs[] = { | |
1662 leftAlignProc, centerAlignProc, rightAlignProc | |
1663 }; | |
1664 | |
1665 SkASSERT((unsigned)align < SK_ARRAY_COUNT(gProcs)); | |
1666 | |
1667 return gProcs[align]; | |
1668 } | |
1669 | |
1670 typedef void (*AlignProc_scalar)(const SkPoint&, const SkGlyph&, SkPoint*); | |
1671 | |
1672 static void leftAlignProc_scalar(const SkPoint& loc, const SkGlyph& glyph, SkPoi
nt* dst) { | |
1673 dst->set(loc.fX, loc.fY); | |
1674 } | |
1675 | |
1676 static void centerAlignProc_scalar(const SkPoint& loc, const SkGlyph& glyph, SkP
oint* dst) { | |
1677 dst->set(loc.fX - SkFixedToScalar(glyph.fAdvanceX >> 1), | |
1678 loc.fY - SkFixedToScalar(glyph.fAdvanceY >> 1)); | |
1679 } | |
1680 | |
1681 static void rightAlignProc_scalar(const SkPoint& loc, const SkGlyph& glyph, SkPo
int* dst) { | |
1682 dst->set(loc.fX - SkFixedToScalar(glyph.fAdvanceX), | |
1683 loc.fY - SkFixedToScalar(glyph.fAdvanceY)); | |
1684 } | |
1685 | |
1686 static AlignProc_scalar pick_align_proc_scalar(SkPaint::Align align) { | |
1687 static const AlignProc_scalar gProcs[] = { | |
1688 leftAlignProc_scalar, centerAlignProc_scalar, rightAlignProc_scalar | |
1689 }; | |
1690 | |
1691 SkASSERT((unsigned)align < SK_ARRAY_COUNT(gProcs)); | |
1692 | |
1693 return gProcs[align]; | |
1694 } | |
1695 | |
1696 class TextMapState { | |
1697 public: | |
1698 mutable SkPoint fLoc; | |
1699 | |
1700 TextMapState(const SkMatrix& matrix, SkScalar y) | |
1701 : fMatrix(matrix), fProc(matrix.getMapXYProc()), fY(y) {} | |
1702 | |
1703 typedef void (*Proc)(const TextMapState&, const SkScalar pos[]); | |
1704 | |
1705 Proc pickProc(int scalarsPerPosition); | |
1706 | |
1707 private: | |
1708 const SkMatrix& fMatrix; | |
1709 SkMatrix::MapXYProc fProc; | |
1710 SkScalar fY; // ignored by MapXYProc | |
1711 // these are only used by Only... procs | |
1712 SkScalar fScaleX, fTransX, fTransformedY; | |
1713 | |
1714 static void MapXProc(const TextMapState& state, const SkScalar pos[]) { | |
1715 state.fProc(state.fMatrix, *pos, state.fY, &state.fLoc); | |
1716 } | |
1717 | |
1718 static void MapXYProc(const TextMapState& state, const SkScalar pos[]) { | |
1719 state.fProc(state.fMatrix, pos[0], pos[1], &state.fLoc); | |
1720 } | |
1721 | |
1722 static void MapOnlyScaleXProc(const TextMapState& state, | |
1723 const SkScalar pos[]) { | |
1724 state.fLoc.set(SkScalarMul(state.fScaleX, *pos) + state.fTransX, | |
1725 state.fTransformedY); | |
1726 } | |
1727 | |
1728 static void MapOnlyTransXProc(const TextMapState& state, | |
1729 const SkScalar pos[]) { | |
1730 state.fLoc.set(*pos + state.fTransX, state.fTransformedY); | |
1731 } | |
1732 }; | |
1733 | |
1734 TextMapState::Proc TextMapState::pickProc(int scalarsPerPosition) { | |
1735 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); | |
1736 | |
1737 if (1 == scalarsPerPosition) { | |
1738 unsigned mtype = fMatrix.getType(); | |
1739 if (mtype & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)) { | |
1740 return MapXProc; | |
1741 } else { | |
1742 fScaleX = fMatrix.getScaleX(); | |
1743 fTransX = fMatrix.getTranslateX(); | |
1744 fTransformedY = SkScalarMul(fY, fMatrix.getScaleY()) + | |
1745 fMatrix.getTranslateY(); | |
1746 return (mtype & SkMatrix::kScale_Mask) ? | |
1747 MapOnlyScaleXProc : MapOnlyTransXProc; | |
1748 } | |
1749 } else { | |
1750 return MapXYProc; | |
1751 } | |
1752 } | |
1753 | |
1754 ////////////////////////////////////////////////////////////////////////////// | 1642 ////////////////////////////////////////////////////////////////////////////// |
1755 | 1643 |
1756 void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength, | 1644 void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength, |
1757 const SkScalar pos[], SkScalar constY, | 1645 const SkScalar pos[], SkScalar constY, |
1758 int scalarsPerPosition, | 1646 int scalarsPerPosition, |
1759 const SkPaint& origPaint) const { | 1647 const SkPaint& origPaint) const { |
1760 // setup our std paint, in hopes of getting hits in the cache | 1648 // setup our std paint, in hopes of getting hits in the cache |
1761 SkPaint paint(origPaint); | 1649 SkPaint paint(origPaint); |
1762 SkScalar matrixScale = paint.setupForAsPaths(); | 1650 SkScalar matrixScale = paint.setupForAsPaths(); |
1763 | 1651 |
1764 SkMatrix matrix; | 1652 SkMatrix matrix; |
1765 matrix.setScale(matrixScale, matrixScale); | 1653 matrix.setScale(matrixScale, matrixScale); |
1766 | 1654 |
1767 // Temporarily jam in kFill, so we only ever ask for the raw outline from th
e cache. | 1655 // Temporarily jam in kFill, so we only ever ask for the raw outline from th
e cache. |
1768 paint.setStyle(SkPaint::kFill_Style); | 1656 paint.setStyle(SkPaint::kFill_Style); |
1769 paint.setPathEffect(NULL); | 1657 paint.setPathEffect(NULL); |
1770 | 1658 |
1771 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); | 1659 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); |
1772 SkAutoGlyphCache autoCache(paint, NULL, NULL); | 1660 SkAutoGlyphCache autoCache(paint, NULL, NULL); |
1773 SkGlyphCache* cache = autoCache.getCache(); | 1661 SkGlyphCache* cache = autoCache.getCache(); |
1774 | 1662 |
1775 const char* stop = text + byteLength; | 1663 const char* stop = text + byteLength; |
1776 AlignProc_scalar alignProc = pick_align_proc_scalar(paint.getTextAlign()); | 1664 SkTextAlignProcScalar alignProc(paint.getTextAlign()); |
1777 TextMapState tms(SkMatrix::I(), constY); | 1665 SkTextMapStateProc tmsProc(SkMatrix::I(), constY, scalarsPerPosition); |
1778 TextMapState::Proc tmsProc = tms.pickProc(scalarsPerPosition); | |
1779 | 1666 |
1780 // Now restore the original settings, so we "draw" with whatever style/strok
ing. | 1667 // Now restore the original settings, so we "draw" with whatever style/strok
ing. |
1781 paint.setStyle(origPaint.getStyle()); | 1668 paint.setStyle(origPaint.getStyle()); |
1782 paint.setPathEffect(origPaint.getPathEffect()); | 1669 paint.setPathEffect(origPaint.getPathEffect()); |
1783 | 1670 |
1784 while (text < stop) { | 1671 while (text < stop) { |
1785 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1672 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
1786 if (glyph.fWidth) { | 1673 if (glyph.fWidth) { |
1787 const SkPath* path = cache->findPath(glyph); | 1674 const SkPath* path = cache->findPath(glyph); |
1788 if (path) { | 1675 if (path) { |
1789 tmsProc(tms, pos); | 1676 SkPoint tmsLoc; |
| 1677 tmsProc(pos, &tmsLoc); |
1790 SkPoint loc; | 1678 SkPoint loc; |
1791 alignProc(tms.fLoc, glyph, &loc); | 1679 alignProc(tmsLoc, glyph, &loc); |
1792 | 1680 |
1793 matrix[SkMatrix::kMTransX] = loc.fX; | 1681 matrix[SkMatrix::kMTransX] = loc.fX; |
1794 matrix[SkMatrix::kMTransY] = loc.fY; | 1682 matrix[SkMatrix::kMTransY] = loc.fY; |
1795 if (fDevice) { | 1683 if (fDevice) { |
1796 fDevice->drawPath(*this, *path, paint, &matrix, false); | 1684 fDevice->drawPath(*this, *path, paint, &matrix, false); |
1797 } else { | 1685 } else { |
1798 this->drawPath(*path, paint, &matrix, false); | 1686 this->drawPath(*path, paint, &matrix, false); |
1799 } | 1687 } |
1800 } | 1688 } |
1801 } | 1689 } |
(...skipping 30 matching lines...) Expand all Loading... |
1832 if (needsRasterTextBlit(*this)) { | 1720 if (needsRasterTextBlit(*this)) { |
1833 blitterChooser.choose(*fBitmap, *fMatrix, paint); | 1721 blitterChooser.choose(*fBitmap, *fMatrix, paint); |
1834 blitter = blitterChooser.get(); | 1722 blitter = blitterChooser.get(); |
1835 if (fRC->isAA()) { | 1723 if (fRC->isAA()) { |
1836 wrapper.init(*fRC, blitter); | 1724 wrapper.init(*fRC, blitter); |
1837 blitter = wrapper.getBlitter(); | 1725 blitter = wrapper.getBlitter(); |
1838 } | 1726 } |
1839 } | 1727 } |
1840 | 1728 |
1841 const char* stop = text + byteLength; | 1729 const char* stop = text + byteLength; |
1842 AlignProc alignProc = pick_align_proc(paint.getTextAlign()); | 1730 SkTextAlignProc alignProc(paint.getTextAlign()); |
1843 SkDraw1Glyph d1g; | 1731 SkDraw1Glyph d1g; |
1844 SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache, paint); | 1732 SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache, paint); |
1845 TextMapState tms(*fMatrix, constY); | 1733 SkTextMapStateProc tmsProc(*fMatrix, constY, scalarsPerPosition); |
1846 TextMapState::Proc tmsProc = tms.pickProc(scalarsPerPosition); | |
1847 | 1734 |
1848 if (cache->isSubpixel()) { | 1735 if (cache->isSubpixel()) { |
1849 // maybe we should skip the rounding if linearText is set | 1736 // maybe we should skip the rounding if linearText is set |
1850 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix); | 1737 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix); |
1851 | 1738 |
1852 SkFixed fxMask = ~0; | 1739 SkFixed fxMask = ~0; |
1853 SkFixed fyMask = ~0; | 1740 SkFixed fyMask = ~0; |
1854 if (kX_SkAxisAlignment == baseline) { | 1741 if (kX_SkAxisAlignment == baseline) { |
1855 fyMask = 0; | 1742 fyMask = 0; |
1856 #ifndef SK_IGNORE_SUBPIXEL_AXIS_ALIGN_FIX | 1743 #ifndef SK_IGNORE_SUBPIXEL_AXIS_ALIGN_FIX |
1857 d1g.fHalfSampleY = SK_FixedHalf; | 1744 d1g.fHalfSampleY = SK_FixedHalf; |
1858 #endif | 1745 #endif |
1859 } else if (kY_SkAxisAlignment == baseline) { | 1746 } else if (kY_SkAxisAlignment == baseline) { |
1860 fxMask = 0; | 1747 fxMask = 0; |
1861 #ifndef SK_IGNORE_SUBPIXEL_AXIS_ALIGN_FIX | 1748 #ifndef SK_IGNORE_SUBPIXEL_AXIS_ALIGN_FIX |
1862 d1g.fHalfSampleX = SK_FixedHalf; | 1749 d1g.fHalfSampleX = SK_FixedHalf; |
1863 #endif | 1750 #endif |
1864 } | 1751 } |
1865 | 1752 |
1866 if (SkPaint::kLeft_Align == paint.getTextAlign()) { | 1753 if (SkPaint::kLeft_Align == paint.getTextAlign()) { |
1867 while (text < stop) { | 1754 while (text < stop) { |
1868 tmsProc(tms, pos); | 1755 SkPoint tmsLoc; |
1869 SkFixed fx = SkScalarToFixed(tms.fLoc.fX) + d1g.fHalfSampleX; | 1756 tmsProc(pos, &tmsLoc); |
1870 SkFixed fy = SkScalarToFixed(tms.fLoc.fY) + d1g.fHalfSampleY; | 1757 SkFixed fx = SkScalarToFixed(tmsLoc.fX) + d1g.fHalfSampleX; |
| 1758 SkFixed fy = SkScalarToFixed(tmsLoc.fY) + d1g.fHalfSampleY; |
1871 | 1759 |
1872 const SkGlyph& glyph = glyphCacheProc(cache, &text, | 1760 const SkGlyph& glyph = glyphCacheProc(cache, &text, |
1873 fx & fxMask, fy & fyMask); | 1761 fx & fxMask, fy & fyMask); |
1874 | 1762 |
1875 if (glyph.fWidth) { | 1763 if (glyph.fWidth) { |
1876 proc(d1g, fx, fy, glyph); | 1764 proc(d1g, fx, fy, glyph); |
1877 } | 1765 } |
1878 pos += scalarsPerPosition; | 1766 pos += scalarsPerPosition; |
1879 } | 1767 } |
1880 } else { | 1768 } else { |
1881 while (text < stop) { | 1769 while (text < stop) { |
1882 const char* currentText = text; | 1770 const char* currentText = text; |
1883 const SkGlyph& metricGlyph = glyphCacheProc(cache, &text, 0, 0); | 1771 const SkGlyph& metricGlyph = glyphCacheProc(cache, &text, 0, 0); |
1884 | 1772 |
1885 if (metricGlyph.fWidth) { | 1773 if (metricGlyph.fWidth) { |
1886 SkDEBUGCODE(SkFixed prevAdvX = metricGlyph.fAdvanceX;) | 1774 SkDEBUGCODE(SkFixed prevAdvX = metricGlyph.fAdvanceX;) |
1887 SkDEBUGCODE(SkFixed prevAdvY = metricGlyph.fAdvanceY;) | 1775 SkDEBUGCODE(SkFixed prevAdvY = metricGlyph.fAdvanceY;) |
1888 | 1776 SkPoint tmsLoc; |
1889 tmsProc(tms, pos); | 1777 tmsProc(pos, &tmsLoc); |
1890 SkIPoint fixedLoc; | 1778 SkIPoint fixedLoc; |
1891 alignProc(tms.fLoc, metricGlyph, &fixedLoc); | 1779 alignProc(tmsLoc, metricGlyph, &fixedLoc); |
1892 | 1780 |
1893 SkFixed fx = fixedLoc.fX + d1g.fHalfSampleX; | 1781 SkFixed fx = fixedLoc.fX + d1g.fHalfSampleX; |
1894 SkFixed fy = fixedLoc.fY + d1g.fHalfSampleY; | 1782 SkFixed fy = fixedLoc.fY + d1g.fHalfSampleY; |
1895 | 1783 |
1896 // have to call again, now that we've been "aligned" | 1784 // have to call again, now that we've been "aligned" |
1897 const SkGlyph& glyph = glyphCacheProc(cache, ¤tText, | 1785 const SkGlyph& glyph = glyphCacheProc(cache, ¤tText, |
1898 fx & fxMask, fy & fyMa
sk); | 1786 fx & fxMask, fy & fyMa
sk); |
1899 // the assumption is that the metrics haven't changed | 1787 // the assumption is that the metrics haven't changed |
1900 SkASSERT(prevAdvX == glyph.fAdvanceX); | 1788 SkASSERT(prevAdvX == glyph.fAdvanceX); |
1901 SkASSERT(prevAdvY == glyph.fAdvanceY); | 1789 SkASSERT(prevAdvY == glyph.fAdvanceY); |
1902 SkASSERT(glyph.fWidth); | 1790 SkASSERT(glyph.fWidth); |
1903 | 1791 |
1904 proc(d1g, fx, fy, glyph); | 1792 proc(d1g, fx, fy, glyph); |
1905 } | 1793 } |
1906 pos += scalarsPerPosition; | 1794 pos += scalarsPerPosition; |
1907 } | 1795 } |
1908 } | 1796 } |
1909 } else { // not subpixel | 1797 } else { // not subpixel |
1910 if (SkPaint::kLeft_Align == paint.getTextAlign()) { | 1798 if (SkPaint::kLeft_Align == paint.getTextAlign()) { |
1911 while (text < stop) { | 1799 while (text < stop) { |
1912 // the last 2 parameters are ignored | 1800 // the last 2 parameters are ignored |
1913 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1801 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
1914 | 1802 |
1915 if (glyph.fWidth) { | 1803 if (glyph.fWidth) { |
1916 tmsProc(tms, pos); | 1804 SkPoint tmsLoc; |
| 1805 tmsProc(pos, &tmsLoc); |
1917 | 1806 |
1918 proc(d1g, | 1807 proc(d1g, |
1919 SkScalarToFixed(tms.fLoc.fX) + SK_FixedHalf, //d1g.fHal
fSampleX, | 1808 SkScalarToFixed(tmsLoc.fX) + SK_FixedHalf, //d1g.fHalfS
ampleX, |
1920 SkScalarToFixed(tms.fLoc.fY) + SK_FixedHalf, //d1g.fHal
fSampleY, | 1809 SkScalarToFixed(tmsLoc.fY) + SK_FixedHalf, //d1g.fHalfS
ampleY, |
1921 glyph); | 1810 glyph); |
1922 } | 1811 } |
1923 pos += scalarsPerPosition; | 1812 pos += scalarsPerPosition; |
1924 } | 1813 } |
1925 } else { | 1814 } else { |
1926 while (text < stop) { | 1815 while (text < stop) { |
1927 // the last 2 parameters are ignored | 1816 // the last 2 parameters are ignored |
1928 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1817 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
1929 | 1818 |
1930 if (glyph.fWidth) { | 1819 if (glyph.fWidth) { |
1931 tmsProc(tms, pos); | 1820 SkPoint tmsLoc; |
| 1821 tmsProc(pos, &tmsLoc); |
1932 | 1822 |
1933 SkIPoint fixedLoc; | 1823 SkIPoint fixedLoc; |
1934 alignProc(tms.fLoc, glyph, &fixedLoc); | 1824 alignProc(tmsLoc, glyph, &fixedLoc); |
1935 | 1825 |
1936 proc(d1g, | 1826 proc(d1g, |
1937 fixedLoc.fX + SK_FixedHalf, //d1g.fHalfSampleX, | 1827 fixedLoc.fX + SK_FixedHalf, //d1g.fHalfSampleX, |
1938 fixedLoc.fY + SK_FixedHalf, //d1g.fHalfSampleY, | 1828 fixedLoc.fY + SK_FixedHalf, //d1g.fHalfSampleY, |
1939 glyph); | 1829 glyph); |
1940 } | 1830 } |
1941 pos += scalarsPerPosition; | 1831 pos += scalarsPerPosition; |
1942 } | 1832 } |
1943 } | 1833 } |
1944 } | 1834 } |
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2477 mask->fImage = SkMask::AllocImage(size); | 2367 mask->fImage = SkMask::AllocImage(size); |
2478 memset(mask->fImage, 0, mask->computeImageSize()); | 2368 memset(mask->fImage, 0, mask->computeImageSize()); |
2479 } | 2369 } |
2480 | 2370 |
2481 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2371 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
2482 draw_into_mask(*mask, devPath, style); | 2372 draw_into_mask(*mask, devPath, style); |
2483 } | 2373 } |
2484 | 2374 |
2485 return true; | 2375 return true; |
2486 } | 2376 } |
OLD | NEW |