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

Side by Side Diff: src/gpu/batches/GrAADistanceFieldPathRenderer.cpp

Issue 1889453002: Tweak distance field path renderer behavior in gamma-correct mode (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Rebased, plumbed gamma-correctness via DrawPathArgs, fixed typos from most recent change Created 4 years, 8 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 | « src/gpu/GrPathRenderer.h ('k') | src/gpu/effects/GrDistanceFieldGeoProc.cpp » ('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 2014 Google Inc. 2 * Copyright 2014 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 7
8 #include "GrAADistanceFieldPathRenderer.h" 8 #include "GrAADistanceFieldPathRenderer.h"
9 9
10 #include "GrBatchFlushState.h" 10 #include "GrBatchFlushState.h"
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 SkPath fPath; 141 SkPath fPath;
142 // The unique ID of the path involved in this draw. This may be differen t than the ID 142 // The unique ID of the path involved in this draw. This may be differen t than the ID
143 // in fPath since that path may have resulted from a SkStrokeRec::applyT oPath call. 143 // in fPath since that path may have resulted from a SkStrokeRec::applyT oPath call.
144 uint32_t fGenID; 144 uint32_t fGenID;
145 SkStrokeRec fStroke; 145 SkStrokeRec fStroke;
146 GrColor fColor; 146 GrColor fColor;
147 bool fAntiAlias; 147 bool fAntiAlias;
148 }; 148 };
149 149
150 static GrDrawBatch* Create(const Geometry& geometry, const SkMatrix& viewMat rix, 150 static GrDrawBatch* Create(const Geometry& geometry, const SkMatrix& viewMat rix,
151 GrBatchAtlas* atlas, PathCache* pathCache, PathDa taList* pathList) { 151 GrBatchAtlas* atlas, PathCache* pathCache, PathDa taList* pathList,
152 return new AADistanceFieldPathBatch(geometry, viewMatrix, atlas, pathCac he, pathList); 152 bool gammaCorrect) {
153 return new AADistanceFieldPathBatch(geometry, viewMatrix, atlas, pathCac he, pathList,
154 gammaCorrect);
153 } 155 }
154 156
155 const char* name() const override { return "AADistanceFieldPathBatch"; } 157 const char* name() const override { return "AADistanceFieldPathBatch"; }
156 158
157 void computePipelineOptimizations(GrInitInvariantOutput* color, 159 void computePipelineOptimizations(GrInitInvariantOutput* color,
158 GrInitInvariantOutput* coverage, 160 GrInitInvariantOutput* coverage,
159 GrBatchToXPOverrides* overrides) const ove rride { 161 GrBatchToXPOverrides* overrides) const ove rride {
160 color->setKnownFourComponents(fGeoData[0].fColor); 162 color->setKnownFourComponents(fGeoData[0].fColor);
161 coverage->setUnknownSingleComponent(); 163 coverage->setUnknownSingleComponent();
162 } 164 }
(...skipping 26 matching lines...) Expand all
189 SkMatrix invert; 191 SkMatrix invert;
190 if (this->usesLocalCoords() && !this->viewMatrix().invert(&invert)) { 192 if (this->usesLocalCoords() && !this->viewMatrix().invert(&invert)) {
191 SkDebugf("Could not invert viewmatrix\n"); 193 SkDebugf("Could not invert viewmatrix\n");
192 return; 194 return;
193 } 195 }
194 196
195 const SkMatrix& ctm = this->viewMatrix(); 197 const SkMatrix& ctm = this->viewMatrix();
196 uint32_t flags = 0; 198 uint32_t flags = 0;
197 flags |= ctm.isScaleTranslate() ? kScaleOnly_DistanceFieldEffectFlag : 0 ; 199 flags |= ctm.isScaleTranslate() ? kScaleOnly_DistanceFieldEffectFlag : 0 ;
198 flags |= ctm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; 200 flags |= ctm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0;
201 flags |= fGammaCorrect ? kGammaCorrect_DistanceFieldEffectFlag : 0;
199 202
200 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBil erp_FilterMode); 203 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBil erp_FilterMode);
201 204
202 FlushInfo flushInfo; 205 FlushInfo flushInfo;
203 206
204 // Setup GrGeometryProcessor 207 // Setup GrGeometryProcessor
205 GrBatchAtlas* atlas = fAtlas; 208 GrBatchAtlas* atlas = fAtlas;
206 flushInfo.fGeometryProcessor.reset( 209 flushInfo.fGeometryProcessor.reset(
207 GrDistanceFieldPathGeoProc::Create(this->color(), 210 GrDistanceFieldPathGeoProc::Create(this->color(),
208 this->viewMatrix(), 211 this->viewMatrix(),
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 } 292 }
290 293
291 this->flush(target, &flushInfo); 294 this->flush(target, &flushInfo);
292 } 295 }
293 296
294 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } 297 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
295 298
296 AADistanceFieldPathBatch(const Geometry& geometry, 299 AADistanceFieldPathBatch(const Geometry& geometry,
297 const SkMatrix& viewMatrix, 300 const SkMatrix& viewMatrix,
298 GrBatchAtlas* atlas, 301 GrBatchAtlas* atlas,
299 PathCache* pathCache, PathDataList* pathList) 302 PathCache* pathCache, PathDataList* pathList,
303 bool gammaCorrect)
300 : INHERITED(ClassID()) { 304 : INHERITED(ClassID()) {
301 fBatch.fViewMatrix = viewMatrix; 305 fBatch.fViewMatrix = viewMatrix;
302 fGeoData.push_back(geometry); 306 fGeoData.push_back(geometry);
303 307
304 fAtlas = atlas; 308 fAtlas = atlas;
305 fPathCache = pathCache; 309 fPathCache = pathCache;
306 fPathList = pathList; 310 fPathList = pathList;
311 fGammaCorrect = gammaCorrect;
307 312
308 // Compute bounds 313 // Compute bounds
309 fBounds = geometry.fPath.getBounds(); 314 fBounds = geometry.fPath.getBounds();
310 viewMatrix.mapRect(&fBounds); 315 viewMatrix.mapRect(&fBounds);
311 } 316 }
312 317
313 bool addPathToAtlas(GrVertexBatch::Target* target, 318 bool addPathToAtlas(GrVertexBatch::Target* target,
314 FlushInfo* flushInfo, 319 FlushInfo* flushInfo,
315 GrBatchAtlas* atlas, 320 GrBatchAtlas* atlas,
316 PathData* pathData, 321 PathData* pathData,
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 bool fUsesLocalCoords; 522 bool fUsesLocalCoords;
518 bool fColorIgnored; 523 bool fColorIgnored;
519 bool fCoverageIgnored; 524 bool fCoverageIgnored;
520 }; 525 };
521 526
522 BatchTracker fBatch; 527 BatchTracker fBatch;
523 SkSTArray<1, Geometry, true> fGeoData; 528 SkSTArray<1, Geometry, true> fGeoData;
524 GrBatchAtlas* fAtlas; 529 GrBatchAtlas* fAtlas;
525 PathCache* fPathCache; 530 PathCache* fPathCache;
526 PathDataList* fPathList; 531 PathDataList* fPathList;
532 bool fGammaCorrect;
527 533
528 typedef GrVertexBatch INHERITED; 534 typedef GrVertexBatch INHERITED;
529 }; 535 };
530 536
531 bool GrAADistanceFieldPathRenderer::onDrawPath(const DrawPathArgs& args) { 537 bool GrAADistanceFieldPathRenderer::onDrawPath(const DrawPathArgs& args) {
532 GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(), 538 GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(),
533 "GrAADistanceFieldPathRenderer::onDrawPath"); 539 "GrAADistanceFieldPathRenderer::onDrawPath");
534 // we've already bailed on inverse filled paths, so this is safe 540 // we've already bailed on inverse filled paths, so this is safe
535 if (args.fPath->isEmpty()) { 541 if (args.fPath->isEmpty()) {
536 return true; 542 return true;
(...skipping 18 matching lines...) Expand all
555 } 561 }
556 geometry.fColor = args.fColor; 562 geometry.fColor = args.fColor;
557 geometry.fAntiAlias = args.fAntiAlias; 563 geometry.fAntiAlias = args.fAntiAlias;
558 // Note: this is the generation ID of the _original_ path. When a new path i s 564 // Note: this is the generation ID of the _original_ path. When a new path i s
559 // generated due to stroking it is important that the original path's id is used 565 // generated due to stroking it is important that the original path's id is used
560 // for caching. 566 // for caching.
561 geometry.fGenID = args.fPath->getGenerationID(); 567 geometry.fGenID = args.fPath->getGenerationID();
562 568
563 SkAutoTUnref<GrDrawBatch> batch(AADistanceFieldPathBatch::Create(geometry, 569 SkAutoTUnref<GrDrawBatch> batch(AADistanceFieldPathBatch::Create(geometry,
564 *args.fView Matrix, fAtlas, 570 *args.fView Matrix, fAtlas,
565 &fPathCache , &fPathList)); 571 &fPathCache , &fPathList,
572 args.fGamma Correct));
566 args.fTarget->drawBatch(*args.fPipelineBuilder, batch); 573 args.fTarget->drawBatch(*args.fPipelineBuilder, batch);
567 574
568 return true; 575 return true;
569 } 576 }
570 577
571 //////////////////////////////////////////////////////////////////////////////// /////////////////// 578 //////////////////////////////////////////////////////////////////////////////// ///////////////////
572 579
573 #ifdef GR_TEST_UTILS 580 #ifdef GR_TEST_UTILS
574 581
575 struct PathTestStruct { 582 struct PathTestStruct {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 gTestStruct.fAtlas = 630 gTestStruct.fAtlas =
624 context->resourceProvider()->createAtlas(kAlpha_8_GrPixelConfig, 631 context->resourceProvider()->createAtlas(kAlpha_8_GrPixelConfig,
625 ATLAS_TEXTURE_WIDTH, ATLAS_ TEXTURE_HEIGHT, 632 ATLAS_TEXTURE_WIDTH, ATLAS_ TEXTURE_HEIGHT,
626 NUM_PLOTS_X, NUM_PLOTS_Y, 633 NUM_PLOTS_X, NUM_PLOTS_Y,
627 &PathTestStruct::HandleEvic tion, 634 &PathTestStruct::HandleEvic tion,
628 (void*)&gTestStruct); 635 (void*)&gTestStruct);
629 } 636 }
630 637
631 SkMatrix viewMatrix = GrTest::TestMatrix(random); 638 SkMatrix viewMatrix = GrTest::TestMatrix(random);
632 GrColor color = GrRandomColor(random); 639 GrColor color = GrRandomColor(random);
640 bool gammaCorrect = random->nextBool();
633 641
634 AADistanceFieldPathBatch::Geometry geometry(GrTest::TestStrokeRec(random)); 642 AADistanceFieldPathBatch::Geometry geometry(GrTest::TestStrokeRec(random));
635 geometry.fColor = color; 643 geometry.fColor = color;
636 geometry.fPath = GrTest::TestPath(random); 644 geometry.fPath = GrTest::TestPath(random);
637 geometry.fAntiAlias = random->nextBool(); 645 geometry.fAntiAlias = random->nextBool();
638 geometry.fGenID = random->nextU(); 646 geometry.fGenID = random->nextU();
639 647
640 return AADistanceFieldPathBatch::Create(geometry, viewMatrix, 648 return AADistanceFieldPathBatch::Create(geometry, viewMatrix,
641 gTestStruct.fAtlas, 649 gTestStruct.fAtlas,
642 &gTestStruct.fPathCache, 650 &gTestStruct.fPathCache,
643 &gTestStruct.fPathList); 651 &gTestStruct.fPathList,
652 gammaCorrect);
644 } 653 }
645 654
646 #endif 655 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrPathRenderer.h ('k') | src/gpu/effects/GrDistanceFieldGeoProc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698