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

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

Issue 1096513002: Pass dashing information to path rasterizers. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix 100-col issue Created 5 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
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrAADistanceFieldPathRenderer.h" 9 #include "GrAADistanceFieldPathRenderer.h"
10 10
11 #include "GrBatch.h" 11 #include "GrBatch.h"
12 #include "GrBatchTarget.h" 12 #include "GrBatchTarget.h"
13 #include "GrBufferAllocPool.h" 13 #include "GrBufferAllocPool.h"
14 #include "GrContext.h" 14 #include "GrContext.h"
15 #include "GrPipelineBuilder.h" 15 #include "GrPipelineBuilder.h"
16 #include "GrStrokeInfo.h"
16 #include "GrSurfacePriv.h" 17 #include "GrSurfacePriv.h"
17 #include "GrSWMaskHelper.h" 18 #include "GrSWMaskHelper.h"
18 #include "GrTexturePriv.h" 19 #include "GrTexturePriv.h"
19 #include "effects/GrDistanceFieldGeoProc.h" 20 #include "effects/GrDistanceFieldGeoProc.h"
20 21
21 #include "SkDistanceFieldGen.h" 22 #include "SkDistanceFieldGen.h"
22 #include "SkRTConf.h" 23 #include "SkRTConf.h"
23 24
24 #define ATLAS_TEXTURE_WIDTH 1024 25 #define ATLAS_TEXTURE_WIDTH 1024
25 #define ATLAS_TEXTURE_HEIGHT 2048 26 #define ATLAS_TEXTURE_HEIGHT 2048
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 #ifdef DF_PATH_TRACKING 80 #ifdef DF_PATH_TRACKING
80 SkDebugf("Cached paths: %d, freed paths: %d\n", g_NumCachedPaths, g_NumFreed Paths); 81 SkDebugf("Cached paths: %d, freed paths: %d\n", g_NumCachedPaths, g_NumFreed Paths);
81 #endif 82 #endif
82 } 83 }
83 84
84 //////////////////////////////////////////////////////////////////////////////// 85 ////////////////////////////////////////////////////////////////////////////////
85 bool GrAADistanceFieldPathRenderer::canDrawPath(const GrDrawTarget* target, 86 bool GrAADistanceFieldPathRenderer::canDrawPath(const GrDrawTarget* target,
86 const GrPipelineBuilder* pipelin eBuilder, 87 const GrPipelineBuilder* pipelin eBuilder,
87 const SkMatrix& viewMatrix, 88 const SkMatrix& viewMatrix,
88 const SkPath& path, 89 const SkPath& path,
89 const SkStrokeRec& stroke, 90 const GrStrokeInfo& stroke,
90 bool antiAlias) const { 91 bool antiAlias) const {
91 92
92 // TODO: Support inverse fill 93 // TODO: Support inverse fill
93 // TODO: Support strokes 94 // TODO: Support strokes
94 if (!target->caps()->shaderDerivativeSupport() || !antiAlias || path.isInver seFillType() 95 if (!target->caps()->shaderDerivativeSupport() || !antiAlias || path.isInver seFillType()
95 || path.isVolatile() || SkStrokeRec::kFill_Style != stroke.getStyle()) { 96 || path.isVolatile() || SkStrokeRec::kFill_Style != stroke.getStrokeRec( ).getStyle()) {
96 return false; 97 return false;
97 } 98 }
98 99
99 // currently don't support perspective 100 // currently don't support perspective
100 if (viewMatrix.hasPerspective()) { 101 if (viewMatrix.hasPerspective()) {
101 return false; 102 return false;
102 } 103 }
103 104
104 // only support paths smaller than 64x64, scaled to less than 256x256 105 // only support paths smaller than 64x64, scaled to less than 256x256
105 // the goal is to accelerate rendering of lots of small paths that may be sc aling 106 // the goal is to accelerate rendering of lots of small paths that may be sc aling
106 SkScalar maxScale = viewMatrix.getMaxScale(); 107 SkScalar maxScale = viewMatrix.getMaxScale();
107 const SkRect& bounds = path.getBounds(); 108 const SkRect& bounds = path.getBounds();
108 SkScalar maxDim = SkMaxScalar(bounds.width(), bounds.height()); 109 SkScalar maxDim = SkMaxScalar(bounds.width(), bounds.height());
109 return maxDim < 64.f && maxDim * maxScale < 256.f; 110 return maxDim < 64.f && maxDim * maxScale < 256.f;
110 } 111 }
111 112
112 113
113 GrPathRenderer::StencilSupport 114 GrPathRenderer::StencilSupport
114 GrAADistanceFieldPathRenderer::onGetStencilSupport(const GrDrawTarget*, 115 GrAADistanceFieldPathRenderer::onGetStencilSupport(const GrDrawTarget*,
115 const GrPipelineBuilder*, 116 const GrPipelineBuilder*,
116 const SkPath&, 117 const SkPath&,
117 const SkStrokeRec&) const { 118 const GrStrokeInfo&) const {
118 return GrPathRenderer::kNoSupport_StencilSupport; 119 return GrPathRenderer::kNoSupport_StencilSupport;
119 } 120 }
120 121
121 //////////////////////////////////////////////////////////////////////////////// 122 ////////////////////////////////////////////////////////////////////////////////
122 123
123 // padding around path bounds to allow for antialiased pixels 124 // padding around path bounds to allow for antialiased pixels
124 static const SkScalar kAntiAliasPad = 1.0f; 125 static const SkScalar kAntiAliasPad = 1.0f;
125 126
126 class AADistanceFieldPathBatch : public GrBatch { 127 class AADistanceFieldPathBatch : public GrBatch {
127 public: 128 public:
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 GrBatchAtlas* fAtlas; 564 GrBatchAtlas* fAtlas;
564 PathCache* fPathCache; 565 PathCache* fPathCache;
565 PathDataList* fPathList; 566 PathDataList* fPathList;
566 }; 567 };
567 568
568 bool GrAADistanceFieldPathRenderer::onDrawPath(GrDrawTarget* target, 569 bool GrAADistanceFieldPathRenderer::onDrawPath(GrDrawTarget* target,
569 GrPipelineBuilder* pipelineBuilde r, 570 GrPipelineBuilder* pipelineBuilde r,
570 GrColor color, 571 GrColor color,
571 const SkMatrix& viewMatrix, 572 const SkMatrix& viewMatrix,
572 const SkPath& path, 573 const SkPath& path,
573 const SkStrokeRec& stroke, 574 const GrStrokeInfo& stroke,
574 bool antiAlias) { 575 bool antiAlias) {
575 // we've already bailed on inverse filled paths, so this is safe 576 // we've already bailed on inverse filled paths, so this is safe
576 if (path.isEmpty()) { 577 if (path.isEmpty()) {
577 return true; 578 return true;
578 } 579 }
579 580
580 SkASSERT(fContext); 581 SkASSERT(fContext);
581 582
582 if (!fAtlas) { 583 if (!fAtlas) {
583 // Create a new atlas 584 // Create a new atlas
584 GrSurfaceDesc desc; 585 GrSurfaceDesc desc;
585 desc.fFlags = kNone_GrSurfaceFlags; 586 desc.fFlags = kNone_GrSurfaceFlags;
586 desc.fWidth = ATLAS_TEXTURE_WIDTH; 587 desc.fWidth = ATLAS_TEXTURE_WIDTH;
587 desc.fHeight = ATLAS_TEXTURE_HEIGHT; 588 desc.fHeight = ATLAS_TEXTURE_HEIGHT;
588 desc.fConfig = kAlpha_8_GrPixelConfig; 589 desc.fConfig = kAlpha_8_GrPixelConfig;
589 590
590 // We don't want to flush the context so we claim we're in the middle of flushing so as to 591 // We don't want to flush the context so we claim we're in the middle of flushing so as to
591 // guarantee we do not recieve a texture with pending IO 592 // guarantee we do not recieve a texture with pending IO
592 GrTexture* texture = fContext->refScratchTexture(desc, GrContext::kAppro x_ScratchTexMatch, 593 GrTexture* texture = fContext->refScratchTexture(desc, GrContext::kAppro x_ScratchTexMatch,
593 true); 594 true);
594 if (texture) { 595 if (texture) {
595 fAtlas = SkNEW_ARGS(GrBatchAtlas, (texture, NUM_PLOTS_X, NUM_PLOTS_Y )); 596 fAtlas = SkNEW_ARGS(GrBatchAtlas, (texture, NUM_PLOTS_X, NUM_PLOTS_Y ));
596 } else { 597 } else {
597 return false; 598 return false;
598 } 599 }
599 fAtlas->registerEvictionCallback(&GrAADistanceFieldPathRenderer::HandleE viction, 600 fAtlas->registerEvictionCallback(&GrAADistanceFieldPathRenderer::HandleE viction,
600 (void*)this); 601 (void*)this);
601 } 602 }
602 603
603 AADistanceFieldPathBatch::Geometry geometry(stroke); 604 AADistanceFieldPathBatch::Geometry geometry(stroke.getStrokeRec());
604 geometry.fPath = path; 605 geometry.fPath = path;
605 geometry.fAntiAlias = antiAlias; 606 geometry.fAntiAlias = antiAlias;
606 607
607 SkAutoTUnref<GrBatch> batch(AADistanceFieldPathBatch::Create(geometry, color , viewMatrix, 608 SkAutoTUnref<GrBatch> batch(AADistanceFieldPathBatch::Create(geometry, color , viewMatrix,
608 fAtlas, &fPathC ache, &fPathList)); 609 fAtlas, &fPathC ache, &fPathList));
609 610
610 SkRect bounds = path.getBounds(); 611 SkRect bounds = path.getBounds();
611 viewMatrix.mapRect(&bounds); 612 viewMatrix.mapRect(&bounds);
612 target->drawBatch(pipelineBuilder, batch, &bounds); 613 target->drawBatch(pipelineBuilder, batch, &bounds);
613 614
614 return true; 615 return true;
615 } 616 }
616 617
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698