| OLD | NEW | 
|---|
| 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 "GrSoftwarePathRenderer.h" | 8 #include "GrSoftwarePathRenderer.h" | 
| 9 #include "GrContext.h" |  | 
| 10 #include "GrSWMaskHelper.h" | 9 #include "GrSWMaskHelper.h" | 
|  | 10 #include "GrTextureProvider.h" | 
| 11 #include "batches/GrRectBatchFactory.h" | 11 #include "batches/GrRectBatchFactory.h" | 
| 12 | 12 | 
| 13 //////////////////////////////////////////////////////////////////////////////// | 13 //////////////////////////////////////////////////////////////////////////////// | 
| 14 bool GrSoftwarePathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const { | 14 bool GrSoftwarePathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const { | 
| 15     return SkToBool(fContext); | 15     return SkToBool(fTexProvider); | 
| 16 } | 16 } | 
| 17 | 17 | 
| 18 namespace { | 18 namespace { | 
| 19 | 19 | 
| 20 //////////////////////////////////////////////////////////////////////////////// | 20 //////////////////////////////////////////////////////////////////////////////// | 
| 21 // gets device coord bounds of path (not considering the fill) and clip. The | 21 // gets device coord bounds of path (not considering the fill) and clip. The | 
| 22 // path bounds will be a subset of the clip bounds. returns false if | 22 // path bounds will be a subset of the clip bounds. returns false if | 
| 23 // path bounds would be empty. | 23 // path bounds would be empty. | 
| 24 bool get_path_and_clip_bounds(const GrPipelineBuilder* pipelineBuilder, | 24 bool get_path_and_clip_bounds(int width, int height, | 
| 25                               const GrClip& clip, | 25                               const GrClip& clip, | 
| 26                               const SkPath& path, | 26                               const SkPath& path, | 
| 27                               const SkMatrix& matrix, | 27                               const SkMatrix& matrix, | 
| 28                               SkIRect* devPathBounds, | 28                               SkIRect* devPathBounds, | 
| 29                               SkIRect* devClipBounds) { | 29                               SkIRect* devClipBounds) { | 
| 30     // compute bounds as intersection of rt size, clip, and path | 30     // compute bounds as intersection of rt size, clip, and path | 
| 31     const GrRenderTarget* rt = pipelineBuilder->getRenderTarget(); | 31     clip.getConservativeBounds(width, height, devClipBounds); | 
| 32     if (nullptr == rt) { | 32 | 
|  | 33     if (devClipBounds->isEmpty()) { | 
|  | 34         *devPathBounds = SkIRect::MakeWH(width, height); | 
| 33         return false; | 35         return false; | 
| 34     } | 36     } | 
| 35 | 37 | 
| 36     clip.getConservativeBounds(rt->width(), rt->height(), devClipBounds); |  | 
| 37 |  | 
| 38     if (devClipBounds->isEmpty()) { |  | 
| 39         *devPathBounds = SkIRect::MakeWH(rt->width(), rt->height()); |  | 
| 40         return false; |  | 
| 41     } |  | 
| 42 |  | 
| 43     if (!path.getBounds().isEmpty()) { | 38     if (!path.getBounds().isEmpty()) { | 
| 44         SkRect pathSBounds; | 39         SkRect pathSBounds; | 
| 45         matrix.mapRect(&pathSBounds, path.getBounds()); | 40         matrix.mapRect(&pathSBounds, path.getBounds()); | 
| 46         SkIRect pathIBounds; | 41         SkIRect pathIBounds; | 
| 47         pathSBounds.roundOut(&pathIBounds); | 42         pathSBounds.roundOut(&pathIBounds); | 
| 48         *devPathBounds = *devClipBounds; | 43         *devPathBounds = *devClipBounds; | 
| 49         if (!devPathBounds->intersect(pathIBounds)) { | 44         if (!devPathBounds->intersect(pathIBounds)) { | 
| 50             // set the correct path bounds, as this would be used later. | 45             // set the correct path bounds, as this would be used later. | 
| 51             *devPathBounds = pathIBounds; | 46             *devPathBounds = pathIBounds; | 
| 52             return false; | 47             return false; | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 105         draw_non_aa_rect(target, *pipelineBuilder, clip, color, SkMatrix::I(), r
     ect, invert); | 100         draw_non_aa_rect(target, *pipelineBuilder, clip, color, SkMatrix::I(), r
     ect, invert); | 
| 106     } | 101     } | 
| 107 } | 102 } | 
| 108 | 103 | 
| 109 } | 104 } | 
| 110 | 105 | 
| 111 //////////////////////////////////////////////////////////////////////////////// | 106 //////////////////////////////////////////////////////////////////////////////// | 
| 112 // return true on success; false on failure | 107 // return true on success; false on failure | 
| 113 bool GrSoftwarePathRenderer::onDrawPath(const DrawPathArgs& args) { | 108 bool GrSoftwarePathRenderer::onDrawPath(const DrawPathArgs& args) { | 
| 114     GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(), "GrSoftwarePathRend
     erer::onDrawPath"); | 109     GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(), "GrSoftwarePathRend
     erer::onDrawPath"); | 
| 115     if (nullptr == fContext) { | 110     if (!fTexProvider || !args.fPipelineBuilder->getRenderTarget()) { | 
| 116         return false; | 111         return false; | 
| 117     } | 112     } | 
| 118 | 113 | 
|  | 114     const int width = args.fPipelineBuilder->getRenderTarget()->width(); | 
|  | 115     const int height = args.fPipelineBuilder->getRenderTarget()->height(); | 
|  | 116 | 
| 119     SkIRect devPathBounds, devClipBounds; | 117     SkIRect devPathBounds, devClipBounds; | 
| 120     if (!get_path_and_clip_bounds(args.fPipelineBuilder, *args.fClip, *args.fPat
     h, | 118     if (!get_path_and_clip_bounds(width, height, *args.fClip, *args.fPath, | 
| 121                                   *args.fViewMatrix, &devPathBounds, &devClipBou
     nds)) { | 119                                   *args.fViewMatrix, &devPathBounds, &devClipBou
     nds)) { | 
| 122         if (args.fPath->isInverseFillType()) { | 120         if (args.fPath->isInverseFillType()) { | 
| 123             draw_around_inv_path(args.fTarget, args.fPipelineBuilder, *args.fCli
     p, args.fColor, | 121             draw_around_inv_path(args.fTarget, args.fPipelineBuilder, *args.fCli
     p, args.fColor, | 
| 124                                  *args.fViewMatrix, devClipBounds, devPathBounds
     ); | 122                                  *args.fViewMatrix, devClipBounds, devPathBounds
     ); | 
| 125         } | 123         } | 
| 126         return true; | 124         return true; | 
| 127     } | 125     } | 
| 128 | 126 | 
| 129     SkAutoTUnref<GrTexture> texture( | 127     SkAutoTUnref<GrTexture> texture( | 
| 130             GrSWMaskHelper::DrawPathMaskToTexture(fContext, *args.fPath, *args.f
     Style, | 128             GrSWMaskHelper::DrawPathMaskToTexture(fTexProvider, *args.fPath, *ar
     gs.fStyle, | 
| 131                                                   devPathBounds, | 129                                                   devPathBounds, | 
| 132                                                   args.fAntiAlias, args.fViewMat
     rix)); | 130                                                   args.fAntiAlias, args.fViewMat
     rix)); | 
| 133     if (nullptr == texture) { | 131     if (nullptr == texture) { | 
| 134         return false; | 132         return false; | 
| 135     } | 133     } | 
| 136 | 134 | 
| 137     GrSWMaskHelper::DrawToTargetWithPathMask(texture, args.fTarget, args.fPipeli
     neBuilder, | 135     GrSWMaskHelper::DrawToTargetWithPathMask(texture, args.fTarget, args.fPipeli
     neBuilder, | 
| 138                                              *args.fClip, args.fColor, *args.fVi
     ewMatrix, | 136                                              *args.fClip, args.fColor, *args.fVi
     ewMatrix, | 
| 139                                              devPathBounds); | 137                                              devPathBounds); | 
| 140 | 138 | 
| 141     if (args.fPath->isInverseFillType()) { | 139     if (args.fPath->isInverseFillType()) { | 
| 142         draw_around_inv_path(args.fTarget, args.fPipelineBuilder, *args.fClip, a
     rgs.fColor, | 140         draw_around_inv_path(args.fTarget, args.fPipelineBuilder, *args.fClip, a
     rgs.fColor, | 
| 143                              *args.fViewMatrix, devClipBounds, devPathBounds); | 141                              *args.fViewMatrix, devClipBounds, devPathBounds); | 
| 144     } | 142     } | 
| 145 | 143 | 
| 146     return true; | 144     return true; | 
| 147 } | 145 } | 
| OLD | NEW | 
|---|