| 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 "SkBounder.h" | 10 #include "SkBounder.h" |
| (...skipping 1662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1673 | 1673 |
| 1674 // SkScalarRec doesn't currently have a way of representing hairline stroke
and | 1674 // SkScalarRec doesn't currently have a way of representing hairline stroke
and |
| 1675 // will fill if its frame-width is 0. | 1675 // will fill if its frame-width is 0. |
| 1676 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { | 1676 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { |
| 1677 this->drawText_asPaths(text, byteLength, x, y, paint); | 1677 this->drawText_asPaths(text, byteLength, x, y, paint); |
| 1678 return; | 1678 return; |
| 1679 } | 1679 } |
| 1680 | 1680 |
| 1681 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); | 1681 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); |
| 1682 | 1682 |
| 1683 #if SK_DISTANCEFIELD_FONTS |
| 1684 const SkMatrix* ctm = fMatrix; |
| 1685 const SkPaint* paintRef = &paint; |
| 1686 SkPaint paintCopy; |
| 1687 uint32_t procFlags = fProcs ? fProcs->fFlags : 0; |
| 1688 if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| 1689 paintCopy = paint; |
| 1690 paintCopy.setTextSize(SkDrawProcs::kBaseDFFontSize); |
| 1691 paintCopy.setLCDRenderText(false); |
| 1692 paintRef = &paintCopy; |
| 1693 } |
| 1694 if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { |
| 1695 ctm = NULL; |
| 1696 } |
| 1697 SkAutoGlyphCache autoCache(*paintRef, &fDevice->fLeakyProperties, ctm); |
| 1698 #else |
| 1683 SkAutoGlyphCache autoCache(paint, &fDevice->fLeakyProperties, fMatrix); | 1699 SkAutoGlyphCache autoCache(paint, &fDevice->fLeakyProperties, fMatrix); |
| 1700 #endif |
| 1684 SkGlyphCache* cache = autoCache.getCache(); | 1701 SkGlyphCache* cache = autoCache.getCache(); |
| 1685 | 1702 |
| 1686 // transform our starting point | 1703 // transform our starting point |
| 1704 #if SK_DISTANCEFIELD_FONTS |
| 1705 if (!(procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag)) |
| 1706 #endif |
| 1687 { | 1707 { |
| 1688 SkPoint loc; | 1708 SkPoint loc; |
| 1689 fMatrix->mapXY(x, y, &loc); | 1709 fMatrix->mapXY(x, y, &loc); |
| 1690 x = loc.fX; | 1710 x = loc.fX; |
| 1691 y = loc.fY; | 1711 y = loc.fY; |
| 1692 } | 1712 } |
| 1693 | 1713 |
| 1694 // need to measure first | 1714 // need to measure first |
| 1695 if (paint.getTextAlign() != SkPaint::kLeft_Align) { | 1715 if (paint.getTextAlign() != SkPaint::kLeft_Align) { |
| 1696 SkVector stop; | 1716 SkVector stop; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1735 d1g.fHalfSampleY = SK_FixedHalf; | 1755 d1g.fHalfSampleY = SK_FixedHalf; |
| 1736 } else if (kY_SkAxisAlignment == baseline) { | 1756 } else if (kY_SkAxisAlignment == baseline) { |
| 1737 fxMask = 0; | 1757 fxMask = 0; |
| 1738 d1g.fHalfSampleX = SK_FixedHalf; | 1758 d1g.fHalfSampleX = SK_FixedHalf; |
| 1739 } | 1759 } |
| 1740 } | 1760 } |
| 1741 | 1761 |
| 1742 SkFixed fx = SkScalarToFixed(x) + d1g.fHalfSampleX; | 1762 SkFixed fx = SkScalarToFixed(x) + d1g.fHalfSampleX; |
| 1743 SkFixed fy = SkScalarToFixed(y) + d1g.fHalfSampleY; | 1763 SkFixed fy = SkScalarToFixed(y) + d1g.fHalfSampleY; |
| 1744 | 1764 |
| 1765 #if SK_DISTANCEFIELD_FONTS |
| 1766 SkFixed fixedScale; |
| 1767 if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| 1768 fixedScale = SkScalarToFixed(paint.getTextSize()/(float)SkDrawProcs::kBa
seDFFontSize); |
| 1769 } |
| 1770 #endif |
| 1745 while (text < stop) { | 1771 while (text < stop) { |
| 1746 const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fy
Mask); | 1772 const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fy
Mask); |
| 1747 | 1773 |
| 1774 #if SK_DISTANCEFIELD_FONTS |
| 1775 if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| 1776 fx += SkFixedMul_portable(autokern.adjust(glyph), fixedScale); |
| 1777 } else { |
| 1778 fx += autokern.adjust(glyph); |
| 1779 } |
| 1780 #else |
| 1748 fx += autokern.adjust(glyph); | 1781 fx += autokern.adjust(glyph); |
| 1782 #endif |
| 1749 | 1783 |
| 1750 if (glyph.fWidth) { | 1784 if (glyph.fWidth) { |
| 1751 proc(d1g, fx, fy, glyph); | 1785 proc(d1g, fx, fy, glyph); |
| 1752 } | 1786 } |
| 1787 |
| 1788 #if SK_DISTANCEFIELD_FONTS |
| 1789 if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| 1790 fx += SkFixedMul_portable(glyph.fAdvanceX, fixedScale); |
| 1791 fy += SkFixedMul_portable(glyph.fAdvanceY, fixedScale); |
| 1792 } else { |
| 1793 fx += glyph.fAdvanceX; |
| 1794 fy += glyph.fAdvanceY; |
| 1795 } |
| 1796 #else |
| 1753 fx += glyph.fAdvanceX; | 1797 fx += glyph.fAdvanceX; |
| 1754 fy += glyph.fAdvanceY; | 1798 fy += glyph.fAdvanceY; |
| 1799 #endif |
| 1755 } | 1800 } |
| 1756 } | 1801 } |
| 1757 | 1802 |
| 1758 // last parameter is interpreted as SkFixed [x, y] | 1803 // last parameter is interpreted as SkFixed [x, y] |
| 1759 // return the fixed position, which may be rounded or not by the caller | 1804 // return the fixed position, which may be rounded or not by the caller |
| 1760 // e.g. subpixel doesn't round | 1805 // e.g. subpixel doesn't round |
| 1761 typedef void (*AlignProc)(const SkPoint&, const SkGlyph&, SkIPoint*); | 1806 typedef void (*AlignProc)(const SkPoint&, const SkGlyph&, SkIPoint*); |
| 1762 | 1807 |
| 1763 static void leftAlignProc(const SkPoint& loc, const SkGlyph& glyph, | 1808 static void leftAlignProc(const SkPoint& loc, const SkGlyph& glyph, |
| 1764 SkIPoint* dst) { | 1809 SkIPoint* dst) { |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1902 return; | 1947 return; |
| 1903 } | 1948 } |
| 1904 | 1949 |
| 1905 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { | 1950 if (ShouldDrawTextAsPaths(paint, *fMatrix)) { |
| 1906 this->drawPosText_asPaths(text, byteLength, pos, constY, | 1951 this->drawPosText_asPaths(text, byteLength, pos, constY, |
| 1907 scalarsPerPosition, paint); | 1952 scalarsPerPosition, paint); |
| 1908 return; | 1953 return; |
| 1909 } | 1954 } |
| 1910 | 1955 |
| 1911 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); | 1956 SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); |
| 1957 #if SK_DISTANCEFIELD_FONTS |
| 1958 const SkMatrix* ctm = fMatrix; |
| 1959 const SkPaint* paintRef = &paint; |
| 1960 SkPaint paintCopy; |
| 1961 uint32_t procFlags = fProcs ? fProcs->fFlags : 0; |
| 1962 if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| 1963 paintCopy = paint; |
| 1964 paintCopy.setTextSize(SkDrawProcs::kBaseDFFontSize); |
| 1965 paintRef = &paintCopy; |
| 1966 } |
| 1967 if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { |
| 1968 ctm = NULL; |
| 1969 } |
| 1970 SkAutoGlyphCache autoCache(*paintRef, &fDevice->fLeakyProperties, ctm); |
| 1971 #else |
| 1912 SkAutoGlyphCache autoCache(paint, &fDevice->fLeakyProperties, fMatrix); | 1972 SkAutoGlyphCache autoCache(paint, &fDevice->fLeakyProperties, fMatrix); |
| 1973 #endif |
| 1913 SkGlyphCache* cache = autoCache.getCache(); | 1974 SkGlyphCache* cache = autoCache.getCache(); |
| 1914 | 1975 |
| 1915 SkAAClipBlitterWrapper wrapper; | 1976 SkAAClipBlitterWrapper wrapper; |
| 1916 SkAutoBlitterChoose blitterChooser; | 1977 SkAutoBlitterChoose blitterChooser; |
| 1917 SkBlitter* blitter = NULL; | 1978 SkBlitter* blitter = NULL; |
| 1918 if (needsRasterTextBlit(*this)) { | 1979 if (needsRasterTextBlit(*this)) { |
| 1919 blitterChooser.choose(*fBitmap, *fMatrix, paint); | 1980 blitterChooser.choose(*fBitmap, *fMatrix, paint); |
| 1920 blitter = blitterChooser.get(); | 1981 blitter = blitterChooser.get(); |
| 1921 if (fRC->isAA()) { | 1982 if (fRC->isAA()) { |
| 1922 wrapper.init(*fRC, blitter); | 1983 wrapper.init(*fRC, blitter); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1944 #endif | 2005 #endif |
| 1945 } else if (kY_SkAxisAlignment == baseline) { | 2006 } else if (kY_SkAxisAlignment == baseline) { |
| 1946 fxMask = 0; | 2007 fxMask = 0; |
| 1947 #ifndef SK_IGNORE_SUBPIXEL_AXIS_ALIGN_FIX | 2008 #ifndef SK_IGNORE_SUBPIXEL_AXIS_ALIGN_FIX |
| 1948 d1g.fHalfSampleX = SK_FixedHalf; | 2009 d1g.fHalfSampleX = SK_FixedHalf; |
| 1949 #endif | 2010 #endif |
| 1950 } | 2011 } |
| 1951 | 2012 |
| 1952 if (SkPaint::kLeft_Align == paint.getTextAlign()) { | 2013 if (SkPaint::kLeft_Align == paint.getTextAlign()) { |
| 1953 while (text < stop) { | 2014 while (text < stop) { |
| 2015 #if SK_DISTANCEFIELD_FONTS |
| 2016 if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { |
| 2017 tms.fLoc.fX = *pos; |
| 2018 tms.fLoc.fY = *(pos+1); |
| 2019 } else { |
| 2020 tmsProc(tms, pos); |
| 2021 } |
| 2022 #else |
| 1954 tmsProc(tms, pos); | 2023 tmsProc(tms, pos); |
| 1955 | 2024 #endif |
| 1956 SkFixed fx = SkScalarToFixed(tms.fLoc.fX) + d1g.fHalfSampleX; | 2025 SkFixed fx = SkScalarToFixed(tms.fLoc.fX) + d1g.fHalfSampleX; |
| 1957 SkFixed fy = SkScalarToFixed(tms.fLoc.fY) + d1g.fHalfSampleY; | 2026 SkFixed fy = SkScalarToFixed(tms.fLoc.fY) + d1g.fHalfSampleY; |
| 1958 | 2027 |
| 1959 const SkGlyph& glyph = glyphCacheProc(cache, &text, | 2028 const SkGlyph& glyph = glyphCacheProc(cache, &text, |
| 1960 fx & fxMask, fy & fyMask); | 2029 fx & fxMask, fy & fyMask); |
| 1961 | 2030 |
| 1962 if (glyph.fWidth) { | 2031 if (glyph.fWidth) { |
| 1963 proc(d1g, fx, fy, glyph); | 2032 proc(d1g, fx, fy, glyph); |
| 1964 } | 2033 } |
| 1965 pos += scalarsPerPosition; | 2034 pos += scalarsPerPosition; |
| (...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2826 mask->fImage = SkMask::AllocImage(size); | 2895 mask->fImage = SkMask::AllocImage(size); |
| 2827 memset(mask->fImage, 0, mask->computeImageSize()); | 2896 memset(mask->fImage, 0, mask->computeImageSize()); |
| 2828 } | 2897 } |
| 2829 | 2898 |
| 2830 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2899 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
| 2831 draw_into_mask(*mask, devPath, style); | 2900 draw_into_mask(*mask, devPath, style); |
| 2832 } | 2901 } |
| 2833 | 2902 |
| 2834 return true; | 2903 return true; |
| 2835 } | 2904 } |
| OLD | NEW |