OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
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 #include "GrAtlasTextContext.h" | 7 #include "GrAtlasTextContext.h" |
8 | 8 |
9 #include "GrBatch.h" | 9 #include "GrBatch.h" |
10 #include "GrBatchFontCache.h" | 10 #include "GrBatchFontCache.h" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 | 92 |
93 }; | 93 }; |
94 | 94 |
95 // TODO | 95 // TODO |
96 // Distance field text in textblobs | 96 // Distance field text in textblobs |
97 | 97 |
98 GrAtlasTextContext::GrAtlasTextContext(GrContext* context, | 98 GrAtlasTextContext::GrAtlasTextContext(GrContext* context, |
99 GrDrawContext* drawContext, | 99 GrDrawContext* drawContext, |
100 const SkDeviceProperties& properties) | 100 const SkDeviceProperties& properties) |
101 : INHERITED(context, drawContext, properties) | 101 : INHERITED(context, drawContext, properties) |
102 , fDistanceAdjustTable(SkNEW_ARGS(DistanceAdjustTable, (properties.gamma()))
) { | 102 , fDistanceAdjustTable(SkNEW(DistanceAdjustTable)) { |
103 // We overallocate vertices in our textblobs based on the assumption that A8
has the greatest | 103 // We overallocate vertices in our textblobs based on the assumption that A8
has the greatest |
104 // vertexStride | 104 // vertexStride |
105 SK_COMPILE_ASSERT(kGrayTextVASize >= kColorTextVASize && kGrayTextVASize >=
kLCDTextVASize, | 105 SK_COMPILE_ASSERT(kGrayTextVASize >= kColorTextVASize && kGrayTextVASize >=
kLCDTextVASize, |
106 vertex_attribute_changed); | 106 vertex_attribute_changed); |
107 fCurrStrike = NULL; | 107 fCurrStrike = NULL; |
108 fCache = context->getTextBlobCache(); | 108 fCache = context->getTextBlobCache(); |
109 } | 109 } |
110 | 110 |
111 void GrAtlasTextContext::DistanceAdjustTable::buildDistanceAdjustTable(float gam
ma) { | 111 void GrAtlasTextContext::DistanceAdjustTable::buildDistanceAdjustTable() { |
112 | 112 |
113 // This is used for an approximation of the mask gamma hack, used by raster
and bitmap | 113 // This is used for an approximation of the mask gamma hack, used by raster
and bitmap |
114 // text. The mask gamma hack is based off of guessing what the blend color i
s going to | 114 // text. The mask gamma hack is based off of guessing what the blend color i
s going to |
115 // be, and adjusting the mask so that when run through the linear blend will | 115 // be, and adjusting the mask so that when run through the linear blend will |
116 // produce the value closest to the desired result. However, in practice thi
s means | 116 // produce the value closest to the desired result. However, in practice thi
s means |
117 // that the 'adjusted' mask is just increasing or decreasing the coverage of | 117 // that the 'adjusted' mask is just increasing or decreasing the coverage of |
118 // the mask depending on what it is thought it will blit against. For black
(on | 118 // the mask depending on what it is thought it will blit against. For black
(on |
119 // assumed white) this means that coverages are decreased (on a curve). For
white (on | 119 // assumed white) this means that coverages are decreased (on a curve). For
white (on |
120 // assumed black) this means that coverages are increased (on a a curve). At | 120 // assumed black) this means that coverages are increased (on a a curve). At |
121 // middle (perceptual) gray (which could be blit against anything) the cover
ages | 121 // middle (perceptual) gray (which could be blit against anything) the cover
ages |
(...skipping 24 matching lines...) Expand all Loading... |
146 // previously covered at all. | 146 // previously covered at all. |
147 | 147 |
148 int width, height; | 148 int width, height; |
149 size_t size; | 149 size_t size; |
150 | 150 |
151 #ifdef SK_GAMMA_CONTRAST | 151 #ifdef SK_GAMMA_CONTRAST |
152 SkScalar contrast = SK_GAMMA_CONTRAST; | 152 SkScalar contrast = SK_GAMMA_CONTRAST; |
153 #else | 153 #else |
154 SkScalar contrast = 0.5f; | 154 SkScalar contrast = 0.5f; |
155 #endif | 155 #endif |
156 SkScalar paintGamma = gamma; | 156 SkScalar paintGamma = SK_GAMMA_EXPONENT; |
157 SkScalar deviceGamma = gamma; | 157 SkScalar deviceGamma = SK_GAMMA_EXPONENT; |
158 | 158 |
159 size = SkScalerContext::GetGammaLUTSize(contrast, paintGamma, deviceGamma, | 159 size = SkScalerContext::GetGammaLUTSize(contrast, paintGamma, deviceGamma, |
160 &width, &height); | 160 &width, &height); |
161 | 161 |
162 SkASSERT(kExpectedDistanceAdjustTableSize == height); | 162 SkASSERT(kExpectedDistanceAdjustTableSize == height); |
163 fTable = SkNEW_ARRAY(SkScalar, height); | 163 fTable = SkNEW_ARRAY(SkScalar, height); |
164 | 164 |
165 SkAutoTArray<uint8_t> data((int)size); | 165 SkAutoTArray<uint8_t> data((int)size); |
166 SkScalerContext::GetGammaLUTData(contrast, paintGamma, deviceGamma, data.get
()); | 166 SkScalerContext::GetGammaLUTData(contrast, paintGamma, deviceGamma, data.get
()); |
167 | 167 |
(...skipping 1275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1443 | 1443 |
1444 static BitmapTextBatch* Create(GrMaskFormat maskFormat, int glyphCount, | 1444 static BitmapTextBatch* Create(GrMaskFormat maskFormat, int glyphCount, |
1445 GrBatchFontCache* fontCache) { | 1445 GrBatchFontCache* fontCache) { |
1446 return SkNEW_ARGS(BitmapTextBatch, (maskFormat, glyphCount, fontCache)); | 1446 return SkNEW_ARGS(BitmapTextBatch, (maskFormat, glyphCount, fontCache)); |
1447 } | 1447 } |
1448 | 1448 |
1449 static BitmapTextBatch* Create(GrMaskFormat maskFormat, int glyphCount, | 1449 static BitmapTextBatch* Create(GrMaskFormat maskFormat, int glyphCount, |
1450 GrBatchFontCache* fontCache, | 1450 GrBatchFontCache* fontCache, |
1451 DistanceAdjustTable* distanceAdjustTable, | 1451 DistanceAdjustTable* distanceAdjustTable, |
1452 SkColor filteredColor, bool useLCDText, | 1452 SkColor filteredColor, bool useLCDText, |
1453 bool useBGR, float gamma) { | 1453 bool useBGR) { |
1454 return SkNEW_ARGS(BitmapTextBatch, (maskFormat, glyphCount, fontCache, d
istanceAdjustTable, | 1454 return SkNEW_ARGS(BitmapTextBatch, (maskFormat, glyphCount, fontCache, d
istanceAdjustTable, |
1455 filteredColor, useLCDText, useBGR, g
amma)); | 1455 filteredColor, useLCDText, useBGR)); |
1456 } | 1456 } |
1457 | 1457 |
1458 const char* name() const override { return "BitmapTextBatch"; } | 1458 const char* name() const override { return "BitmapTextBatch"; } |
1459 | 1459 |
1460 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 1460 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
1461 if (kARGB_GrMaskFormat == fMaskFormat) { | 1461 if (kARGB_GrMaskFormat == fMaskFormat) { |
1462 out->setUnknownFourComponents(); | 1462 out->setUnknownFourComponents(); |
1463 } else { | 1463 } else { |
1464 out->setKnownFourComponents(fBatch.fColor); | 1464 out->setKnownFourComponents(fBatch.fColor); |
1465 } | 1465 } |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1766 , fFontCache(fontCache) | 1766 , fFontCache(fontCache) |
1767 , fUseDistanceFields(false) { | 1767 , fUseDistanceFields(false) { |
1768 this->initClassID<BitmapTextBatch>(); | 1768 this->initClassID<BitmapTextBatch>(); |
1769 fBatch.fNumGlyphs = glyphCount; | 1769 fBatch.fNumGlyphs = glyphCount; |
1770 fInstanceCount = 1; | 1770 fInstanceCount = 1; |
1771 fAllocatedCount = kMinAllocated; | 1771 fAllocatedCount = kMinAllocated; |
1772 } | 1772 } |
1773 | 1773 |
1774 BitmapTextBatch(GrMaskFormat maskFormat, int glyphCount, GrBatchFontCache* f
ontCache, | 1774 BitmapTextBatch(GrMaskFormat maskFormat, int glyphCount, GrBatchFontCache* f
ontCache, |
1775 DistanceAdjustTable* distanceAdjustTable, SkColor filteredCo
lor, | 1775 DistanceAdjustTable* distanceAdjustTable, SkColor filteredCo
lor, |
1776 bool useLCDText, bool useBGR, float gamma) | 1776 bool useLCDText, bool useBGR) |
1777 : fMaskFormat(maskFormat) | 1777 : fMaskFormat(maskFormat) |
1778 , fPixelConfig(fontCache->getPixelConfig(maskFormat)) | 1778 , fPixelConfig(fontCache->getPixelConfig(maskFormat)) |
1779 , fFontCache(fontCache) | 1779 , fFontCache(fontCache) |
1780 , fDistanceAdjustTable(SkRef(distanceAdjustTable)) | 1780 , fDistanceAdjustTable(SkRef(distanceAdjustTable)) |
1781 , fFilteredColor(filteredColor) | 1781 , fFilteredColor(filteredColor) |
1782 , fUseDistanceFields(true) | 1782 , fUseDistanceFields(true) |
1783 , fUseLCDText(useLCDText) | 1783 , fUseLCDText(useLCDText) |
1784 , fUseBGR(useBGR) | 1784 , fUseBGR(useBGR) { |
1785 , fGamma(gamma) { | |
1786 this->initClassID<BitmapTextBatch>(); | 1785 this->initClassID<BitmapTextBatch>(); |
1787 fBatch.fNumGlyphs = glyphCount; | 1786 fBatch.fNumGlyphs = glyphCount; |
1788 fInstanceCount = 1; | 1787 fInstanceCount = 1; |
1789 fAllocatedCount = kMinAllocated; | 1788 fAllocatedCount = kMinAllocated; |
1790 SkASSERT(fMaskFormat == kA8_GrMaskFormat); | 1789 SkASSERT(fMaskFormat == kA8_GrMaskFormat); |
1791 } | 1790 } |
1792 | 1791 |
1793 ~BitmapTextBatch() { | 1792 ~BitmapTextBatch() { |
1794 for (int i = 0; i < fInstanceCount; i++) { | 1793 for (int i = 0; i < fInstanceCount; i++) { |
1795 fGeoData[i].fBlob->unref(); | 1794 fGeoData[i].fBlob->unref(); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1905 } | 1904 } |
1906 | 1905 |
1907 if (fUseLCDText != that->fUseLCDText) { | 1906 if (fUseLCDText != that->fUseLCDText) { |
1908 return false; | 1907 return false; |
1909 } | 1908 } |
1910 | 1909 |
1911 if (fUseBGR != that->fUseBGR) { | 1910 if (fUseBGR != that->fUseBGR) { |
1912 return false; | 1911 return false; |
1913 } | 1912 } |
1914 | 1913 |
1915 if (fGamma != that->fGamma) { | |
1916 return false; | |
1917 } | |
1918 | |
1919 // TODO see note above | 1914 // TODO see note above |
1920 if (fUseLCDText && this->color() != that->color()) { | 1915 if (fUseLCDText && this->color() != that->color()) { |
1921 return false; | 1916 return false; |
1922 } | 1917 } |
1923 } | 1918 } |
1924 | 1919 |
1925 fBatch.fNumGlyphs += that->numGlyphs(); | 1920 fBatch.fNumGlyphs += that->numGlyphs(); |
1926 | 1921 |
1927 // copy that->geoData(). We do this manually for performance reasons | 1922 // copy that->geoData(). We do this manually for performance reasons |
1928 SkAutoSTMalloc<kMinAllocated, Geometry>* otherGeoData = that->geoData(); | 1923 SkAutoSTMalloc<kMinAllocated, Geometry>* otherGeoData = that->geoData(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1979 return GrDistanceFieldLCDTextGeoProc::Create(color, | 1974 return GrDistanceFieldLCDTextGeoProc::Create(color, |
1980 viewMatrix, | 1975 viewMatrix, |
1981 texture, | 1976 texture, |
1982 params, | 1977 params, |
1983 widthAdjust, | 1978 widthAdjust, |
1984 flags, | 1979 flags, |
1985 this->usesLocalCoords()
); | 1980 this->usesLocalCoords()
); |
1986 } else { | 1981 } else { |
1987 flags |= kColorAttr_DistanceFieldEffectFlag; | 1982 flags |= kColorAttr_DistanceFieldEffectFlag; |
1988 #ifdef SK_GAMMA_APPLY_TO_A8 | 1983 #ifdef SK_GAMMA_APPLY_TO_A8 |
1989 U8CPU lum = SkColorSpaceLuminance::computeLuminance(fGamma, filtered
Color); | 1984 U8CPU lum = SkColorSpaceLuminance::computeLuminance(SK_GAMMA_EXPONEN
T, filteredColor); |
1990 float correction = (*fDistanceAdjustTable)[lum >> kDistanceAdjustLum
Shift]; | 1985 float correction = (*fDistanceAdjustTable)[lum >> kDistanceAdjustLum
Shift]; |
1991 return GrDistanceFieldA8TextGeoProc::Create(color, | 1986 return GrDistanceFieldA8TextGeoProc::Create(color, |
1992 viewMatrix, | 1987 viewMatrix, |
1993 texture, | 1988 texture, |
1994 params, | 1989 params, |
1995 correction, | 1990 correction, |
1996 flags, | 1991 flags, |
1997 this->usesLocalCoords())
; | 1992 this->usesLocalCoords())
; |
1998 #else | 1993 #else |
1999 return GrDistanceFieldA8TextGeoProc::Create(color, | 1994 return GrDistanceFieldA8TextGeoProc::Create(color, |
(...skipping 18 matching lines...) Expand all Loading... |
2018 | 2013 |
2019 BatchTracker fBatch; | 2014 BatchTracker fBatch; |
2020 SkAutoSTMalloc<kMinAllocated, Geometry> fGeoData; | 2015 SkAutoSTMalloc<kMinAllocated, Geometry> fGeoData; |
2021 int fInstanceCount; | 2016 int fInstanceCount; |
2022 int fAllocatedCount; | 2017 int fAllocatedCount; |
2023 GrMaskFormat fMaskFormat; | 2018 GrMaskFormat fMaskFormat; |
2024 GrPixelConfig fPixelConfig; | 2019 GrPixelConfig fPixelConfig; |
2025 GrBatchFontCache* fFontCache; | 2020 GrBatchFontCache* fFontCache; |
2026 | 2021 |
2027 // Distance field properties | 2022 // Distance field properties |
2028 SkAutoTUnref<DistanceAdjustTable> fDistanceAdjustTable; | 2023 SkAutoTUnref<const DistanceAdjustTable> fDistanceAdjustTable; |
2029 SkColor fFilteredColor; | 2024 SkColor fFilteredColor; |
2030 bool fUseDistanceFields; | 2025 bool fUseDistanceFields; |
2031 bool fUseLCDText; | 2026 bool fUseLCDText; |
2032 bool fUseBGR; | 2027 bool fUseBGR; |
2033 float fGamma; | |
2034 }; | 2028 }; |
2035 | 2029 |
2036 void GrAtlasTextContext::flushRunAsPaths(GrRenderTarget* rt, const SkTextBlob::R
unIterator& it, | 2030 void GrAtlasTextContext::flushRunAsPaths(GrRenderTarget* rt, const SkTextBlob::R
unIterator& it, |
2037 const GrClip& clip, const SkPaint& skPa
int, | 2031 const GrClip& clip, const SkPaint& skPa
int, |
2038 SkDrawFilter* drawFilter, const SkMatri
x& viewMatrix, | 2032 SkDrawFilter* drawFilter, const SkMatri
x& viewMatrix, |
2039 const SkIRect& clipBounds, SkScalar x,
SkScalar y) { | 2033 const SkIRect& clipBounds, SkScalar x,
SkScalar y) { |
2040 SkPaint runPaint = skPaint; | 2034 SkPaint runPaint = skPaint; |
2041 | 2035 |
2042 size_t textLen = it.glyphCount() * sizeof(uint16_t); | 2036 size_t textLen = it.glyphCount() * sizeof(uint16_t); |
2043 const SkPoint& offset = it.offset(); | 2037 const SkPoint& offset = it.offset(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2088 BitmapTextBatch* batch; | 2082 BitmapTextBatch* batch; |
2089 if (info.fDrawAsDistanceFields) { | 2083 if (info.fDrawAsDistanceFields) { |
2090 SkColor filteredColor; | 2084 SkColor filteredColor; |
2091 SkColorFilter* colorFilter = skPaint.getColorFilter(); | 2085 SkColorFilter* colorFilter = skPaint.getColorFilter(); |
2092 if (colorFilter) { | 2086 if (colorFilter) { |
2093 filteredColor = colorFilter->filterColor(skPaint.getColor()); | 2087 filteredColor = colorFilter->filterColor(skPaint.getColor()); |
2094 } else { | 2088 } else { |
2095 filteredColor = skPaint.getColor(); | 2089 filteredColor = skPaint.getColor(); |
2096 } | 2090 } |
2097 bool useBGR = SkPixelGeometryIsBGR(fDeviceProperties.pixelGeometry()); | 2091 bool useBGR = SkPixelGeometryIsBGR(fDeviceProperties.pixelGeometry()); |
2098 float gamma = fDeviceProperties.gamma(); | |
2099 batch = BitmapTextBatch::Create(format, glyphCount, fContext->getBatchFo
ntCache(), | 2092 batch = BitmapTextBatch::Create(format, glyphCount, fContext->getBatchFo
ntCache(), |
2100 fDistanceAdjustTable, filteredColor, | 2093 fDistanceAdjustTable, filteredColor, |
2101 info.fUseLCDText, useBGR, | 2094 info.fUseLCDText, useBGR); |
2102 gamma); | |
2103 } else { | 2095 } else { |
2104 batch = BitmapTextBatch::Create(format, glyphCount, fContext->getBatchFo
ntCache()); | 2096 batch = BitmapTextBatch::Create(format, glyphCount, fContext->getBatchFo
ntCache()); |
2105 } | 2097 } |
2106 BitmapTextBatch::Geometry& geometry = batch->geometry(); | 2098 BitmapTextBatch::Geometry& geometry = batch->geometry(); |
2107 geometry.fBlob = SkRef(cacheBlob); | 2099 geometry.fBlob = SkRef(cacheBlob); |
2108 geometry.fRun = run; | 2100 geometry.fRun = run; |
2109 geometry.fSubRun = subRun; | 2101 geometry.fSubRun = subRun; |
2110 geometry.fColor = subRunColor; | 2102 geometry.fColor = subRunColor; |
2111 geometry.fTransX = transX; | 2103 geometry.fTransX = transX; |
2112 geometry.fTransY = transY; | 2104 geometry.fTransY = transY; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2272 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, | 2264 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, |
2273 static_cast<size_t>(textLen), 0, 0,
noClip)); | 2265 static_cast<size_t>(textLen), 0, 0,
noClip)); |
2274 | 2266 |
2275 SkScalar transX = static_cast<SkScalar>(random->nextU()); | 2267 SkScalar transX = static_cast<SkScalar>(random->nextU()); |
2276 SkScalar transY = static_cast<SkScalar>(random->nextU()); | 2268 SkScalar transY = static_cast<SkScalar>(random->nextU()); |
2277 const GrAtlasTextContext::BitmapTextBlob::Run::SubRunInfo& info = blob->fRun
s[0].fSubRunInfo[0]; | 2269 const GrAtlasTextContext::BitmapTextBlob::Run::SubRunInfo& info = blob->fRun
s[0].fSubRunInfo[0]; |
2278 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); | 2270 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); |
2279 } | 2271 } |
2280 | 2272 |
2281 #endif | 2273 #endif |
OLD | NEW |