blob: fb041e0268ba05c32155ca1f6af89cde31bedfe4 [file] [log] [blame]
joshualitta751c972015-11-20 13:37:32 -08001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Brian Salomon09e019e2016-12-15 10:20:35 -05008#include "GrAtlasTextOp.h"
joshualitta751c972015-11-20 13:37:32 -08009
Robert Phillips296b1cc2017-03-15 10:42:12 -040010#include "GrContext.h"
Brian Salomon742e31d2016-12-07 17:06:19 -050011#include "GrOpFlushState.h"
joshualitta751c972015-11-20 13:37:32 -080012#include "GrResourceProvider.h"
13
joshualitta751c972015-11-20 13:37:32 -080014#include "SkGlyphCache.h"
halcanary4dbbd042016-06-07 17:21:10 -070015#include "SkMathPriv.h"
joshualitta751c972015-11-20 13:37:32 -080016
17#include "effects/GrBitmapTextGeoProc.h"
18#include "effects/GrDistanceFieldGeoProc.h"
Brian Salomonf856fd12016-12-16 14:24:34 -050019#include "text/GrAtlasGlyphCache.h"
joshualitta751c972015-11-20 13:37:32 -080020
joshualitt60ce86d2015-11-23 13:08:22 -080021///////////////////////////////////////////////////////////////////////////////////////////////////
22
joshualitta751c972015-11-20 13:37:32 -080023static const int kDistanceAdjustLumShift = 5;
24
Brian Salomon344ec422016-12-15 10:58:41 -050025SkString GrAtlasTextOp::dumpInfo() const {
joshualitta751c972015-11-20 13:37:32 -080026 SkString str;
27
28 for (int i = 0; i < fGeoCount; ++i) {
29 str.appendf("%d: Color: 0x%08x Trans: %.2f,%.2f Runs: %d\n",
30 i,
31 fGeoData[i].fColor,
joshualitt8e0ef292016-02-19 14:13:03 -080032 fGeoData[i].fX,
33 fGeoData[i].fY,
joshualittddd22d82016-02-16 06:47:52 -080034 fGeoData[i].fBlob->runCount());
joshualitta751c972015-11-20 13:37:32 -080035 }
36
Brian Salomon44acb5b2017-07-18 19:59:24 -040037 str += fProcessors.dumpProcessors();
38 str += INHERITED::dumpInfo();
joshualitta751c972015-11-20 13:37:32 -080039 return str;
40}
41
Brian Salomon44acb5b2017-07-18 19:59:24 -040042GrDrawOp::FixedFunctionFlags GrAtlasTextOp::fixedFunctionFlags() const {
43 return FixedFunctionFlags::kNone;
44}
45
46GrDrawOp::RequiresDstTexture GrAtlasTextOp::finalize(const GrCaps& caps,
Brian Osman9a725dd2017-09-20 09:53:22 -040047 const GrAppliedClip* clip,
48 GrPixelConfigIsClamped dstIsClamped) {
Brian Salomon44acb5b2017-07-18 19:59:24 -040049 GrProcessorAnalysisCoverage coverage;
50 GrProcessorAnalysisColor color;
joshualitta751c972015-11-20 13:37:32 -080051 if (kColorBitmapMask_MaskType == fMaskType) {
Brian Salomon44acb5b2017-07-18 19:59:24 -040052 color.setToUnknown();
joshualitta751c972015-11-20 13:37:32 -080053 } else {
Brian Salomon44acb5b2017-07-18 19:59:24 -040054 color.setToConstant(fColor);
joshualitta751c972015-11-20 13:37:32 -080055 }
joshualitta751c972015-11-20 13:37:32 -080056 switch (fMaskType) {
joshualitta751c972015-11-20 13:37:32 -080057 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -040058 case kAliasedDistanceField_MaskType:
59 case kGrayscaleDistanceField_MaskType:
Brian Salomon44acb5b2017-07-18 19:59:24 -040060 coverage = GrProcessorAnalysisCoverage::kSingleChannel;
joshualitta751c972015-11-20 13:37:32 -080061 break;
62 case kLCDCoverageMask_MaskType:
63 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -040064 case kLCDBGRDistanceField_MaskType:
Brian Salomon44acb5b2017-07-18 19:59:24 -040065 coverage = GrProcessorAnalysisCoverage::kLCD;
joshualitta751c972015-11-20 13:37:32 -080066 break;
67 case kColorBitmapMask_MaskType:
Brian Salomon44acb5b2017-07-18 19:59:24 -040068 coverage = GrProcessorAnalysisCoverage::kNone;
Brian Salomonc0b642c2017-03-27 13:09:36 -040069 break;
joshualitta751c972015-11-20 13:37:32 -080070 }
Brian Osman9a725dd2017-09-20 09:53:22 -040071 auto analysis = fProcessors.finalize(color, coverage, clip, false, caps, dstIsClamped, &fColor);
Brian Salomon44acb5b2017-07-18 19:59:24 -040072 fUsesLocalCoords = analysis.usesLocalCoords();
73 fCanCombineOnTouchOrOverlap =
74 !analysis.requiresDstTexture() &&
75 !(fProcessors.xferProcessor() && fProcessors.xferProcessor()->xferBarrierType(caps));
76 return analysis.requiresDstTexture() ? RequiresDstTexture::kYes : RequiresDstTexture::kNo;
joshualitta751c972015-11-20 13:37:32 -080077}
78
Jim Van Verth58c3cce2017-10-19 15:50:24 -040079static void clip_quads(const SkIRect& clipRect,
80 unsigned char* currVertex, unsigned char* blobVertices,
81 size_t vertexStride, int glyphCount) {
82 for (int i = 0; i < glyphCount; ++i) {
83 SkPoint* blobPositionLT = reinterpret_cast<SkPoint*>(blobVertices);
84 SkPoint* blobPositionRB = reinterpret_cast<SkPoint*>(blobVertices + 3*vertexStride);
85
86 SkRect positionRect = SkRect::MakeLTRB(blobPositionLT->fX,
87 blobPositionLT->fY,
88 blobPositionRB->fX,
89 blobPositionRB->fY);
90 if (clipRect.contains(positionRect)) {
91 memcpy(currVertex, blobVertices, 4 * vertexStride);
92 currVertex += 4 * vertexStride;
93 } else {
94 // Pull out some more data that we'll need.
95 // In the LCD case the color will be garbage, but we'll overwrite it with the texcoords
96 // and it avoids a lot of conditionals.
97 SkColor color = *reinterpret_cast<SkColor*>(blobVertices + sizeof(SkPoint));
98 size_t coordOffset = vertexStride - sizeof(SkIPoint16);
99 SkIPoint16* blobCoordsLT = reinterpret_cast<SkIPoint16*>(blobVertices + coordOffset);
100 SkIPoint16* blobCoordsRB = reinterpret_cast<SkIPoint16*>(blobVertices +
101 3*vertexStride +
102 coordOffset);
103 SkIRect coordsRect = SkIRect::MakeLTRB(blobCoordsLT->fX >> 1,
104 blobCoordsLT->fY >> 1,
105 blobCoordsRB->fX >> 1,
106 blobCoordsRB->fY >> 1);
107 int pageIndexX = blobCoordsLT->fX & 0x1;
108 int pageIndexY = blobCoordsLT->fY & 0x1;
109
110 SkASSERT(positionRect.width() == coordsRect.width());
111
112 // Clip position and texCoords to the clipRect
113 if (positionRect.fLeft < clipRect.fLeft) {
114 coordsRect.fLeft += clipRect.fLeft - positionRect.fLeft;
115 positionRect.fLeft = clipRect.fLeft;
116 }
117 if (positionRect.fTop < clipRect.fTop) {
118 coordsRect.fTop += clipRect.fTop - positionRect.fTop;
119 positionRect.fTop = clipRect.fTop;
120 }
121 if (positionRect.fRight > clipRect.fRight) {
122 coordsRect.fRight += clipRect.fRight - positionRect.fRight;
123 positionRect.fRight = clipRect.fRight;
124 }
125 if (positionRect.fBottom > clipRect.fBottom) {
126 coordsRect.fBottom += clipRect.fBottom - positionRect.fBottom;
127 positionRect.fBottom = clipRect.fBottom;
128 }
129 if (positionRect.fLeft > positionRect.fRight) {
130 positionRect.fLeft = positionRect.fRight;
131 }
132 if (positionRect.fTop > positionRect.fBottom) {
133 positionRect.fTop = positionRect.fBottom;
134 }
135 coordsRect.fLeft = coordsRect.fLeft << 1 | pageIndexX;
136 coordsRect.fTop = coordsRect.fTop << 1 | pageIndexY;
137 coordsRect.fRight = coordsRect.fRight << 1 | pageIndexX;
138 coordsRect.fBottom = coordsRect.fBottom << 1 | pageIndexY;
139
140 SkPoint* currPosition = reinterpret_cast<SkPoint*>(currVertex);
141 currPosition->fX = positionRect.fLeft;
142 currPosition->fY = positionRect.fTop;
143 *(reinterpret_cast<SkColor*>(currVertex + sizeof(SkPoint))) = color;
144 SkIPoint16* currCoords = reinterpret_cast<SkIPoint16*>(currVertex + coordOffset);
145 currCoords->fX = coordsRect.fLeft;
146 currCoords->fY = coordsRect.fTop;
147 currVertex += vertexStride;
148
149 currPosition = reinterpret_cast<SkPoint*>(currVertex);
150 currPosition->fX = positionRect.fLeft;
151 currPosition->fY = positionRect.fBottom;
152 *(reinterpret_cast<SkColor*>(currVertex + sizeof(SkPoint))) = color;
153 currCoords = reinterpret_cast<SkIPoint16*>(currVertex + coordOffset);
154 currCoords->fX = coordsRect.fLeft;
155 currCoords->fY = coordsRect.fBottom;
156 currVertex += vertexStride;
157
158 currPosition = reinterpret_cast<SkPoint*>(currVertex);
159 currPosition->fX = positionRect.fRight;
160 currPosition->fY = positionRect.fTop;
161 *(reinterpret_cast<SkColor*>(currVertex + sizeof(SkPoint))) = color;
162 currCoords = reinterpret_cast<SkIPoint16*>(currVertex + coordOffset);
163 currCoords->fX = coordsRect.fRight;
164 currCoords->fY = coordsRect.fTop;
165 currVertex += vertexStride;
166
167 currPosition = reinterpret_cast<SkPoint*>(currVertex);
168 currPosition->fX = positionRect.fRight;
169 currPosition->fY = positionRect.fBottom;
170 *(reinterpret_cast<SkColor*>(currVertex + sizeof(SkPoint))) = color;
171 currCoords = reinterpret_cast<SkIPoint16*>(currVertex + coordOffset);
172 currCoords->fX = coordsRect.fRight;
173 currCoords->fY = coordsRect.fBottom;
174 currVertex += vertexStride;
175 }
176
177 blobVertices += 4 * vertexStride;
178 }
179}
180
Brian Salomon91326c32017-08-09 16:02:19 -0400181void GrAtlasTextOp::onPrepareDraws(Target* target) {
joshualitta751c972015-11-20 13:37:32 -0800182 // if we have RGB, then we won't have any SkShaders so no need to use a localmatrix.
183 // TODO actually only invert if we don't have RGBA
184 SkMatrix localMatrix;
185 if (this->usesLocalCoords() && !this->viewMatrix().invert(&localMatrix)) {
186 SkDebugf("Cannot invert viewmatrix\n");
187 return;
188 }
189
Jim Van Vertheafa64b2017-09-18 10:05:00 -0400190 GrMaskFormat maskFormat = this->maskFormat();
191
192 uint32_t atlasPageCount = fFontCache->getAtlasPageCount(maskFormat);
193 const sk_sp<GrTextureProxy>* proxies = fFontCache->getProxies(maskFormat);
194 if (!atlasPageCount || !proxies[0]) {
joshualitta751c972015-11-20 13:37:32 -0800195 SkDebugf("Could not allocate backing texture for atlas\n");
196 return;
197 }
198
bsalomon342bfc22016-04-01 06:06:20 -0700199 FlushInfo flushInfo;
Brian Salomonbfd18cd2017-08-09 16:27:09 -0400200 flushInfo.fPipeline =
201 target->makePipeline(fSRGBFlags, std::move(fProcessors), target->detachAppliedClip());
joshualittd9d30f72015-12-08 10:47:55 -0800202 if (this->usesDistanceFields()) {
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400203 flushInfo.fGeometryProcessor = this->setupDfProcessor();
joshualitta751c972015-11-20 13:37:32 -0800204 } else {
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400205 flushInfo.fGeometryProcessor = GrBitmapTextGeoProc::Make(
Jim Van Vertheafa64b2017-09-18 10:05:00 -0400206 this->color(), proxies, GrSamplerState::ClampNearest(), maskFormat,
207 localMatrix, this->usesLocalCoords());
joshualitta751c972015-11-20 13:37:32 -0800208 }
209
joshualitta751c972015-11-20 13:37:32 -0800210 flushInfo.fGlyphsToFlush = 0;
bsalomon342bfc22016-04-01 06:06:20 -0700211 size_t vertexStride = flushInfo.fGeometryProcessor->getVertexStride();
joshualittf528e0d2015-12-09 06:42:52 -0800212 SkASSERT(vertexStride == GrAtlasTextBlob::GetVertexStride(maskFormat));
joshualitta751c972015-11-20 13:37:32 -0800213
joshualitta751c972015-11-20 13:37:32 -0800214 int glyphCount = this->numGlyphs();
cdalton397536c2016-03-25 12:15:03 -0700215 const GrBuffer* vertexBuffer;
joshualitta751c972015-11-20 13:37:32 -0800216
Brian Salomon344ec422016-12-15 10:58:41 -0500217 void* vertices = target->makeVertexSpace(
218 vertexStride, glyphCount * kVerticesPerGlyph, &vertexBuffer, &flushInfo.fVertexOffset);
joshualitta751c972015-11-20 13:37:32 -0800219 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer));
Brian Salomond28a79d2017-10-16 13:01:07 -0400220 flushInfo.fIndexBuffer = target->resourceProvider()->refQuadIndexBuffer();
joshualitta751c972015-11-20 13:37:32 -0800221 if (!vertices || !flushInfo.fVertexBuffer) {
222 SkDebugf("Could not allocate vertices\n");
223 return;
224 }
225
226 unsigned char* currVertex = reinterpret_cast<unsigned char*>(vertices);
227
bsalomon342bfc22016-04-01 06:06:20 -0700228 GrBlobRegenHelper helper(this, target, &flushInfo);
bsalomond1c71fd2016-05-19 12:51:46 -0700229 SkAutoGlyphCache glyphCache;
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400230 // each of these is a SubRun
joshualitta751c972015-11-20 13:37:32 -0800231 for (int i = 0; i < fGeoCount; i++) {
joshualitt144c3c82015-11-30 12:30:13 -0800232 const Geometry& args = fGeoData[i];
joshualitta751c972015-11-20 13:37:32 -0800233 Blob* blob = args.fBlob;
joshualittddd22d82016-02-16 06:47:52 -0800234 size_t byteCount;
235 void* blobVertices;
joshualitt8e0ef292016-02-19 14:13:03 -0800236 int subRunGlyphCount;
Brian Salomon09d994e2016-12-21 11:14:46 -0500237 blob->regenInOp(target, fFontCache, &helper, args.fRun, args.fSubRun, &glyphCache,
238 vertexStride, args.fViewMatrix, args.fX, args.fY, args.fColor,
239 &blobVertices, &byteCount, &subRunGlyphCount);
joshualitta751c972015-11-20 13:37:32 -0800240
241 // now copy all vertices
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400242 if (args.fClipRect.isEmpty()) {
243 memcpy(currVertex, blobVertices, byteCount);
244 } else {
245 clip_quads(args.fClipRect, currVertex, reinterpret_cast<unsigned char*>(blobVertices),
246 vertexStride, subRunGlyphCount);
247 }
joshualitta751c972015-11-20 13:37:32 -0800248
249 currVertex += byteCount;
250 }
joshualitt60ce86d2015-11-23 13:08:22 -0800251
joshualitta751c972015-11-20 13:37:32 -0800252 this->flush(target, &flushInfo);
253}
254
Brian Salomone5b399e2017-07-19 13:50:54 -0400255void GrAtlasTextOp::flush(GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const {
Jim Van Vertheafa64b2017-09-18 10:05:00 -0400256 GrGeometryProcessor* gp = flushInfo->fGeometryProcessor.get();
257 GrMaskFormat maskFormat = this->maskFormat();
258 if (gp->numTextureSamplers() != (int)fFontCache->getAtlasPageCount(maskFormat)) {
259 // During preparation the number of atlas pages has increased.
260 // Update the proxies used in the GP to match.
261 if (this->usesDistanceFields()) {
262 if (this->isLCD()) {
263 reinterpret_cast<GrDistanceFieldLCDTextGeoProc*>(gp)->addNewProxies(
264 fFontCache->getProxies(maskFormat), GrSamplerState::ClampBilerp());
265 } else {
266 reinterpret_cast<GrDistanceFieldA8TextGeoProc*>(gp)->addNewProxies(
267 fFontCache->getProxies(maskFormat), GrSamplerState::ClampBilerp());
268 }
269 } else {
270 reinterpret_cast<GrBitmapTextGeoProc*>(gp)->addNewProxies(
271 fFontCache->getProxies(maskFormat), GrSamplerState::ClampNearest());
272 }
273 }
274
Chris Dalton3809bab2017-06-13 10:55:06 -0600275 GrMesh mesh(GrPrimitiveType::kTriangles);
cdalton397536c2016-03-25 12:15:03 -0700276 int maxGlyphsPerDraw =
Brian Salomon344ec422016-12-15 10:58:41 -0500277 static_cast<int>(flushInfo->fIndexBuffer->gpuMemorySize() / sizeof(uint16_t) / 6);
Chris Dalton114a3c02017-05-26 15:17:19 -0600278 mesh.setIndexedPatterned(flushInfo->fIndexBuffer.get(), kIndicesPerGlyph, kVerticesPerGlyph,
Chris Daltonbca46e22017-05-15 11:03:26 -0600279 flushInfo->fGlyphsToFlush, maxGlyphsPerDraw);
Chris Dalton114a3c02017-05-26 15:17:19 -0600280 mesh.setVertexData(flushInfo->fVertexBuffer.get(), flushInfo->fVertexOffset);
Brian Salomon44acb5b2017-07-18 19:59:24 -0400281 target->draw(flushInfo->fGeometryProcessor.get(), flushInfo->fPipeline, mesh);
joshualitta751c972015-11-20 13:37:32 -0800282 flushInfo->fVertexOffset += kVerticesPerGlyph * flushInfo->fGlyphsToFlush;
283 flushInfo->fGlyphsToFlush = 0;
284}
285
Brian Salomon344ec422016-12-15 10:58:41 -0500286bool GrAtlasTextOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
287 GrAtlasTextOp* that = t->cast<GrAtlasTextOp>();
Brian Salomon44acb5b2017-07-18 19:59:24 -0400288 if (fProcessors != that->fProcessors) {
289 return false;
290 }
291
292 if (!fCanCombineOnTouchOrOverlap && GrRectsTouchOrOverlap(this->bounds(), that->bounds())) {
joshualitta751c972015-11-20 13:37:32 -0800293 return false;
294 }
295
296 if (fMaskType != that->fMaskType) {
297 return false;
298 }
299
300 if (!this->usesDistanceFields()) {
joshualittd9d30f72015-12-08 10:47:55 -0800301 if (kColorBitmapMask_MaskType == fMaskType && this->color() != that->color()) {
joshualitta751c972015-11-20 13:37:32 -0800302 return false;
303 }
304 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->viewMatrix())) {
305 return false;
306 }
307 } else {
308 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) {
309 return false;
310 }
311
Jim Van Verthbc2cdd12017-06-08 11:14:35 -0400312 if (fLuminanceColor != that->fLuminanceColor) {
joshualitta751c972015-11-20 13:37:32 -0800313 return false;
314 }
joshualitta751c972015-11-20 13:37:32 -0800315 }
316
Brian Salomon344ec422016-12-15 10:58:41 -0500317 fNumGlyphs += that->numGlyphs();
joshualitta751c972015-11-20 13:37:32 -0800318
319 // Reallocate space for geo data if necessary and then import that's geo data.
320 int newGeoCount = that->fGeoCount + fGeoCount;
321 // We assume (and here enforce) that the allocation size is the smallest power of two that
322 // is greater than or equal to the number of geometries (and at least
323 // kMinGeometryAllocated).
324 int newAllocSize = GrNextPow2(newGeoCount);
325 int currAllocSize = SkTMax<int>(kMinGeometryAllocated, GrNextPow2(fGeoCount));
326
327 if (newGeoCount > currAllocSize) {
328 fGeoData.realloc(newAllocSize);
329 }
330
Brian Salomon344ec422016-12-15 10:58:41 -0500331 // We steal the ref on the blobs from the other AtlasTextOp and set its count to 0 so that
joshualitta751c972015-11-20 13:37:32 -0800332 // it doesn't try to unref them.
Brian Salomon344ec422016-12-15 10:58:41 -0500333 memcpy(&fGeoData[fGeoCount], that->fGeoData.get(), that->fGeoCount * sizeof(Geometry));
joshualitta751c972015-11-20 13:37:32 -0800334#ifdef SK_DEBUG
335 for (int i = 0; i < that->fGeoCount; ++i) {
336 that->fGeoData.get()[i].fBlob = (Blob*)0x1;
337 }
338#endif
339 that->fGeoCount = 0;
340 fGeoCount = newGeoCount;
341
bsalomon88cf17d2016-07-08 06:40:56 -0700342 this->joinBounds(*that);
joshualitta751c972015-11-20 13:37:32 -0800343 return true;
344}
345
joshualitta751c972015-11-20 13:37:32 -0800346// TODO trying to figure out why lcd is so whack
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400347// (see comments in GrAtlasTextContext::ComputeCanonicalColor)
348sk_sp<GrGeometryProcessor> GrAtlasTextOp::setupDfProcessor() const {
349 const SkMatrix& viewMatrix = this->viewMatrix();
350 const sk_sp<GrTextureProxy>* p = fFontCache->getProxies(this->maskFormat());
joshualitta751c972015-11-20 13:37:32 -0800351 bool isLCD = this->isLCD();
352 // set up any flags
353 uint32_t flags = viewMatrix.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0;
jvanverthcf371bb2016-03-10 11:10:43 -0800354 flags |= viewMatrix.isScaleTranslate() ? kScaleOnly_DistanceFieldEffectFlag : 0;
brianosmanb461d342016-04-13 13:10:14 -0700355 flags |= fUseGammaCorrectDistanceTable ? kGammaCorrect_DistanceFieldEffectFlag : 0;
Jim Van Verth90e89b32017-07-06 16:36:55 -0400356 flags |= (kAliasedDistanceField_MaskType == fMaskType) ? kAliased_DistanceFieldEffectFlag : 0;
joshualitta751c972015-11-20 13:37:32 -0800357
358 // see if we need to create a new effect
359 if (isLCD) {
360 flags |= kUseLCD_DistanceFieldEffectFlag;
Jim Van Verth90e89b32017-07-06 16:36:55 -0400361 flags |= (kLCDBGRDistanceField_MaskType == fMaskType) ? kBGR_DistanceFieldEffectFlag : 0;
joshualitta751c972015-11-20 13:37:32 -0800362
brianosman0586f5c2016-04-12 12:48:21 -0700363 float redCorrection = fDistanceAdjustTable->getAdjustment(
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400364 SkColorGetR(fLuminanceColor) >> kDistanceAdjustLumShift,
Brian Salomon344ec422016-12-15 10:58:41 -0500365 fUseGammaCorrectDistanceTable);
brianosman0586f5c2016-04-12 12:48:21 -0700366 float greenCorrection = fDistanceAdjustTable->getAdjustment(
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400367 SkColorGetG(fLuminanceColor) >> kDistanceAdjustLumShift,
Brian Salomon344ec422016-12-15 10:58:41 -0500368 fUseGammaCorrectDistanceTable);
brianosman0586f5c2016-04-12 12:48:21 -0700369 float blueCorrection = fDistanceAdjustTable->getAdjustment(
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400370 SkColorGetB(fLuminanceColor) >> kDistanceAdjustLumShift,
Brian Salomon344ec422016-12-15 10:58:41 -0500371 fUseGammaCorrectDistanceTable);
joshualitta751c972015-11-20 13:37:32 -0800372 GrDistanceFieldLCDTextGeoProc::DistanceAdjust widthAdjust =
Brian Salomon344ec422016-12-15 10:58:41 -0500373 GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(
374 redCorrection, greenCorrection, blueCorrection);
joshualitta751c972015-11-20 13:37:32 -0800375
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400376 return GrDistanceFieldLCDTextGeoProc::Make(this->color(), viewMatrix, p,
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400377 GrSamplerState::ClampBilerp(), widthAdjust,
378 flags, this->usesLocalCoords());
joshualitta751c972015-11-20 13:37:32 -0800379 } else {
joshualitta751c972015-11-20 13:37:32 -0800380#ifdef SK_GAMMA_APPLY_TO_A8
Jim Van Verth90e89b32017-07-06 16:36:55 -0400381 float correction = 0;
382 if (kAliasedDistanceField_MaskType != fMaskType) {
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400383 U8CPU lum = SkColorSpaceLuminance::computeLuminance(SK_GAMMA_EXPONENT,
384 fLuminanceColor);
Jim Van Verth90e89b32017-07-06 16:36:55 -0400385 correction = fDistanceAdjustTable->getAdjustment(lum >> kDistanceAdjustLumShift,
386 fUseGammaCorrectDistanceTable);
387 }
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400388 return GrDistanceFieldA8TextGeoProc::Make(this->color(), viewMatrix, p,
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400389 GrSamplerState::ClampBilerp(), correction, flags,
390 this->usesLocalCoords());
joshualitta751c972015-11-20 13:37:32 -0800391#else
Jim Van Verth58c3cce2017-10-19 15:50:24 -0400392 return GrDistanceFieldA8TextGeoProc::Make(this->color(), viewMatrix, p,
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400393 GrSamplerState::ClampBilerp(), flags,
394 this->usesLocalCoords());
joshualitta751c972015-11-20 13:37:32 -0800395#endif
396 }
joshualitta751c972015-11-20 13:37:32 -0800397}
joshualittddd22d82016-02-16 06:47:52 -0800398
Brian Salomon344ec422016-12-15 10:58:41 -0500399void GrBlobRegenHelper::flush() { fOp->flush(fTarget, fFlushInfo); }