| 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 20 matching lines...) Expand all  Loading... | 
| 31 #define NUM_PLOTS_X   (ATLAS_TEXTURE_WIDTH / PLOT_WIDTH) | 31 #define NUM_PLOTS_X   (ATLAS_TEXTURE_WIDTH / PLOT_WIDTH) | 
| 32 #define NUM_PLOTS_Y   (ATLAS_TEXTURE_HEIGHT / PLOT_HEIGHT) | 32 #define NUM_PLOTS_Y   (ATLAS_TEXTURE_HEIGHT / PLOT_HEIGHT) | 
| 33 | 33 | 
| 34 #ifdef DF_PATH_TRACKING | 34 #ifdef DF_PATH_TRACKING | 
| 35 static int g_NumCachedPaths = 0; | 35 static int g_NumCachedPaths = 0; | 
| 36 static int g_NumFreedPaths = 0; | 36 static int g_NumFreedPaths = 0; | 
| 37 #endif | 37 #endif | 
| 38 | 38 | 
| 39 // mip levels | 39 // mip levels | 
| 40 static const int kSmallMIP = 32; | 40 static const int kSmallMIP = 32; | 
| 41 static const int kMediumMIP = 72; | 41 static const int kMediumMIP = 73; | 
| 42 static const int kLargeMIP = 162; | 42 static const int kLargeMIP = 162; | 
| 43 | 43 | 
| 44 // Callback to clear out internal path cache when eviction occurs | 44 // Callback to clear out internal path cache when eviction occurs | 
| 45 void GrAADistanceFieldPathRenderer::HandleEviction(GrBatchAtlas::AtlasID id, voi
     d* pr) { | 45 void GrAADistanceFieldPathRenderer::HandleEviction(GrBatchAtlas::AtlasID id, voi
     d* pr) { | 
| 46     GrAADistanceFieldPathRenderer* dfpr = (GrAADistanceFieldPathRenderer*)pr; | 46     GrAADistanceFieldPathRenderer* dfpr = (GrAADistanceFieldPathRenderer*)pr; | 
| 47     // remove any paths that use this plot | 47     // remove any paths that use this plot | 
| 48     PathDataList::Iter iter; | 48     PathDataList::Iter iter; | 
| 49     iter.init(dfpr->fPathList, PathDataList::Iter::kHead_IterStart); | 49     iter.init(dfpr->fPathList, PathDataList::Iter::kHead_IterStart); | 
| 50     PathData* pathData; | 50     PathData* pathData; | 
| 51     while ((pathData = iter.get())) { | 51     while ((pathData = iter.get())) { | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 77 | 77 | 
| 78 #ifdef DF_PATH_TRACKING | 78 #ifdef DF_PATH_TRACKING | 
| 79     SkDebugf("Cached paths: %d, freed paths: %d\n", g_NumCachedPaths, g_NumFreed
     Paths); | 79     SkDebugf("Cached paths: %d, freed paths: %d\n", g_NumCachedPaths, g_NumFreed
     Paths); | 
| 80 #endif | 80 #endif | 
| 81 } | 81 } | 
| 82 | 82 | 
| 83 //////////////////////////////////////////////////////////////////////////////// | 83 //////////////////////////////////////////////////////////////////////////////// | 
| 84 bool GrAADistanceFieldPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) c
     onst { | 84 bool GrAADistanceFieldPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) c
     onst { | 
| 85 | 85 | 
| 86     // TODO: Support inverse fill | 86     // TODO: Support inverse fill | 
| 87     // TODO: Support strokes |  | 
| 88     if (!args.fShaderCaps->shaderDerivativeSupport() || !args.fAntiAlias || | 87     if (!args.fShaderCaps->shaderDerivativeSupport() || !args.fAntiAlias || | 
| 89         args.fPath->isInverseFillType() || args.fPath->isVolatile() || | 88         SkStrokeRec::kHairline_Style == args.fStroke->getStyle() || | 
| 90         !args.fStroke->isFillStyle()) { | 89         args.fPath->isInverseFillType() || args.fPath->isVolatile()) { | 
| 91         return false; | 90         return false; | 
| 92     } | 91     } | 
| 93 | 92 | 
| 94     // currently don't support perspective | 93     // currently don't support perspective | 
| 95     if (args.fViewMatrix->hasPerspective()) { | 94     if (args.fViewMatrix->hasPerspective()) { | 
| 96         return false; | 95         return false; | 
| 97     } | 96     } | 
| 98 | 97 | 
| 99     // only support paths smaller than 64x64, scaled to less than 256x256 | 98     // only support paths with bounds within kMediumMIP by kMediumMIP, | 
|  | 99     // scaled to have bounds within 2.0f*kLargeMIP by 2.0f*kLargeMIP | 
| 100     // the goal is to accelerate rendering of lots of small paths that may be sc
     aling | 100     // the goal is to accelerate rendering of lots of small paths that may be sc
     aling | 
| 101     SkScalar maxScale = args.fViewMatrix->getMaxScale(); | 101     SkScalar maxScale = args.fViewMatrix->getMaxScale(); | 
| 102     const SkRect& bounds = args.fPath->getBounds(); | 102     const SkRect& bounds = args.fPath->getBounds(); | 
| 103     SkScalar maxDim = SkMaxScalar(bounds.width(), bounds.height()); | 103     SkScalar maxDim = SkMaxScalar(bounds.width(), bounds.height()); | 
| 104     return maxDim < 64.f && maxDim * maxScale < 256.f; | 104     // Approximate stroked size by adding the maximum of the stroke width or 2x 
     the miter limit | 
|  | 105     if (!args.fStroke->isFillStyle()) { | 
|  | 106         SkScalar extraWidth = args.fStroke->getWidth(); | 
|  | 107         if (SkPaint::kMiter_Join == args.fStroke->getJoin()) { | 
|  | 108             extraWidth = SkTMax(extraWidth, 2.0f*args.fStroke->getMiter()); | 
|  | 109         } | 
|  | 110         maxDim += extraWidth; | 
|  | 111     } | 
|  | 112 | 
|  | 113     return maxDim <= kMediumMIP && maxDim * maxScale <= 2.0f*kLargeMIP; | 
| 105 } | 114 } | 
| 106 | 115 | 
| 107 //////////////////////////////////////////////////////////////////////////////// | 116 //////////////////////////////////////////////////////////////////////////////// | 
| 108 | 117 | 
| 109 // padding around path bounds to allow for antialiased pixels | 118 // padding around path bounds to allow for antialiased pixels | 
| 110 static const SkScalar kAntiAliasPad = 1.0f; | 119 static const SkScalar kAntiAliasPad = 1.0f; | 
| 111 | 120 | 
| 112 class AADistanceFieldPathBatch : public GrVertexBatch { | 121 class AADistanceFieldPathBatch : public GrVertexBatch { | 
| 113 public: | 122 public: | 
| 114     DEFINE_BATCH_CLASS_ID | 123     DEFINE_BATCH_CLASS_ID | 
| 115 | 124 | 
| 116     typedef GrAADistanceFieldPathRenderer::PathData PathData; | 125     typedef GrAADistanceFieldPathRenderer::PathData PathData; | 
| 117     typedef SkTDynamicHash<PathData, PathData::Key> PathCache; | 126     typedef SkTDynamicHash<PathData, PathData::Key> PathCache; | 
| 118     typedef GrAADistanceFieldPathRenderer::PathDataList PathDataList; | 127     typedef GrAADistanceFieldPathRenderer::PathDataList PathDataList; | 
| 119 | 128 | 
| 120     struct Geometry { | 129     struct Geometry { | 
| 121         Geometry(const SkStrokeRec& stroke) : fStroke(stroke) {} | 130         Geometry(const SkStrokeRec& stroke) : fStroke(stroke) { | 
|  | 131             if (!stroke.needToApply()) { | 
|  | 132                 // purify unused values to ensure binary equality | 
|  | 133                 fStroke.setStrokeParams(SkPaint::kDefault_Cap, SkPaint::kDefault
     _Join, | 
|  | 134                                         SkIntToScalar(4)); | 
|  | 135                 if (fStroke.getWidth() < 0) { | 
|  | 136                     fStroke.setStrokeStyle(-1.0f); | 
|  | 137                 } | 
|  | 138             } | 
|  | 139         } | 
| 122         SkPath fPath; | 140         SkPath fPath; | 
|  | 141         // The unique ID of the path involved in this draw. This may be differen
     t than the ID | 
|  | 142         // in fPath since that path may have resulted from a SkStrokeRec::applyT
     oPath call. | 
|  | 143         uint32_t fGenID; | 
| 123         SkStrokeRec fStroke; | 144         SkStrokeRec fStroke; | 
| 124         bool fAntiAlias; | 145         bool fAntiAlias; | 
| 125         PathData* fPathData; | 146         PathData* fPathData; | 
| 126     }; | 147     }; | 
| 127 | 148 | 
| 128     static GrDrawBatch* Create(const Geometry& geometry, GrColor color, const Sk
     Matrix& viewMatrix, | 149     static GrDrawBatch* Create(const Geometry& geometry, GrColor color, const Sk
     Matrix& viewMatrix, | 
| 129                                GrBatchAtlas* atlas, PathCache* pathCache, PathDa
     taList* pathList) { | 150                                GrBatchAtlas* atlas, PathCache* pathCache, PathDa
     taList* pathList) { | 
| 130         return new AADistanceFieldPathBatch(geometry, color, viewMatrix, atlas, 
     pathCache, | 151         return new AADistanceFieldPathBatch(geometry, color, viewMatrix, atlas, 
     pathCache, | 
| 131                                             pathList); | 152                                             pathList); | 
| 132     } | 153     } | 
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 218             uint32_t desiredDimension; | 239             uint32_t desiredDimension; | 
| 219             if (size <= kSmallMIP) { | 240             if (size <= kSmallMIP) { | 
| 220                 desiredDimension = kSmallMIP; | 241                 desiredDimension = kSmallMIP; | 
| 221             } else if (size <= kMediumMIP) { | 242             } else if (size <= kMediumMIP) { | 
| 222                 desiredDimension = kMediumMIP; | 243                 desiredDimension = kMediumMIP; | 
| 223             } else { | 244             } else { | 
| 224                 desiredDimension = kLargeMIP; | 245                 desiredDimension = kLargeMIP; | 
| 225             } | 246             } | 
| 226 | 247 | 
| 227             // check to see if path is cached | 248             // check to see if path is cached | 
| 228             // TODO: handle stroked vs. filled version of same path | 249             PathData::Key key(args.fGenID, desiredDimension, args.fStroke); | 
| 229             PathData::Key key = { args.fPath.getGenerationID(), desiredDimension
      }; |  | 
| 230             args.fPathData = fPathCache->find(key); | 250             args.fPathData = fPathCache->find(key); | 
| 231             if (nullptr == args.fPathData || !atlas->hasID(args.fPathData->fID))
      { | 251             if (nullptr == args.fPathData || !atlas->hasID(args.fPathData->fID))
      { | 
| 232                 // Remove the stale cache entry | 252                 // Remove the stale cache entry | 
| 233                 if (args.fPathData) { | 253                 if (args.fPathData) { | 
| 234                     fPathCache->remove(args.fPathData->fKey); | 254                     fPathCache->remove(args.fPathData->fKey); | 
| 235                     fPathList->remove(args.fPathData); | 255                     fPathList->remove(args.fPathData); | 
| 236                     delete args.fPathData; | 256                     delete args.fPathData; | 
| 237                 } | 257                 } | 
| 238                 SkScalar scale = desiredDimension/maxDim; | 258                 SkScalar scale = desiredDimension/maxDim; | 
| 239                 args.fPathData = new PathData; | 259                 args.fPathData = new PathData; | 
| 240                 if (!this->addPathToAtlas(target, | 260                 if (!this->addPathToAtlas(target, | 
| 241                                           dfProcessor, | 261                                           dfProcessor, | 
| 242                                           this->pipeline(), | 262                                           this->pipeline(), | 
| 243                                           &flushInfo, | 263                                           &flushInfo, | 
| 244                                           atlas, | 264                                           atlas, | 
| 245                                           args.fPathData, | 265                                           args.fPathData, | 
| 246                                           args.fPath, | 266                                           args.fPath, | 
|  | 267                                           args.fGenID, | 
| 247                                           args.fStroke, | 268                                           args.fStroke, | 
| 248                                           args.fAntiAlias, | 269                                           args.fAntiAlias, | 
| 249                                           desiredDimension, | 270                                           desiredDimension, | 
| 250                                           scale)) { | 271                                           scale)) { | 
| 251                     SkDebugf("Can't rasterize path\n"); | 272                     SkDebugf("Can't rasterize path\n"); | 
| 252                     return; | 273                     return; | 
| 253                 } | 274                 } | 
| 254             } | 275             } | 
| 255 | 276 | 
| 256             atlas->setLastUseToken(args.fPathData->fID, target->currentToken()); | 277             atlas->setLastUseToken(args.fPathData->fID, target->currentToken()); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 294         viewMatrix.mapRect(&fBounds); | 315         viewMatrix.mapRect(&fBounds); | 
| 295     } | 316     } | 
| 296 | 317 | 
| 297     bool addPathToAtlas(GrVertexBatch::Target* target, | 318     bool addPathToAtlas(GrVertexBatch::Target* target, | 
| 298                         const GrGeometryProcessor* dfProcessor, | 319                         const GrGeometryProcessor* dfProcessor, | 
| 299                         const GrPipeline* pipeline, | 320                         const GrPipeline* pipeline, | 
| 300                         FlushInfo* flushInfo, | 321                         FlushInfo* flushInfo, | 
| 301                         GrBatchAtlas* atlas, | 322                         GrBatchAtlas* atlas, | 
| 302                         PathData* pathData, | 323                         PathData* pathData, | 
| 303                         const SkPath& path, | 324                         const SkPath& path, | 
| 304                         const SkStrokeRec& | 325                         uint32_t genID, | 
| 305                         stroke, bool antiAlias, | 326                         const SkStrokeRec& stroke, | 
|  | 327                         bool antiAlias, | 
| 306                         uint32_t dimension, | 328                         uint32_t dimension, | 
| 307                         SkScalar scale) { | 329                         SkScalar scale) { | 
| 308         const SkRect& bounds = path.getBounds(); | 330         const SkRect& bounds = path.getBounds(); | 
| 309 | 331 | 
| 310         // generate bounding rect for bitmap draw | 332         // generate bounding rect for bitmap draw | 
| 311         SkRect scaledBounds = bounds; | 333         SkRect scaledBounds = bounds; | 
| 312         // scale to mip level size | 334         // scale to mip level size | 
| 313         scaledBounds.fLeft *= scale; | 335         scaledBounds.fLeft *= scale; | 
| 314         scaledBounds.fTop *= scale; | 336         scaledBounds.fTop *= scale; | 
| 315         scaledBounds.fRight *= scale; | 337         scaledBounds.fRight *= scale; | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 326         // move origin to upper left corner | 348         // move origin to upper left corner | 
| 327         devPathBounds.offsetTo(0,0); | 349         devPathBounds.offsetTo(0,0); | 
| 328 | 350 | 
| 329         // draw path to bitmap | 351         // draw path to bitmap | 
| 330         SkMatrix drawMatrix; | 352         SkMatrix drawMatrix; | 
| 331         drawMatrix.setTranslate(-bounds.left(), -bounds.top()); | 353         drawMatrix.setTranslate(-bounds.left(), -bounds.top()); | 
| 332         drawMatrix.postScale(scale, scale); | 354         drawMatrix.postScale(scale, scale); | 
| 333         drawMatrix.postTranslate(kAntiAliasPad, kAntiAliasPad); | 355         drawMatrix.postTranslate(kAntiAliasPad, kAntiAliasPad); | 
| 334 | 356 | 
| 335         // setup bitmap backing | 357         // setup bitmap backing | 
| 336         // Now translate so the bound's UL corner is at the origin | 358         SkASSERT(devPathBounds.fLeft == 0); | 
| 337         drawMatrix.postTranslate(-devPathBounds.fLeft * SK_Scalar1, | 359         SkASSERT(devPathBounds.fTop == 0); | 
| 338                                  -devPathBounds.fTop * SK_Scalar1); |  | 
| 339         SkIRect pathBounds = SkIRect::MakeWH(devPathBounds.width(), |  | 
| 340                                              devPathBounds.height()); |  | 
| 341 |  | 
| 342         SkAutoPixmapStorage dst; | 360         SkAutoPixmapStorage dst; | 
| 343         if (!dst.tryAlloc(SkImageInfo::MakeA8(pathBounds.width(), | 361         if (!dst.tryAlloc(SkImageInfo::MakeA8(devPathBounds.width(), | 
| 344                                               pathBounds.height()))) { | 362                                               devPathBounds.height()))) { | 
| 345             return false; | 363             return false; | 
| 346         } | 364         } | 
| 347         sk_bzero(dst.writable_addr(), dst.getSafeSize()); | 365         sk_bzero(dst.writable_addr(), dst.getSafeSize()); | 
| 348 | 366 | 
| 349         // rasterize path | 367         // rasterize path | 
| 350         SkPaint paint; | 368         SkPaint paint; | 
| 351         if (stroke.isHairlineStyle()) { | 369         paint.setStyle(SkPaint::kFill_Style); | 
| 352             paint.setStyle(SkPaint::kStroke_Style); |  | 
| 353             paint.setStrokeWidth(SK_Scalar1); |  | 
| 354         } else { |  | 
| 355             if (stroke.isFillStyle()) { |  | 
| 356                 paint.setStyle(SkPaint::kFill_Style); |  | 
| 357             } else { |  | 
| 358                 paint.setStyle(SkPaint::kStroke_Style); |  | 
| 359                 paint.setStrokeJoin(stroke.getJoin()); |  | 
| 360                 paint.setStrokeCap(stroke.getCap()); |  | 
| 361                 paint.setStrokeWidth(stroke.getWidth()); |  | 
| 362             } |  | 
| 363         } |  | 
| 364         paint.setAntiAlias(antiAlias); | 370         paint.setAntiAlias(antiAlias); | 
| 365 | 371 | 
| 366         SkDraw draw; | 372         SkDraw draw; | 
| 367         sk_bzero(&draw, sizeof(draw)); | 373         sk_bzero(&draw, sizeof(draw)); | 
| 368 | 374 | 
| 369         SkRasterClip rasterClip; | 375         SkRasterClip rasterClip; | 
| 370         rasterClip.setRect(pathBounds); | 376         rasterClip.setRect(devPathBounds); | 
| 371         draw.fRC = &rasterClip; | 377         draw.fRC = &rasterClip; | 
| 372         draw.fClip = &rasterClip.bwRgn(); | 378         draw.fClip = &rasterClip.bwRgn(); | 
| 373         draw.fMatrix = &drawMatrix; | 379         draw.fMatrix = &drawMatrix; | 
| 374         draw.fDst = dst; | 380         draw.fDst = dst; | 
| 375 | 381 | 
| 376         draw.drawPathCoverage(path, paint); | 382         draw.drawPathCoverage(path, paint); | 
| 377 | 383 | 
| 378         // generate signed distance field | 384         // generate signed distance field | 
| 379         devPathBounds.outset(SK_DistanceFieldPad, SK_DistanceFieldPad); | 385         devPathBounds.outset(SK_DistanceFieldPad, SK_DistanceFieldPad); | 
| 380         int width = devPathBounds.width(); | 386         int width = devPathBounds.width(); | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 396             this->flush(target, flushInfo); | 402             this->flush(target, flushInfo); | 
| 397             target->initDraw(dfProcessor, pipeline); | 403             target->initDraw(dfProcessor, pipeline); | 
| 398 | 404 | 
| 399             SkDEBUGCODE(success =) atlas->addToAtlas(&id, target, width, height, | 405             SkDEBUGCODE(success =) atlas->addToAtlas(&id, target, width, height, | 
| 400                                                      dfStorage.get(), &atlasLoca
     tion); | 406                                                      dfStorage.get(), &atlasLoca
     tion); | 
| 401             SkASSERT(success); | 407             SkASSERT(success); | 
| 402 | 408 | 
| 403         } | 409         } | 
| 404 | 410 | 
| 405         // add to cache | 411         // add to cache | 
| 406         pathData->fKey.fGenID = path.getGenerationID(); | 412         pathData->fKey = PathData::Key(genID, dimension, stroke); | 
| 407         pathData->fKey.fDimension = dimension; |  | 
| 408         pathData->fScale = scale; | 413         pathData->fScale = scale; | 
| 409         pathData->fID = id; | 414         pathData->fID = id; | 
| 410         // change the scaled rect to match the size of the inset distance field | 415         // change the scaled rect to match the size of the inset distance field | 
| 411         scaledBounds.fRight = scaledBounds.fLeft + | 416         scaledBounds.fRight = scaledBounds.fLeft + | 
| 412             SkIntToScalar(devPathBounds.width() - 2*SK_DistanceFieldInset); | 417             SkIntToScalar(devPathBounds.width() - 2*SK_DistanceFieldInset); | 
| 413         scaledBounds.fBottom = scaledBounds.fTop + | 418         scaledBounds.fBottom = scaledBounds.fTop + | 
| 414             SkIntToScalar(devPathBounds.height() - 2*SK_DistanceFieldInset); | 419             SkIntToScalar(devPathBounds.height() - 2*SK_DistanceFieldInset); | 
| 415         // shift the origin to the correct place relative to the distance field | 420         // shift the origin to the correct place relative to the distance field | 
| 416         // need to also restore the fractional translation | 421         // need to also restore the fractional translation | 
| 417         scaledBounds.offset(-SkIntToScalar(SK_DistanceFieldInset) - kAntiAliasPa
     d + dx, | 422         scaledBounds.offset(-SkIntToScalar(SK_DistanceFieldInset) - kAntiAliasPa
     d + dx, | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 536                                                      ATLAS_TEXTURE_WIDTH, ATLAS_
     TEXTURE_HEIGHT, | 541                                                      ATLAS_TEXTURE_WIDTH, ATLAS_
     TEXTURE_HEIGHT, | 
| 537                                                      NUM_PLOTS_X, NUM_PLOTS_Y, | 542                                                      NUM_PLOTS_X, NUM_PLOTS_Y, | 
| 538                                                      &GrAADistanceFieldPathRende
     rer::HandleEviction, | 543                                                      &GrAADistanceFieldPathRende
     rer::HandleEviction, | 
| 539                                                      (void*)this); | 544                                                      (void*)this); | 
| 540         if (!fAtlas) { | 545         if (!fAtlas) { | 
| 541             return false; | 546             return false; | 
| 542         } | 547         } | 
| 543     } | 548     } | 
| 544 | 549 | 
| 545     AADistanceFieldPathBatch::Geometry geometry(*args.fStroke); | 550     AADistanceFieldPathBatch::Geometry geometry(*args.fStroke); | 
| 546     geometry.fPath = *args.fPath; | 551     if (SkStrokeRec::kFill_Style == args.fStroke->getStyle()) { | 
|  | 552         geometry.fPath = *args.fPath; | 
|  | 553     } else { | 
|  | 554         args.fStroke->applyToPath(&geometry.fPath, *args.fPath); | 
|  | 555     } | 
| 547     geometry.fAntiAlias = args.fAntiAlias; | 556     geometry.fAntiAlias = args.fAntiAlias; | 
| 548 | 557     // Note: this is the generation ID of the _original_ path. When a new path i
     s | 
|  | 558     // generated due to stroking it is important that the original path's id is 
     used | 
|  | 559     // for caching. | 
|  | 560     geometry.fGenID = args.fPath->getGenerationID(); | 
|  | 561 | 
| 549     SkAutoTUnref<GrDrawBatch> batch(AADistanceFieldPathBatch::Create(geometry, a
     rgs.fColor, | 562     SkAutoTUnref<GrDrawBatch> batch(AADistanceFieldPathBatch::Create(geometry, a
     rgs.fColor, | 
| 550                                                                      *args.fView
     Matrix, fAtlas, | 563                                                                      *args.fView
     Matrix, fAtlas, | 
| 551                                                                      &fPathCache
     , &fPathList)); | 564                                                                      &fPathCache
     , &fPathList)); | 
| 552     args.fTarget->drawBatch(*args.fPipelineBuilder, batch); | 565     args.fTarget->drawBatch(*args.fPipelineBuilder, batch); | 
| 553 | 566 | 
| 554     return true; | 567     return true; | 
| 555 } | 568 } | 
| 556 | 569 | 
| 557 ////////////////////////////////////////////////////////////////////////////////
     /////////////////// | 570 ////////////////////////////////////////////////////////////////////////////////
     /////////////////// | 
| 558 | 571 | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 613                                                      &PathTestStruct::HandleEvic
     tion, | 626                                                      &PathTestStruct::HandleEvic
     tion, | 
| 614                                                      (void*)&gTestStruct); | 627                                                      (void*)&gTestStruct); | 
| 615     } | 628     } | 
| 616 | 629 | 
| 617     SkMatrix viewMatrix = GrTest::TestMatrix(random); | 630     SkMatrix viewMatrix = GrTest::TestMatrix(random); | 
| 618     GrColor color = GrRandomColor(random); | 631     GrColor color = GrRandomColor(random); | 
| 619 | 632 | 
| 620     AADistanceFieldPathBatch::Geometry geometry(GrTest::TestStrokeRec(random)); | 633     AADistanceFieldPathBatch::Geometry geometry(GrTest::TestStrokeRec(random)); | 
| 621     geometry.fPath = GrTest::TestPath(random); | 634     geometry.fPath = GrTest::TestPath(random); | 
| 622     geometry.fAntiAlias = random->nextBool(); | 635     geometry.fAntiAlias = random->nextBool(); | 
|  | 636     geometry.fGenID = random->nextU(); | 
| 623 | 637 | 
| 624     return AADistanceFieldPathBatch::Create(geometry, color, viewMatrix, | 638     return AADistanceFieldPathBatch::Create(geometry, color, viewMatrix, | 
| 625                                             gTestStruct.fAtlas, | 639                                             gTestStruct.fAtlas, | 
| 626                                             &gTestStruct.fPathCache, | 640                                             &gTestStruct.fPathCache, | 
| 627                                             &gTestStruct.fPathList); | 641                                             &gTestStruct.fPathList); | 
| 628 } | 642 } | 
| 629 | 643 | 
| 630 #endif | 644 #endif | 
| OLD | NEW | 
|---|