| OLD | NEW | 
|---|
| 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 | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 79 #ifdef DF_PATH_TRACKING | 79 #ifdef DF_PATH_TRACKING | 
| 80     SkDebugf("Cached paths: %d, freed paths: %d\n", g_NumCachedPaths, g_NumFreed
     Paths); | 80     SkDebugf("Cached paths: %d, freed paths: %d\n", g_NumCachedPaths, g_NumFreed
     Paths); | 
| 81 #endif | 81 #endif | 
| 82 } | 82 } | 
| 83 | 83 | 
| 84 //////////////////////////////////////////////////////////////////////////////// | 84 //////////////////////////////////////////////////////////////////////////////// | 
| 85 bool GrAADistanceFieldPathRenderer::canDrawPath(const GrDrawTarget* target, | 85 bool GrAADistanceFieldPathRenderer::canDrawPath(const GrDrawTarget* target, | 
| 86                                                 const GrPipelineBuilder* pipelin
     eBuilder, | 86                                                 const GrPipelineBuilder* pipelin
     eBuilder, | 
| 87                                                 const SkMatrix& viewMatrix, | 87                                                 const SkMatrix& viewMatrix, | 
| 88                                                 const SkPath& path, | 88                                                 const SkPath& path, | 
| 89                                                 const SkStrokeRec& stroke, | 89                                                 const GrStrokeInfo& stroke, | 
| 90                                                 bool antiAlias) const { | 90                                                 bool antiAlias) const { | 
| 91 | 91 | 
| 92     // TODO: Support inverse fill | 92     // TODO: Support inverse fill | 
| 93     // TODO: Support strokes | 93     // TODO: Support strokes | 
| 94     if (!target->caps()->shaderDerivativeSupport() || !antiAlias || path.isInver
     seFillType() | 94     if (!target->caps()->shaderDerivativeSupport() || !antiAlias || path.isInver
     seFillType() | 
| 95         || path.isVolatile() || SkStrokeRec::kFill_Style != stroke.getStyle()) { | 95         || path.isVolatile() || !stroke.isFillStyle()) { | 
| 96         return false; | 96         return false; | 
| 97     } | 97     } | 
| 98 | 98 | 
| 99     // currently don't support perspective | 99     // currently don't support perspective | 
| 100     if (viewMatrix.hasPerspective()) { | 100     if (viewMatrix.hasPerspective()) { | 
| 101         return false; | 101         return false; | 
| 102     } | 102     } | 
| 103 | 103 | 
| 104     // only support paths smaller than 64x64, scaled to less than 256x256 | 104     // 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 | 105     // the goal is to accelerate rendering of lots of small paths that may be sc
     aling | 
| 106     SkScalar maxScale = viewMatrix.getMaxScale(); | 106     SkScalar maxScale = viewMatrix.getMaxScale(); | 
| 107     const SkRect& bounds = path.getBounds(); | 107     const SkRect& bounds = path.getBounds(); | 
| 108     SkScalar maxDim = SkMaxScalar(bounds.width(), bounds.height()); | 108     SkScalar maxDim = SkMaxScalar(bounds.width(), bounds.height()); | 
| 109     return maxDim < 64.f && maxDim * maxScale < 256.f; | 109     return maxDim < 64.f && maxDim * maxScale < 256.f; | 
| 110 } | 110 } | 
| 111 | 111 | 
| 112 | 112 | 
| 113 GrPathRenderer::StencilSupport | 113 GrPathRenderer::StencilSupport | 
| 114 GrAADistanceFieldPathRenderer::onGetStencilSupport(const GrDrawTarget*, | 114 GrAADistanceFieldPathRenderer::onGetStencilSupport(const GrDrawTarget*, | 
| 115                                                    const GrPipelineBuilder*, | 115                                                    const GrPipelineBuilder*, | 
| 116                                                    const SkPath&, | 116                                                    const SkPath&, | 
| 117                                                    const SkStrokeRec&) const { | 117                                                    const GrStrokeInfo&) const { | 
| 118     return GrPathRenderer::kNoSupport_StencilSupport; | 118     return GrPathRenderer::kNoSupport_StencilSupport; | 
| 119 } | 119 } | 
| 120 | 120 | 
| 121 //////////////////////////////////////////////////////////////////////////////// | 121 //////////////////////////////////////////////////////////////////////////////// | 
| 122 | 122 | 
| 123 // padding around path bounds to allow for antialiased pixels | 123 // padding around path bounds to allow for antialiased pixels | 
| 124 static const SkScalar kAntiAliasPad = 1.0f; | 124 static const SkScalar kAntiAliasPad = 1.0f; | 
| 125 | 125 | 
| 126 class AADistanceFieldPathBatch : public GrBatch { | 126 class AADistanceFieldPathBatch : public GrBatch { | 
| 127 public: | 127 public: | 
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 563     GrBatchAtlas* fAtlas; | 563     GrBatchAtlas* fAtlas; | 
| 564     PathCache* fPathCache; | 564     PathCache* fPathCache; | 
| 565     PathDataList* fPathList; | 565     PathDataList* fPathList; | 
| 566 }; | 566 }; | 
| 567 | 567 | 
| 568 bool GrAADistanceFieldPathRenderer::onDrawPath(GrDrawTarget* target, | 568 bool GrAADistanceFieldPathRenderer::onDrawPath(GrDrawTarget* target, | 
| 569                                                GrPipelineBuilder* pipelineBuilde
     r, | 569                                                GrPipelineBuilder* pipelineBuilde
     r, | 
| 570                                                GrColor color, | 570                                                GrColor color, | 
| 571                                                const SkMatrix& viewMatrix, | 571                                                const SkMatrix& viewMatrix, | 
| 572                                                const SkPath& path, | 572                                                const SkPath& path, | 
| 573                                                const SkStrokeRec& stroke, | 573                                                const GrStrokeInfo& stroke, | 
| 574                                                bool antiAlias) { | 574                                                bool antiAlias) { | 
| 575     // we've already bailed on inverse filled paths, so this is safe | 575     // we've already bailed on inverse filled paths, so this is safe | 
| 576     if (path.isEmpty()) { | 576     if (path.isEmpty()) { | 
| 577         return true; | 577         return true; | 
| 578     } | 578     } | 
| 579 | 579 | 
| 580     SkASSERT(fContext); | 580     SkASSERT(fContext); | 
| 581 | 581 | 
| 582     if (!fAtlas) { | 582     if (!fAtlas) { | 
| 583         // Create a new atlas | 583         // Create a new atlas | 
| 584         GrSurfaceDesc desc; | 584         GrSurfaceDesc desc; | 
| 585         desc.fFlags = kNone_GrSurfaceFlags; | 585         desc.fFlags = kNone_GrSurfaceFlags; | 
| 586         desc.fWidth = ATLAS_TEXTURE_WIDTH; | 586         desc.fWidth = ATLAS_TEXTURE_WIDTH; | 
| 587         desc.fHeight = ATLAS_TEXTURE_HEIGHT; | 587         desc.fHeight = ATLAS_TEXTURE_HEIGHT; | 
| 588         desc.fConfig = kAlpha_8_GrPixelConfig; | 588         desc.fConfig = kAlpha_8_GrPixelConfig; | 
| 589 | 589 | 
| 590         // We don't want to flush the context so we claim we're in the middle of
      flushing so as to | 590         // 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 | 591         // guarantee we do not recieve a texture with pending IO | 
| 592         GrTexture* texture = fContext->refScratchTexture(desc, GrContext::kAppro
     x_ScratchTexMatch, | 592         GrTexture* texture = fContext->refScratchTexture(desc, GrContext::kAppro
     x_ScratchTexMatch, | 
| 593                                                          true); | 593                                                          true); | 
| 594         if (texture) { | 594         if (texture) { | 
| 595             fAtlas = SkNEW_ARGS(GrBatchAtlas, (texture, NUM_PLOTS_X, NUM_PLOTS_Y
     )); | 595             fAtlas = SkNEW_ARGS(GrBatchAtlas, (texture, NUM_PLOTS_X, NUM_PLOTS_Y
     )); | 
| 596         } else { | 596         } else { | 
| 597             return false; | 597             return false; | 
| 598         } | 598         } | 
| 599         fAtlas->registerEvictionCallback(&GrAADistanceFieldPathRenderer::HandleE
     viction, | 599         fAtlas->registerEvictionCallback(&GrAADistanceFieldPathRenderer::HandleE
     viction, | 
| 600                                          (void*)this); | 600                                          (void*)this); | 
| 601     } | 601     } | 
| 602 | 602 | 
| 603     AADistanceFieldPathBatch::Geometry geometry(stroke); | 603     AADistanceFieldPathBatch::Geometry geometry(stroke.getStrokeRec()); | 
| 604     geometry.fPath = path; | 604     geometry.fPath = path; | 
| 605     geometry.fAntiAlias = antiAlias; | 605     geometry.fAntiAlias = antiAlias; | 
| 606 | 606 | 
| 607     SkAutoTUnref<GrBatch> batch(AADistanceFieldPathBatch::Create(geometry, color
     , viewMatrix, | 607     SkAutoTUnref<GrBatch> batch(AADistanceFieldPathBatch::Create(geometry, color
     , viewMatrix, | 
| 608                                                                  fAtlas, &fPathC
     ache, &fPathList)); | 608                                                                  fAtlas, &fPathC
     ache, &fPathList)); | 
| 609 | 609 | 
| 610     SkRect bounds = path.getBounds(); | 610     SkRect bounds = path.getBounds(); | 
| 611     viewMatrix.mapRect(&bounds); | 611     viewMatrix.mapRect(&bounds); | 
| 612     target->drawBatch(pipelineBuilder, batch, &bounds); | 612     target->drawBatch(pipelineBuilder, batch, &bounds); | 
| 613 | 613 | 
| 614     return true; | 614     return true; | 
| 615 } | 615 } | 
| 616 | 616 | 
| OLD | NEW | 
|---|