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

Side by Side Diff: src/gpu/GrClipMaskManager.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 * Copyright 2012 Google Inc. 2 * Copyright 2012 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 "GrClipMaskManager.h" 8 #include "GrClipMaskManager.h"
9 #include "GrAAConvexPathRenderer.h" 9 #include "GrAAConvexPathRenderer.h"
10 #include "GrAAHairLinePathRenderer.h" 10 #include "GrAAHairLinePathRenderer.h"
11 #include "GrAARectRenderer.h" 11 #include "GrAARectRenderer.h"
12 #include "GrDrawTargetCaps.h" 12 #include "GrDrawTargetCaps.h"
13 #include "GrPaint.h" 13 #include "GrPaint.h"
14 #include "GrPathRenderer.h" 14 #include "GrPathRenderer.h"
15 #include "GrRenderTarget.h" 15 #include "GrRenderTarget.h"
16 #include "GrRenderTargetPriv.h" 16 #include "GrRenderTargetPriv.h"
17 #include "GrStrokeInfo.h"
17 #include "GrStencilBuffer.h" 18 #include "GrStencilBuffer.h"
18 #include "GrSWMaskHelper.h" 19 #include "GrSWMaskHelper.h"
19 #include "SkRasterClip.h" 20 #include "SkRasterClip.h"
20 #include "SkStrokeRec.h" 21 #include "SkStrokeRec.h"
21 #include "SkTLazy.h" 22 #include "SkTLazy.h"
22 #include "effects/GrConvexPolyEffect.h" 23 #include "effects/GrConvexPolyEffect.h"
23 #include "effects/GrPorterDuffXferProcessor.h" 24 #include "effects/GrPorterDuffXferProcessor.h"
24 #include "effects/GrRRectEffect.h" 25 #include "effects/GrRRectEffect.h"
25 #include "effects/GrTextureDomain.h" 26 #include "effects/GrTextureDomain.h"
26 27
(...skipping 26 matching lines...) Expand all
53 GrTextureDomain::kDecal_Mode, 54 GrTextureDomain::kDecal_Mode,
54 GrTextureParams::kNone_FilterMode, 55 GrTextureParams::kNone_FilterMode,
55 kDevice_GrCoordSet))->unref(); 56 kDevice_GrCoordSet))->unref();
56 } 57 }
57 58
58 bool path_needs_SW_renderer(GrContext* context, 59 bool path_needs_SW_renderer(GrContext* context,
59 const GrDrawTarget* gpu, 60 const GrDrawTarget* gpu,
60 const GrPipelineBuilder* pipelineBuilder, 61 const GrPipelineBuilder* pipelineBuilder,
61 const SkMatrix& viewMatrix, 62 const SkMatrix& viewMatrix,
62 const SkPath& origPath, 63 const SkPath& origPath,
63 const SkStrokeRec& stroke, 64 const GrStrokeInfo& stroke,
64 bool doAA) { 65 bool doAA) {
65 // the gpu alpha mask will draw the inverse paths as non-inverse to a temp b uffer 66 // the gpu alpha mask will draw the inverse paths as non-inverse to a temp b uffer
66 SkTCopyOnFirstWrite<SkPath> path(origPath); 67 SkTCopyOnFirstWrite<SkPath> path(origPath);
67 if (path->isInverseFillType()) { 68 if (path->isInverseFillType()) {
68 path.writable()->toggleInverseFillType(); 69 path.writable()->toggleInverseFillType();
69 } 70 }
70 // last (false) parameter disallows use of the SW path renderer 71 // last (false) parameter disallows use of the SW path renderer
71 GrPathRendererChain::DrawType type = doAA ? 72 GrPathRendererChain::DrawType type = doAA ?
72 GrPathRendererChain::kColorAntiAlias_Dr awType : 73 GrPathRendererChain::kColorAntiAlias_Dr awType :
73 GrPathRendererChain::kColor_DrawType; 74 GrPathRendererChain::kColor_DrawType;
74 75
75 return NULL == context->getPathRenderer(gpu, pipelineBuilder, viewMatrix, *p ath, stroke, 76 return NULL == context->getPathRenderer(gpu, pipelineBuilder, viewMatrix, *p ath, stroke,
76 false, type); 77 false, type);
77 } 78 }
78 } 79 }
79 80
80 /* 81 /*
81 * This method traverses the clip stack to see if the GrSoftwarePathRenderer 82 * This method traverses the clip stack to see if the GrSoftwarePathRenderer
82 * will be used on any element. If so, it returns true to indicate that the 83 * will be used on any element. If so, it returns true to indicate that the
83 * entire clip should be rendered in SW and then uploaded en masse to the gpu. 84 * entire clip should be rendered in SW and then uploaded en masse to the gpu.
84 */ 85 */
85 bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder* pipelineBuilder, 86 bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder* pipelineBuilder,
86 const SkVector& clipToMaskOffset, 87 const SkVector& clipToMaskOffset,
87 const GrReducedClip::ElementList& elements ) { 88 const GrReducedClip::ElementList& elements ) {
88 // TODO: generalize this function so that when 89 // TODO: generalize this function so that when
89 // a clip gets complex enough it can just be done in SW regardless 90 // a clip gets complex enough it can just be done in SW regardless
90 // of whether it would invoke the GrSoftwarePathRenderer. 91 // of whether it would invoke the GrSoftwarePathRenderer.
91 SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 92 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle);
92 93
93 // Set the matrix so that rendered clip elements are transformed to mask spa ce from clip 94 // Set the matrix so that rendered clip elements are transformed to mask spa ce from clip
94 // space. 95 // space.
95 SkMatrix translate; 96 SkMatrix translate;
96 translate.setTranslate(clipToMaskOffset); 97 translate.setTranslate(clipToMaskOffset);
97 98
98 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get(); iter.next()) { 99 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get(); iter.next()) {
99 const Element* element = iter.get(); 100 const Element* element = iter.get();
100 // rects can always be drawn directly w/o using the software path 101 // rects can always be drawn directly w/o using the software path
101 // Skip rrects once we're drawing them directly. 102 // Skip rrects once we're drawing them directly.
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 fClipTarget->drawSimpleRect(pipelineBuilder, color, viewMatrix, element->getRect()); 407 fClipTarget->drawSimpleRect(pipelineBuilder, color, viewMatrix, element->getRect());
407 } 408 }
408 return true; 409 return true;
409 default: { 410 default: {
410 SkPath path; 411 SkPath path;
411 element->asPath(&path); 412 element->asPath(&path);
412 path.setIsVolatile(true); 413 path.setIsVolatile(true);
413 if (path.isInverseFillType()) { 414 if (path.isInverseFillType()) {
414 path.toggleInverseFillType(); 415 path.toggleInverseFillType();
415 } 416 }
416 SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 417 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle);
417 if (NULL == pr) { 418 if (NULL == pr) {
418 GrPathRendererChain::DrawType type; 419 GrPathRendererChain::DrawType type;
419 type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_Dr awType : 420 type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_Dr awType :
420 GrPathRendererChain::kColor_DrawType; 421 GrPathRendererChain::kColor_DrawType;
421 pr = this->getContext()->getPathRenderer(fClipTarget, pipelineBu ilder, viewMatrix, 422 pr = this->getContext()->getPathRenderer(fClipTarget, pipelineBu ilder, viewMatrix,
422 path, stroke, false, ty pe); 423 path, stroke, false, ty pe);
423 } 424 }
424 if (NULL == pr) { 425 if (NULL == pr) {
425 return false; 426 return false;
426 } 427 }
(...skipping 15 matching lines...) Expand all
442 if (Element::kRect_Type == element->getType()) { 443 if (Element::kRect_Type == element->getType()) {
443 return true; 444 return true;
444 } else { 445 } else {
445 // We shouldn't get here with an empty clip element. 446 // We shouldn't get here with an empty clip element.
446 SkASSERT(Element::kEmpty_Type != element->getType()); 447 SkASSERT(Element::kEmpty_Type != element->getType());
447 SkPath path; 448 SkPath path;
448 element->asPath(&path); 449 element->asPath(&path);
449 if (path.isInverseFillType()) { 450 if (path.isInverseFillType()) {
450 path.toggleInverseFillType(); 451 path.toggleInverseFillType();
451 } 452 }
452 SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 453 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle);
453 GrPathRendererChain::DrawType type = element->isAA() ? 454 GrPathRendererChain::DrawType type = element->isAA() ?
454 GrPathRendererChain::kStencilAndColorAntiAlias_DrawType : 455 GrPathRendererChain::kStencilAndColorAntiAlias_DrawType :
455 GrPathRendererChain::kStencilAndColor_DrawType; 456 GrPathRendererChain::kStencilAndColor_DrawType;
456 *pr = this->getContext()->getPathRenderer(fClipTarget, pipelineBuilder, SkMatrix::I(), path, 457 *pr = this->getContext()->getPathRenderer(fClipTarget, pipelineBuilder, SkMatrix::I(), path,
457 stroke, false, type); 458 stroke, false, type);
458 return SkToBool(*pr); 459 return SkToBool(*pr);
459 } 460 }
460 } 461 }
461 462
462 void GrClipMaskManager::mergeMask(GrPipelineBuilder* pipelineBuilder, 463 void GrClipMaskManager::mergeMask(GrPipelineBuilder* pipelineBuilder,
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 } 752 }
752 753
753 bool fillInverted = false; 754 bool fillInverted = false;
754 // enabled at bottom of loop 755 // enabled at bottom of loop
755 fClipMode = kIgnoreClip_StencilClipMode; 756 fClipMode = kIgnoreClip_StencilClipMode;
756 757
757 // This will be used to determine whether the clip shape can be rend ered into the 758 // This will be used to determine whether the clip shape can be rend ered into the
758 // stencil with arbitrary stencil settings. 759 // stencil with arbitrary stencil settings.
759 GrPathRenderer::StencilSupport stencilSupport; 760 GrPathRenderer::StencilSupport stencilSupport;
760 761
761 SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 762 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle);
762 SkRegion::Op op = element->getOp(); 763 SkRegion::Op op = element->getOp();
763 764
764 GrPathRenderer* pr = NULL; 765 GrPathRenderer* pr = NULL;
765 SkPath clipPath; 766 SkPath clipPath;
766 if (Element::kRect_Type == element->getType()) { 767 if (Element::kRect_Type == element->getType()) {
767 stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; 768 stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport;
768 fillInverted = false; 769 fillInverted = false;
769 } else { 770 } else {
770 element->asPath(&clipPath); 771 element->asPath(&clipPath);
771 fillInverted = clipPath.isInverseFillType(); 772 fillInverted = clipPath.isInverseFillType();
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 fAACache.setContext(clipTarget->getContext()); 1128 fAACache.setContext(clipTarget->getContext());
1128 } 1129 }
1129 1130
1130 void GrClipMaskManager::adjustPathStencilParams(const GrStencilBuffer* stencilBu ffer, 1131 void GrClipMaskManager::adjustPathStencilParams(const GrStencilBuffer* stencilBu ffer,
1131 GrStencilSettings* settings) { 1132 GrStencilSettings* settings) {
1132 if (stencilBuffer) { 1133 if (stencilBuffer) {
1133 int stencilBits = stencilBuffer->bits(); 1134 int stencilBits = stencilBuffer->bits();
1134 this->adjustStencilParams(settings, fClipMode, stencilBits); 1135 this->adjustStencilParams(settings, fClipMode, stencilBits);
1135 } 1136 }
1136 } 1137 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698