| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2011 Google Inc. | 2  * Copyright 2011 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 "SkGpuDevice.h" | 8 #include "SkGpuDevice.h" | 
| 9 | 9 | 
| 10 #include "GrBlurUtils.h" | 10 #include "GrBlurUtils.h" | 
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 239     } | 239     } | 
| 240     SkASSERT(nullptr != texture->asRenderTarget()); | 240     SkASSERT(nullptr != texture->asRenderTarget()); | 
| 241     return texture->asRenderTarget(); | 241     return texture->asRenderTarget(); | 
| 242 } | 242 } | 
| 243 | 243 | 
| 244 SkGpuDevice::~SkGpuDevice() { | 244 SkGpuDevice::~SkGpuDevice() { | 
| 245     if (fDrawProcs) { | 245     if (fDrawProcs) { | 
| 246         delete fDrawProcs; | 246         delete fDrawProcs; | 
| 247     } | 247     } | 
| 248 | 248 | 
|  | 249     SkASSERT(!fRenderTarget->fromRawPixels2()); | 
| 249     fRenderTarget->unref(); | 250     fRenderTarget->unref(); | 
| 250     fContext->unref(); | 251     fContext->unref(); | 
| 251 } | 252 } | 
| 252 | 253 | 
| 253 /////////////////////////////////////////////////////////////////////////////// | 254 /////////////////////////////////////////////////////////////////////////////// | 
| 254 | 255 | 
| 255 bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size
      _t dstRowBytes, | 256 bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size
      _t dstRowBytes, | 
| 256                                int x, int y) { | 257                                int x, int y) { | 
| 257     DO_DEFERRED_CLEAR(); | 258     DO_DEFERRED_CLEAR(); | 
| 258 | 259 | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 274                                 int x, int y) { | 275                                 int x, int y) { | 
| 275     // TODO: teach fRenderTarget to take ImageInfo directly to specify the src p
      ixels | 276     // TODO: teach fRenderTarget to take ImageInfo directly to specify the src p
      ixels | 
| 276     GrPixelConfig config = SkImageInfo2GrPixelConfig(info); | 277     GrPixelConfig config = SkImageInfo2GrPixelConfig(info); | 
| 277     if (kUnknown_GrPixelConfig == config) { | 278     if (kUnknown_GrPixelConfig == config) { | 
| 278         return false; | 279         return false; | 
| 279     } | 280     } | 
| 280     uint32_t flags = 0; | 281     uint32_t flags = 0; | 
| 281     if (kUnpremul_SkAlphaType == info.alphaType()) { | 282     if (kUnpremul_SkAlphaType == info.alphaType()) { | 
| 282         flags = GrContext::kUnpremul_PixelOpsFlag; | 283         flags = GrContext::kUnpremul_PixelOpsFlag; | 
| 283     } | 284     } | 
| 284     fRenderTarget->writePixels(x, y, info.width(), info.height(), config, pixels
      , rowBytes, flags); | 285 | 
|  | 286     fRenderTarget->writePixels(fDrawContext, x, y, info.width(), info.height(), 
      config, pixels, rowBytes, flags); | 
| 285 | 287 | 
| 286     // need to bump our genID for compatibility with clients that "know" we have
       a bitmap | 288     // need to bump our genID for compatibility with clients that "know" we have
       a bitmap | 
| 287     fLegacyBitmap.notifyPixelsChanged(); | 289     fLegacyBitmap.notifyPixelsChanged(); | 
| 288 | 290 | 
| 289     return true; | 291     return true; | 
| 290 } | 292 } | 
| 291 | 293 | 
| 292 const SkBitmap& SkGpuDevice::onAccessBitmap() { | 294 const SkBitmap& SkGpuDevice::onAccessBitmap() { | 
| 293     DO_DEFERRED_CLEAR(); | 295     DO_DEFERRED_CLEAR(); | 
| 294     return fLegacyBitmap; | 296     return fLegacyBitmap; | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 353         this->context(), budgeted, this->imageInfo(), fRenderTarget->desc().fSam
      pleCnt)); | 355         this->context(), budgeted, this->imageInfo(), fRenderTarget->desc().fSam
      pleCnt)); | 
| 354 | 356 | 
| 355     if (nullptr == newRT) { | 357     if (nullptr == newRT) { | 
| 356         return; | 358         return; | 
| 357     } | 359     } | 
| 358 | 360 | 
| 359     if (shouldRetainContent) { | 361     if (shouldRetainContent) { | 
| 360         if (fRenderTarget->wasDestroyed()) { | 362         if (fRenderTarget->wasDestroyed()) { | 
| 361             return; | 363             return; | 
| 362         } | 364         } | 
|  | 365         SkASSERT(fRenderTarget->width() == newRT->width()); | 
|  | 366         SkASSERT(fRenderTarget->height() == newRT->height()); | 
|  | 367 | 
| 363         this->context()->copySurface(newRT, fRenderTarget); | 368         this->context()->copySurface(newRT, fRenderTarget); | 
| 364     } | 369     } | 
| 365 | 370 | 
| 366     SkASSERT(fRenderTarget != newRT); | 371     SkASSERT(fRenderTarget != newRT); | 
| 367 | 372 | 
| 368     fRenderTarget->unref(); | 373     fRenderTarget->unref(); | 
| 369     fRenderTarget = newRT.detach(); | 374     fRenderTarget = newRT.detach(); | 
| 370 | 375 | 
| 371 #ifdef SK_DEBUG | 376 #ifdef SK_DEBUG | 
| 372     SkImageInfo info = fRenderTarget->surfacePriv().info(fOpaque ? kOpaque_SkAlp
      haType : | 377     SkImageInfo info = fRenderTarget->surfacePriv().info(fOpaque ? kOpaque_SkAlp
      haType : | 
| 373                                                                    kPremul_SkAlp
      haType); | 378                                                                    kPremul_SkAlp
      haType); | 
| 374     SkASSERT(info == fLegacyBitmap.info()); | 379     SkASSERT(info == fLegacyBitmap.info()); | 
| 375 #endif | 380 #endif | 
| 376     SkPixelRef* pr = new SkGrPixelRef(fLegacyBitmap.info(), fRenderTarget); | 381     SkPixelRef* pr = new SkGrPixelRef(fLegacyBitmap.info(), fRenderTarget); | 
| 377     fLegacyBitmap.setPixelRef(pr)->unref(); | 382     fLegacyBitmap.setPixelRef(pr)->unref(); | 
| 378 | 383 | 
| 379     fDrawContext.reset(this->context()->drawContext(fRenderTarget, &this->surfac
      eProps())); | 384     fDrawContext.reset(this->context()->drawContext(fRenderTarget, &this->surfac
      eProps())); | 
| 380 } | 385 } | 
| 381 | 386 | 
| 382 /////////////////////////////////////////////////////////////////////////////// | 387 /////////////////////////////////////////////////////////////////////////////// | 
| 383 | 388 | 
| 384 void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { | 389 void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { | 
| 385     CHECK_SHOULD_DRAW(draw); | 390     CHECK_SHOULD_DRAW(draw); | 
| 386     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPaint", fContext); | 391     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPaint", fContext); | 
| 387 | 392 | 
| 388     GrPaint grPaint; | 393     GrPaint grPaint; | 
| 389     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 394     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRend
      erTarget)) { | 
| 390         return; | 395         return; | 
| 391     } | 396     } | 
| 392 | 397 | 
| 393     fDrawContext->drawPaint(fClip, grPaint, *draw.fMatrix); | 398     fDrawContext->drawPaint(fClip, grPaint, *draw.fMatrix); | 
| 394 } | 399 } | 
| 395 | 400 | 
| 396 // must be in SkCanvas::PointMode order | 401 // must be in SkCanvas::PointMode order | 
| 397 static const GrPrimitiveType gPointMode2PrimtiveType[] = { | 402 static const GrPrimitiveType gPointMode2PrimtiveType[] = { | 
| 398     kPoints_GrPrimitiveType, | 403     kPoints_GrPrimitiveType, | 
| 399     kLines_GrPrimitiveType, | 404     kLines_GrPrimitiveType, | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 428     CHECK_SHOULD_DRAW(draw); | 433     CHECK_SHOULD_DRAW(draw); | 
| 429 | 434 | 
| 430     SkScalar width = paint.getStrokeWidth(); | 435     SkScalar width = paint.getStrokeWidth(); | 
| 431     if (width < 0) { | 436     if (width < 0) { | 
| 432         return; | 437         return; | 
| 433     } | 438     } | 
| 434 | 439 | 
| 435     if (paint.getPathEffect() && 2 == count && SkCanvas::kLines_PointMode == mod
      e) { | 440     if (paint.getPathEffect() && 2 == count && SkCanvas::kLines_PointMode == mod
      e) { | 
| 436         GrStrokeInfo strokeInfo(paint, SkPaint::kStroke_Style); | 441         GrStrokeInfo strokeInfo(paint, SkPaint::kStroke_Style); | 
| 437         GrPaint grPaint; | 442         GrPaint grPaint; | 
| 438         if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) 
      { | 443         if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, f
      RenderTarget)) { | 
| 439             return; | 444             return; | 
| 440         } | 445         } | 
| 441         SkPath path; | 446         SkPath path; | 
| 442         path.setIsVolatile(true); | 447         path.setIsVolatile(true); | 
| 443         path.moveTo(pts[0]); | 448         path.moveTo(pts[0]); | 
| 444         path.lineTo(pts[1]); | 449         path.lineTo(pts[1]); | 
| 445         fDrawContext->drawPath(fClip, grPaint, *draw.fMatrix, path, strokeInfo); | 450         fDrawContext->drawPath(fClip, grPaint, *draw.fMatrix, path, strokeInfo); | 
| 446         return; | 451         return; | 
| 447     } | 452     } | 
| 448 | 453 | 
| 449     // we only handle non-antialiased hairlines and paints without path effects 
      or mask filters, | 454     // we only handle non-antialiased hairlines and paints without path effects 
      or mask filters, | 
| 450     // else we let the SkDraw call our drawPath() | 455     // else we let the SkDraw call our drawPath() | 
| 451     if (width > 0 || paint.getPathEffect() || paint.getMaskFilter() || | 456     if (width > 0 || paint.getPathEffect() || paint.getMaskFilter() || | 
| 452         (paint.isAntiAlias() && needs_antialiasing(mode, count, pts))) { | 457         (paint.isAntiAlias() && needs_antialiasing(mode, count, pts))) { | 
| 453         draw.drawPoints(mode, count, pts, paint, true); | 458         draw.drawPoints(mode, count, pts, paint, true); | 
| 454         return; | 459         return; | 
| 455     } | 460     } | 
| 456 | 461 | 
| 457     GrPaint grPaint; | 462     GrPaint grPaint; | 
| 458     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 463     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRend
      erTarget)) { | 
| 459         return; | 464         return; | 
| 460     } | 465     } | 
| 461 | 466 | 
| 462     fDrawContext->drawVertices(fClip, | 467     fDrawContext->drawVertices(fClip, | 
| 463                                grPaint, | 468                                grPaint, | 
| 464                                *draw.fMatrix, | 469                                *draw.fMatrix, | 
| 465                                gPointMode2PrimtiveType[mode], | 470                                gPointMode2PrimtiveType[mode], | 
| 466                                SkToS32(count), | 471                                SkToS32(count), | 
| 467                                (SkPoint*)pts, | 472                                (SkPoint*)pts, | 
| 468                                nullptr, | 473                                nullptr, | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 510 | 515 | 
| 511     if (usePath) { | 516     if (usePath) { | 
| 512         SkPath path; | 517         SkPath path; | 
| 513         path.setIsVolatile(true); | 518         path.setIsVolatile(true); | 
| 514         path.addRect(rect); | 519         path.addRect(rect); | 
| 515         this->drawPath(draw, path, paint, nullptr, true); | 520         this->drawPath(draw, path, paint, nullptr, true); | 
| 516         return; | 521         return; | 
| 517     } | 522     } | 
| 518 | 523 | 
| 519     GrPaint grPaint; | 524     GrPaint grPaint; | 
| 520     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 525     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRend
      erTarget)) { | 
| 521         return; | 526         return; | 
| 522     } | 527     } | 
| 523 | 528 | 
| 524     fDrawContext->drawRect(fClip, grPaint, *draw.fMatrix, rect, &strokeInfo); | 529     fDrawContext->drawRect(fClip, grPaint, *draw.fMatrix, rect, &strokeInfo); | 
| 525 } | 530 } | 
| 526 | 531 | 
| 527 /////////////////////////////////////////////////////////////////////////////// | 532 /////////////////////////////////////////////////////////////////////////////// | 
| 528 | 533 | 
| 529 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, | 534 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, | 
| 530                             const SkPaint& paint) { | 535                             const SkPaint& paint) { | 
| 531     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawRRect", fContext); | 536     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawRRect", fContext); | 
| 532     CHECK_FOR_ANNOTATION(paint); | 537     CHECK_FOR_ANNOTATION(paint); | 
| 533     CHECK_SHOULD_DRAW(draw); | 538     CHECK_SHOULD_DRAW(draw); | 
| 534 | 539 | 
| 535     GrPaint grPaint; | 540     GrPaint grPaint; | 
| 536     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 541     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRend
      erTarget)) { | 
| 537         return; | 542         return; | 
| 538     } | 543     } | 
| 539 | 544 | 
| 540     GrStrokeInfo strokeInfo(paint); | 545     GrStrokeInfo strokeInfo(paint); | 
| 541     if (paint.getMaskFilter()) { | 546     if (paint.getMaskFilter()) { | 
| 542         // try to hit the fast path for drawing filtered round rects | 547         // try to hit the fast path for drawing filtered round rects | 
| 543 | 548 | 
| 544         SkRRect devRRect; | 549         SkRRect devRRect; | 
| 545         if (rect.transform(*draw.fMatrix, &devRRect)) { | 550         if (rect.transform(*draw.fMatrix, &devRRect)) { | 
| 546             if (devRRect.allCornersCircular()) { | 551             if (devRRect.allCornersCircular()) { | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 596 | 601 | 
| 597 void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, | 602 void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, | 
| 598                              const SkRRect& inner, const SkPaint& paint) { | 603                              const SkRRect& inner, const SkPaint& paint) { | 
| 599     SkStrokeRec stroke(paint); | 604     SkStrokeRec stroke(paint); | 
| 600     if (stroke.isFillStyle()) { | 605     if (stroke.isFillStyle()) { | 
| 601 | 606 | 
| 602         CHECK_FOR_ANNOTATION(paint); | 607         CHECK_FOR_ANNOTATION(paint); | 
| 603         CHECK_SHOULD_DRAW(draw); | 608         CHECK_SHOULD_DRAW(draw); | 
| 604 | 609 | 
| 605         GrPaint grPaint; | 610         GrPaint grPaint; | 
| 606         if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) 
      { | 611         if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, f
      RenderTarget)) { | 
| 607             return; | 612             return; | 
| 608         } | 613         } | 
| 609 | 614 | 
| 610         if (nullptr == paint.getMaskFilter() && nullptr == paint.getPathEffect()
      ) { | 615         if (nullptr == paint.getMaskFilter() && nullptr == paint.getPathEffect()
      ) { | 
| 611             fDrawContext->drawDRRect(fClip, grPaint, *draw.fMatrix, outer, inner
      ); | 616             fDrawContext->drawDRRect(fClip, grPaint, *draw.fMatrix, outer, inner
      ); | 
| 612             return; | 617             return; | 
| 613         } | 618         } | 
| 614     } | 619     } | 
| 615 | 620 | 
| 616     SkPath path; | 621     SkPath path; | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 648 | 653 | 
| 649     if (usePath) { | 654     if (usePath) { | 
| 650         SkPath path; | 655         SkPath path; | 
| 651         path.setIsVolatile(true); | 656         path.setIsVolatile(true); | 
| 652         path.addOval(oval); | 657         path.addOval(oval); | 
| 653         this->drawPath(draw, path, paint, nullptr, true); | 658         this->drawPath(draw, path, paint, nullptr, true); | 
| 654         return; | 659         return; | 
| 655     } | 660     } | 
| 656 | 661 | 
| 657     GrPaint grPaint; | 662     GrPaint grPaint; | 
| 658     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 663     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRend
      erTarget)) { | 
| 659         return; | 664         return; | 
| 660     } | 665     } | 
| 661 | 666 | 
| 662     fDrawContext->drawOval(fClip, grPaint, *draw.fMatrix, oval, strokeInfo); | 667     fDrawContext->drawOval(fClip, grPaint, *draw.fMatrix, oval, strokeInfo); | 
| 663 } | 668 } | 
| 664 | 669 | 
| 665 #include "SkMaskFilter.h" | 670 #include "SkMaskFilter.h" | 
| 666 | 671 | 
| 667 /////////////////////////////////////////////////////////////////////////////// | 672 /////////////////////////////////////////////////////////////////////////////// | 
| 668 | 673 | 
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 999                                    "Couldn't convert bitmap to texture."); | 1004                                    "Couldn't convert bitmap to texture."); | 
| 1000         return; | 1005         return; | 
| 1001     } | 1006     } | 
| 1002 | 1007 | 
| 1003 | 1008 | 
| 1004     GrPaint grPaint; | 1009     GrPaint grPaint; | 
| 1005 | 1010 | 
| 1006     // Create and insert texture effect | 1011     // Create and insert texture effect | 
| 1007     SkAutoTUnref<const GrFragmentProcessor> fp; | 1012     SkAutoTUnref<const GrFragmentProcessor> fp; | 
| 1008     if (doBicubic) { | 1013     if (doBicubic) { | 
| 1009         fp.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), tm)); | 1014         fp.reset(GrBicubicEffect::Create(texture, | 
|  | 1015                                          SkMatrix::I(), | 
|  | 1016                                          tm, renderTarget)); | 
| 1010     } else { | 1017     } else { | 
| 1011         fp.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), params)); | 1018         fp.reset(GrSimpleTextureEffect::Create(texture, | 
|  | 1019                                                SkMatrix::I(), params, kLocal_GrC
      oordSet, renderTarget)); | 
| 1012     } | 1020     } | 
| 1013 | 1021 | 
| 1014     if (kAlpha_8_SkColorType == bitmapPtr->colorType()) { | 1022     if (kAlpha_8_SkColorType == bitmapPtr->colorType()) { | 
| 1015         fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 1023         fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 
| 1016     } else { | 1024     } else { | 
| 1017         fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 1025         fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 
| 1018     } | 1026     } | 
| 1019 | 1027 | 
| 1020     if (!SkPaintToGrPaintReplaceShader(context, paint, fp, &grPaint)) { | 1028     if (!SkPaintToGrPaintReplaceShader(context, paint, fp, &grPaint, renderTarge
      t)) { | 
| 1021         return; | 1029         return; | 
| 1022     } | 1030     } | 
| 1023 | 1031 | 
| 1024     // Setup dst rect and final matrix | 1032     // Setup dst rect and final matrix | 
| 1025     SkRect dstRect = {0, 0, dstSize.fWidth, dstSize.fHeight}; | 1033     SkRect dstRect = {0, 0, dstSize.fWidth, dstSize.fHeight}; | 
| 1026 | 1034 | 
| 1027     SkRect devRect; | 1035     SkRect devRect; | 
| 1028     viewMatrix.mapRect(&devRect, dstRect); | 1036     viewMatrix.mapRect(&devRect, dstRect); | 
| 1029 | 1037 | 
| 1030     SkMatrix matrix; | 1038     SkMatrix matrix; | 
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1355         } | 1363         } | 
| 1356         if (srcRect.height() > SK_Scalar1) { | 1364         if (srcRect.height() > SK_Scalar1) { | 
| 1357             SkScalar border = SK_ScalarHalf / texture->height(); | 1365             SkScalar border = SK_ScalarHalf / texture->height(); | 
| 1358             top = paintRect.top() + border; | 1366             top = paintRect.top() + border; | 
| 1359             bottom = paintRect.bottom() - border; | 1367             bottom = paintRect.bottom() - border; | 
| 1360         } else { | 1368         } else { | 
| 1361             top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); | 1369             top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); | 
| 1362         } | 1370         } | 
| 1363         textureDomain.setLTRB(left, top, right, bottom); | 1371         textureDomain.setLTRB(left, top, right, bottom); | 
| 1364         if (bicubic) { | 1372         if (bicubic) { | 
| 1365             fp.reset(GrBicubicEffect::Create(texture, texMatrix, textureDomain))
      ; | 1373 | 
|  | 1374             fp.reset(GrBicubicEffect::Create(texture, | 
|  | 1375                                              SkMatrix::I(), textureDomain, fRend
      erTarget)); | 
| 1366         } else { | 1376         } else { | 
| 1367             fp.reset(GrTextureDomainEffect::Create(texture, | 1377             fp.reset(GrTextureDomainEffect::Create(texture, | 
| 1368                                                    texMatrix, | 1378                                                    texMatrix, | 
| 1369                                                    textureDomain, | 1379                                                    textureDomain, | 
| 1370                                                    GrTextureDomain::kClamp_Mode, | 1380                                                    GrTextureDomain::kClamp_Mode, | 
| 1371                                                    params.filterMode())); | 1381                                                    params.filterMode(), kLocal_G
      rCoordSet, fRenderTarget)); | 
| 1372         } | 1382         } | 
| 1373     } else if (bicubic) { | 1383     } else if (bicubic) { | 
| 1374         SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); | 1384         SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); | 
| 1375         SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil
      eModeY() }; | 1385         SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil
      eModeY() }; | 
| 1376         fp.reset(GrBicubicEffect::Create(texture, texMatrix, tileModes)); | 1386         fp.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), | 
|  | 1387                                          tileModes, fRenderTarget)); | 
| 1377     } else { | 1388     } else { | 
| 1378         fp.reset(GrSimpleTextureEffect::Create(texture, texMatrix, params)); | 1389         fp.reset(GrSimpleTextureEffect::Create(texture, | 
|  | 1390                                                SkMatrix::I(), params, kLocal_GrC
      oordSet, fRenderTarget)); | 
| 1379     } | 1391     } | 
| 1380 | 1392 | 
| 1381     SkAutoTUnref<const GrFragmentProcessor> shaderFP; | 1393     SkAutoTUnref<const GrFragmentProcessor> shaderFP; | 
| 1382 | 1394 | 
| 1383     if (kAlpha_8_SkColorType == bitmap.colorType()) { | 1395     if (kAlpha_8_SkColorType == bitmap.colorType()) { | 
| 1384         if (const SkShader* shader = paint.getShader()) { | 1396         if (const SkShader* shader = paint.getShader()) { | 
| 1385             shaderFP.reset(shader->asFragmentProcessor(this->context(), | 1397             shaderFP.reset(shader->asFragmentProcessor(this->context(), | 
| 1386                                                        viewMatrix, | 1398                                                        viewMatrix, | 
| 1387                                                        nullptr, | 1399                                                        nullptr, | 
| 1388                                                        paint.getFilterQuality())
      ); | 1400                                                        paint.getFilterQuality(),
       fRenderTarget)); | 
| 1389             if (!shaderFP) { | 1401             if (!shaderFP) { | 
| 1390                 return; | 1402                 return; | 
| 1391             } | 1403             } | 
| 1392             const GrFragmentProcessor* fpSeries[] = { shaderFP.get(), fp.get() }
      ; | 1404             const GrFragmentProcessor* fpSeries[] = { shaderFP.get(), fp.get() }
      ; | 
| 1393             fp.reset(GrFragmentProcessor::RunInSeries(fpSeries, 2)); | 1405             fp.reset(GrFragmentProcessor::RunInSeries(fpSeries, 2)); | 
| 1394         } else { | 1406         } else { | 
| 1395             fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 1407             fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 
| 1396         } | 1408         } | 
| 1397     } else { | 1409     } else { | 
| 1398         fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 1410         fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 
| 1399     } | 1411     } | 
| 1400 | 1412 | 
| 1401     if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { | 1413     if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint, fRe
      nderTarget)) { | 
| 1402         return; | 1414         return; | 
| 1403     } | 1415     } | 
| 1404 | 1416 | 
| 1405     if (kAlpha_8_SkColorType == bitmap.colorType() && paint.getShader()) { | 1417     if (kAlpha_8_SkColorType == bitmap.colorType() && paint.getShader()) { | 
| 1406         // We don't have local coords in this case and have previously set the t
      ransform | 1418         // We don't have local coords in this case and have previously set the t
      ransform | 
| 1407         // matrices directly on the texture processor. | 1419         // matrices directly on the texture processor. | 
| 1408         fDrawContext->drawRect(fClip, grPaint, viewMatrix, dstRect); | 1420         fDrawContext->drawRect(fClip, grPaint, viewMatrix, dstRect); | 
| 1409     } else { | 1421     } else { | 
| 1410         fDrawContext->fillRectToRect(fClip, grPaint, viewMatrix, dstRect, paintR
      ect); | 1422         fDrawContext->fillRectToRect(fClip, grPaint, viewMatrix, dstRect, paintR
      ect); | 
| 1411     } | 1423     } | 
| 1412 } | 1424 } | 
| 1413 | 1425 | 
| 1414 bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture, | 1426 bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture, | 
| 1415                                 int width, int height, | 1427                                 int width, int height, | 
| 1416                                 const SkImageFilter* filter, | 1428                                 const SkImageFilter* filter, | 
| 1417                                 const SkImageFilter::Context& ctx, | 1429                                 const SkImageFilter::Context& ctx, | 
| 1418                                 SkBitmap* result, SkIPoint* offset) { | 1430                                 SkBitmap* result, SkIPoint* offset) { | 
| 1419     SkASSERT(filter); | 1431     SkASSERT(filter); | 
| 1420 | 1432 | 
| 1421     SkImageFilter::DeviceProxy proxy(this); | 1433     if (filter->canFilterImageGPU()) { | 
|  | 1434         SkImageFilter::DeviceProxy proxy(this); | 
| 1422 | 1435 | 
| 1423     if (filter->canFilterImageGPU()) { |  | 
| 1424         return filter->filterImageGPU(&proxy, wrap_texture(texture, width, heigh
      t), | 1436         return filter->filterImageGPU(&proxy, wrap_texture(texture, width, heigh
      t), | 
| 1425                                       ctx, result, offset); | 1437                                       ctx, result, offset); | 
| 1426     } else { | 1438     } else { | 
| 1427         return false; | 1439         return false; | 
| 1428     } | 1440     } | 
| 1429 } | 1441 } | 
| 1430 | 1442 | 
| 1431 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | 1443 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | 
| 1432                              int left, int top, const SkPaint& paint) { | 1444                              int left, int top, const SkPaint& paint) { | 
| 1433     // drawSprite is defined to be in device coords. | 1445     // drawSprite is defined to be in device coords. | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1472             top += offset.y(); | 1484             top += offset.y(); | 
| 1473         } else { | 1485         } else { | 
| 1474             return; | 1486             return; | 
| 1475         } | 1487         } | 
| 1476         SkASSERT(!GrPixelConfigIsAlphaOnly(texture->config())); | 1488         SkASSERT(!GrPixelConfigIsAlphaOnly(texture->config())); | 
| 1477         alphaOnly = false; | 1489         alphaOnly = false; | 
| 1478     } | 1490     } | 
| 1479 | 1491 | 
| 1480     GrPaint grPaint; | 1492     GrPaint grPaint; | 
| 1481     SkAutoTUnref<const GrFragmentProcessor> fp( | 1493     SkAutoTUnref<const GrFragmentProcessor> fp( | 
| 1482         GrSimpleTextureEffect::Create(texture, SkMatrix::I())); | 1494         GrSimpleTextureEffect::Create(texture, SkMatrix::I(), | 
|  | 1495                                       kLocal_GrCoordSet, fRenderTarget)); | 
| 1483     if (alphaOnly) { | 1496     if (alphaOnly) { | 
| 1484         fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 1497         fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 
| 1485     } else { | 1498     } else { | 
| 1486         fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 1499         fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 
| 1487     } | 1500     } | 
| 1488     if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { | 1501     if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint, fRe
      nderTarget)) { | 
| 1489         return; | 1502         return; | 
| 1490     } | 1503     } | 
| 1491 | 1504 | 
| 1492     fDrawContext->fillRectToRect(fClip, | 1505     fDrawContext->fillRectToRect(fClip, | 
| 1493                                  grPaint, | 1506                                  grPaint, | 
| 1494                                  SkMatrix::I(), | 1507                                  SkMatrix::I(), | 
| 1495                                  SkRect::MakeXYWH(SkIntToScalar(left), | 1508                                  SkRect::MakeXYWH(SkIntToScalar(left), | 
| 1496                                                   SkIntToScalar(top), | 1509                                                   SkIntToScalar(top), | 
| 1497                                                   SkIntToScalar(w), | 1510                                                   SkIntToScalar(w), | 
| 1498                                                   SkIntToScalar(h)), | 1511                                                   SkIntToScalar(h)), | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1562     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawDevice", fContext); | 1575     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawDevice", fContext); | 
| 1563     SkGpuDevice* dev = static_cast<SkGpuDevice*>(device); | 1576     SkGpuDevice* dev = static_cast<SkGpuDevice*>(device); | 
| 1564 | 1577 | 
| 1565     // TODO: If the source device covers the whole of this device, we could | 1578     // TODO: If the source device covers the whole of this device, we could | 
| 1566     // omit fNeedsClear -related flushing. | 1579     // omit fNeedsClear -related flushing. | 
| 1567     // TODO: if source needs clear, we could maybe omit the draw fully. | 1580     // TODO: if source needs clear, we could maybe omit the draw fully. | 
| 1568 | 1581 | 
| 1569     // drawDevice is defined to be in device coords. | 1582     // drawDevice is defined to be in device coords. | 
| 1570     CHECK_SHOULD_DRAW(draw); | 1583     CHECK_SHOULD_DRAW(draw); | 
| 1571 | 1584 | 
| 1572     GrRenderTarget* devRT = dev->accessRenderTarget(); | 1585     GrRenderTarget* srcDevRT = dev->accessRenderTarget(); | 
| 1573     GrTexture* devTex; | 1586     GrTexture* srcDevTex; | 
| 1574     if (nullptr == (devTex = devRT->asTexture())) { | 1587     if (nullptr == (srcDevTex = srcDevRT->asTexture())) { | 
| 1575         return; | 1588         return; | 
| 1576     } | 1589     } | 
| 1577 | 1590 | 
| 1578     const SkImageInfo ii = dev->imageInfo(); | 1591     const SkImageInfo ii = dev->imageInfo(); | 
| 1579     int w = ii.width(); | 1592     int w = ii.width(); | 
| 1580     int h = ii.height(); | 1593     int h = ii.height(); | 
| 1581 | 1594 | 
| 1582     SkImageFilter* filter = paint.getImageFilter(); | 1595     SkImageFilter* filter = paint.getImageFilter(); | 
| 1583     // This bitmap will own the filtered result as a texture. | 1596     // This bitmap will own the filtered result as a texture. | 
| 1584     SkBitmap filteredBitmap; | 1597     SkBitmap filteredBitmap; | 
| 1585 | 1598 | 
| 1586     if (filter) { | 1599     if (filter) { | 
| 1587         SkIPoint offset = SkIPoint::Make(0, 0); | 1600         SkIPoint offset = SkIPoint::Make(0, 0); | 
| 1588         SkMatrix matrix(*draw.fMatrix); | 1601         SkMatrix matrix(*draw.fMatrix); | 
| 1589         matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); | 1602         matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); | 
| 1590         SkIRect clipBounds = SkIRect::MakeWH(devTex->width(), devTex->height()); | 1603         SkIRect clipBounds = SkIRect::MakeWH(srcDevTex->width(), srcDevTex->heig
      ht()); | 
| 1591         // This cache is transient, and is freed (along with all its contained | 1604         // This cache is transient, and is freed (along with all its contained | 
| 1592         // textures) when it goes out of scope. | 1605         // textures) when it goes out of scope. | 
| 1593         SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache()); | 1606         SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache()); | 
| 1594         SkImageFilter::Context ctx(matrix, clipBounds, cache, SkImageFilter::kAp
      prox_SizeConstraint); | 1607         SkImageFilter::Context ctx(matrix, clipBounds, cache, SkImageFilter::kAp
      prox_SizeConstraint); | 
| 1595         if (this->filterTexture(fContext, devTex, device->width(), device->heigh
      t(), | 1608         if (this->filterTexture(fContext, srcDevTex, device->width(), device->he
      ight(), | 
| 1596                                 filter, ctx, &filteredBitmap, &offset)) { | 1609                                 filter, ctx, &filteredBitmap, &offset)) { | 
| 1597             devTex = filteredBitmap.getTexture(); | 1610             srcDevTex = filteredBitmap.getTexture(); | 
|  | 1611             srcDevRT = srcDevTex->asRenderTarget(); | 
| 1598             w = filteredBitmap.width(); | 1612             w = filteredBitmap.width(); | 
| 1599             h = filteredBitmap.height(); | 1613             h = filteredBitmap.height(); | 
| 1600             x += offset.fX; | 1614             x += offset.fX; | 
| 1601             y += offset.fY; | 1615             y += offset.fY; | 
| 1602         } else { | 1616         } else { | 
| 1603             return; | 1617             return; | 
| 1604         } | 1618         } | 
| 1605     } | 1619     } | 
| 1606 | 1620 | 
| 1607     GrPaint grPaint; | 1621     GrPaint grPaint; | 
| 1608     SkAutoTUnref<const GrFragmentProcessor> fp( | 1622     SkAutoTUnref<const GrFragmentProcessor> fp( | 
| 1609         GrSimpleTextureEffect::Create(devTex, SkMatrix::I())); | 1623         GrSimpleTextureEffect::Create(srcDevTex, SkMatrix::I(), | 
| 1610     if (GrPixelConfigIsAlphaOnly(devTex->config())) { | 1624                                       kLocal_GrCoordSet, fRenderTarget)); | 
|  | 1625     if (GrPixelConfigIsAlphaOnly(srcDevTex->config())) { | 
| 1611         // Can this happen? | 1626         // Can this happen? | 
| 1612         fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 1627         fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 
| 1613    } else { | 1628     } else { | 
| 1614         fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 1629         fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 
| 1615     } | 1630     } | 
| 1616 | 1631 | 
| 1617     if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { | 1632     if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint, fRe
      nderTarget)) { | 
| 1618         return; | 1633         return; | 
| 1619     } | 1634     } | 
| 1620 | 1635 | 
| 1621     SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(x), | 1636     SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(x), | 
| 1622                                       SkIntToScalar(y), | 1637                                       SkIntToScalar(y), | 
| 1623                                       SkIntToScalar(w), | 1638                                       SkIntToScalar(w), | 
| 1624                                       SkIntToScalar(h)); | 1639                                       SkIntToScalar(h)); | 
| 1625 | 1640 | 
| 1626     // The device being drawn may not fill up its texture (e.g. saveLayer uses a
      pproximate | 1641     // The device being drawn may not fill up its texture (e.g. saveLayer uses a
      pproximate | 
| 1627     // scratch texture). | 1642     // scratch texture). | 
| 1628     SkRect srcRect = SkRect::MakeWH(SK_Scalar1 * w / devTex->width(), | 1643     SkRect srcRect = SkRect::MakeWH(SK_Scalar1 * w / srcDevTex->width(), | 
| 1629                                     SK_Scalar1 * h / devTex->height()); | 1644                                     SK_Scalar1 * h / srcDevTex->height()); | 
| 1630 | 1645 | 
| 1631     fDrawContext->fillRectToRect(fClip, grPaint, SkMatrix::I(), dstRect, srcRect
      ); | 1646     fDrawContext->fillRectToRect(fClip, grPaint, SkMatrix::I(), dstRect, srcRect
      ); | 
| 1632 } | 1647 } | 
| 1633 | 1648 | 
|  | 1649 void SkGpuDevice::discard37() { | 
|  | 1650     fDrawContext->discard(); | 
|  | 1651     // TODO: we need to close off the DrawTarget & create a new one | 
|  | 1652 } | 
|  | 1653 | 
| 1634 bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) { | 1654 bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) { | 
| 1635     return filter->canFilterImageGPU(); | 1655     return filter->canFilterImageGPU(); | 
| 1636 } | 1656 } | 
| 1637 | 1657 | 
| 1638 bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src, | 1658 bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src, | 
| 1639                               const SkImageFilter::Context& ctx, | 1659                               const SkImageFilter::Context& ctx, | 
| 1640                               SkBitmap* result, SkIPoint* offset) { | 1660                               SkBitmap* result, SkIPoint* offset) { | 
| 1641     // want explicitly our impl, so guard against a subclass of us overriding it | 1661     // want explicitly our impl, so guard against a subclass of us overriding it | 
| 1642     if (!this->SkGpuDevice::canHandleImageFilter(filter)) { | 1662     if (!this->SkGpuDevice::canHandleImageFilter(filter)) { | 
| 1643         return false; | 1663         return false; | 
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1717     if (this->shouldTileImage(image, src, constraint, paint.getFilterQuality(), 
      viewMatrix)) { | 1737     if (this->shouldTileImage(image, src, constraint, paint.getFilterQuality(), 
      viewMatrix)) { | 
| 1718         // only support tiling as bitmap at the moment, so force raster-version | 1738         // only support tiling as bitmap at the moment, so force raster-version | 
| 1719         if (!as_IB(image)->getROPixels(&bm)) { | 1739         if (!as_IB(image)->getROPixels(&bm)) { | 
| 1720             return; | 1740             return; | 
| 1721         } | 1741         } | 
| 1722     } else { | 1742     } else { | 
| 1723         if (!wrap_as_bm(this->context(), image, &bm)) { | 1743         if (!wrap_as_bm(this->context(), image, &bm)) { | 
| 1724             return; | 1744             return; | 
| 1725         } | 1745         } | 
| 1726     } | 1746     } | 
|  | 1747 | 
| 1727     this->drawBitmapRect(draw, bm, src, dst, paint, constraint); | 1748     this->drawBitmapRect(draw, bm, src, dst, paint, constraint); | 
| 1728 } | 1749 } | 
| 1729 | 1750 | 
| 1730 /////////////////////////////////////////////////////////////////////////////// | 1751 /////////////////////////////////////////////////////////////////////////////// | 
| 1731 | 1752 | 
| 1732 // must be in SkCanvas::VertexMode order | 1753 // must be in SkCanvas::VertexMode order | 
| 1733 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { | 1754 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { | 
| 1734     kTriangles_GrPrimitiveType, | 1755     kTriangles_GrPrimitiveType, | 
| 1735     kTriangleStrip_GrPrimitiveType, | 1756     kTriangleStrip_GrPrimitiveType, | 
| 1736     kTriangleFan_GrPrimitiveType, | 1757     kTriangleFan_GrPrimitiveType, | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 1749     if ((nullptr == texs || nullptr == paint.getShader()) && nullptr == colors) 
      { | 1770     if ((nullptr == texs || nullptr == paint.getShader()) && nullptr == colors) 
      { | 
| 1750 | 1771 | 
| 1751         texs = nullptr; | 1772         texs = nullptr; | 
| 1752 | 1773 | 
| 1753         SkPaint copy(paint); | 1774         SkPaint copy(paint); | 
| 1754         copy.setStyle(SkPaint::kStroke_Style); | 1775         copy.setStyle(SkPaint::kStroke_Style); | 
| 1755         copy.setStrokeWidth(0); | 1776         copy.setStrokeWidth(0); | 
| 1756 | 1777 | 
| 1757         GrPaint grPaint; | 1778         GrPaint grPaint; | 
| 1758         // we ignore the shader if texs is null. | 1779         // we ignore the shader if texs is null. | 
| 1759         if (!SkPaintToGrPaintNoShader(this->context(), copy, &grPaint)) { | 1780         if (!SkPaintToGrPaintNoShader(this->context(), copy, &grPaint, fRenderTa
      rget)) { | 
| 1760             return; | 1781             return; | 
| 1761         } | 1782         } | 
| 1762 | 1783 | 
| 1763         int triangleCount = 0; | 1784         int triangleCount = 0; | 
| 1764         int n = (nullptr == indices) ? vertexCount : indexCount; | 1785         int n = (nullptr == indices) ? vertexCount : indexCount; | 
| 1765         switch (vmode) { | 1786         switch (vmode) { | 
| 1766             case SkCanvas::kTriangles_VertexMode: | 1787             case SkCanvas::kTriangles_VertexMode: | 
| 1767                 triangleCount = n / 3; | 1788                 triangleCount = n / 3; | 
| 1768                 break; | 1789                 break; | 
| 1769             case SkCanvas::kTriangleStrip_VertexMode: | 1790             case SkCanvas::kTriangleStrip_VertexMode: | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 1782         int i = 0; | 1803         int i = 0; | 
| 1783         while (vertProc(&state)) { | 1804         while (vertProc(&state)) { | 
| 1784             lineIndices[i]     = state.f0; | 1805             lineIndices[i]     = state.f0; | 
| 1785             lineIndices[i + 1] = state.f1; | 1806             lineIndices[i + 1] = state.f1; | 
| 1786             lineIndices[i + 2] = state.f1; | 1807             lineIndices[i + 2] = state.f1; | 
| 1787             lineIndices[i + 3] = state.f2; | 1808             lineIndices[i + 3] = state.f2; | 
| 1788             lineIndices[i + 4] = state.f2; | 1809             lineIndices[i + 4] = state.f2; | 
| 1789             lineIndices[i + 5] = state.f0; | 1810             lineIndices[i + 5] = state.f0; | 
| 1790             i += 6; | 1811             i += 6; | 
| 1791         } | 1812         } | 
|  | 1813 | 
| 1792         fDrawContext->drawVertices(fClip, | 1814         fDrawContext->drawVertices(fClip, | 
| 1793                                    grPaint, | 1815                                    grPaint, | 
| 1794                                    *draw.fMatrix, | 1816                                    *draw.fMatrix, | 
| 1795                                    kLines_GrPrimitiveType, | 1817                                    kLines_GrPrimitiveType, | 
| 1796                                    vertexCount, | 1818                                    vertexCount, | 
| 1797                                    vertices, | 1819                                    vertices, | 
| 1798                                    texs, | 1820                                    texs, | 
| 1799                                    colors, | 1821                                    colors, | 
| 1800                                    lineIndices.get(), | 1822                                    lineIndices.get(), | 
| 1801                                    indexCount); | 1823                                    indexCount); | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 1821             // xmode is defined to mean modulate. | 1843             // xmode is defined to mean modulate. | 
| 1822             SkXfermode::Mode colorMode; | 1844             SkXfermode::Mode colorMode; | 
| 1823             if (xmode) { | 1845             if (xmode) { | 
| 1824                 if (!xmode->asMode(&colorMode)) { | 1846                 if (!xmode->asMode(&colorMode)) { | 
| 1825                     return; | 1847                     return; | 
| 1826                 } | 1848                 } | 
| 1827             } else { | 1849             } else { | 
| 1828                 colorMode = SkXfermode::kModulate_Mode; | 1850                 colorMode = SkXfermode::kModulate_Mode; | 
| 1829             } | 1851             } | 
| 1830             if (!SkPaintToGrPaintWithXfermode(this->context(), paint, *draw.fMat
      rix, colorMode, | 1852             if (!SkPaintToGrPaintWithXfermode(this->context(), paint, *draw.fMat
      rix, colorMode, | 
| 1831                                               false, &grPaint)) { | 1853                                               false, &grPaint, fRenderTarget)) { | 
| 1832                 return; | 1854                 return; | 
| 1833             } | 1855             } | 
| 1834         } else { | 1856         } else { | 
| 1835             // We have a shader, but no colors to blend it against. | 1857             // We have a shader, but no colors to blend it against. | 
| 1836             if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPain
      t)) { | 1858             if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPain
      t, fRenderTarget)) { | 
| 1837                 return; | 1859                 return; | 
| 1838             } | 1860             } | 
| 1839         } | 1861         } | 
| 1840     } else { | 1862     } else { | 
| 1841         if (colors) { | 1863         if (colors) { | 
| 1842             // We have colors, but either have no shader or no texture coords (w
      hich implies that | 1864             // We have colors, but either have no shader or no texture coords (w
      hich implies that | 
| 1843             // we should ignore the shader). | 1865             // we should ignore the shader). | 
| 1844             if (!SkPaintToGrPaintWithPrimitiveColor(this->context(), paint, &grP
      aint)) { | 1866             if (!SkPaintToGrPaintWithPrimitiveColor(this->context(), paint, &grP
      aint, fRenderTarget)) { | 
| 1845                 return; | 1867                 return; | 
| 1846             } | 1868             } | 
| 1847         } else { | 1869         } else { | 
| 1848             // No colors and no shaders. Just draw with the paint color. | 1870             // No colors and no shaders. Just draw with the paint color. | 
| 1849             if (!SkPaintToGrPaintNoShader(this->context(), paint, &grPaint)) { | 1871             if (!SkPaintToGrPaintNoShader(this->context(), paint, &grPaint, fRen
      derTarget)) { | 
| 1850                 return; | 1872                 return; | 
| 1851             } | 1873             } | 
| 1852         } | 1874         } | 
| 1853     } | 1875     } | 
| 1854 | 1876 | 
| 1855     fDrawContext->drawVertices(fClip, | 1877     fDrawContext->drawVertices(fClip, | 
| 1856                                grPaint, | 1878                                grPaint, | 
| 1857                                *draw.fMatrix, | 1879                                *draw.fMatrix, | 
| 1858                                primType, | 1880                                primType, | 
| 1859                                vertexCount, | 1881                                vertexCount, | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 1874         return; | 1896         return; | 
| 1875     } | 1897     } | 
| 1876 | 1898 | 
| 1877     CHECK_SHOULD_DRAW(draw); | 1899     CHECK_SHOULD_DRAW(draw); | 
| 1878     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); | 1900     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); | 
| 1879 | 1901 | 
| 1880     SkPaint p(paint); | 1902     SkPaint p(paint); | 
| 1881     p.setShader(atlas->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_Til
      eMode))->unref(); | 1903     p.setShader(atlas->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_Til
      eMode))->unref(); | 
| 1882 | 1904 | 
| 1883     GrPaint grPaint; | 1905     GrPaint grPaint; | 
|  | 1906 | 
| 1884     if (colors) { | 1907     if (colors) { | 
| 1885         if (!SkPaintToGrPaintWithXfermode(this->context(), p, *draw.fMatrix, mod
      e, true, | 1908         if (!SkPaintToGrPaintWithXfermode(this->context(), p, *draw.fMatrix, mod
      e, true, | 
| 1886                                           &grPaint)) { | 1909                                           &grPaint, fRenderTarget)) { | 
| 1887             return; | 1910             return; | 
| 1888         } | 1911         } | 
| 1889     } else { | 1912     } else { | 
| 1890         if (!SkPaintToGrPaint(this->context(), p, *draw.fMatrix, &grPaint)) { | 1913         if (!SkPaintToGrPaint(this->context(), p, *draw.fMatrix, &grPaint, fRend
      erTarget)) { | 
| 1891             return; | 1914             return; | 
| 1892         } | 1915         } | 
| 1893     } | 1916     } | 
| 1894 | 1917 | 
| 1895     SkDEBUGCODE(this->validate();) | 1918     SkDEBUGCODE(this->validate();) | 
| 1896     fDrawContext->drawAtlas(fClip, grPaint, *draw.fMatrix, count, xform, texRect
      , colors); | 1919     fDrawContext->drawAtlas(fClip, grPaint, *draw.fMatrix, count, xform, texRect
      , colors); | 
| 1897 } | 1920 } | 
| 1898 | 1921 | 
| 1899 /////////////////////////////////////////////////////////////////////////////// | 1922 /////////////////////////////////////////////////////////////////////////////// | 
| 1900 | 1923 | 
| 1901 void SkGpuDevice::drawText(const SkDraw& draw, const void* text, | 1924 void SkGpuDevice::drawText(const SkDraw& draw, const void* text, | 
| 1902                            size_t byteLength, SkScalar x, SkScalar y, | 1925                            size_t byteLength, SkScalar x, SkScalar y, | 
| 1903                            const SkPaint& paint) { | 1926                            const SkPaint& paint) { | 
| 1904     CHECK_SHOULD_DRAW(draw); | 1927     CHECK_SHOULD_DRAW(draw); | 
| 1905     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); | 1928     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); | 
| 1906 | 1929 | 
| 1907     GrPaint grPaint; | 1930     GrPaint grPaint; | 
| 1908     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 1931     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRend
      erTarget)) { | 
| 1909         return; | 1932         return; | 
| 1910     } | 1933     } | 
| 1911 | 1934 | 
| 1912     SkDEBUGCODE(this->validate();) | 1935     SkDEBUGCODE(this->validate();) | 
| 1913 | 1936 | 
| 1914     fDrawContext->drawText(fClip, grPaint, paint, *draw.fMatrix, | 1937     fDrawContext->drawText(fClip, grPaint, paint, *draw.fMatrix, | 
| 1915                            (const char *)text, byteLength, x, y, draw.fClip->get
      Bounds()); | 1938                            (const char *)text, byteLength, x, y, draw.fClip->get
      Bounds()); | 
| 1916 } | 1939 } | 
| 1917 | 1940 | 
| 1918 void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL
      ength, | 1941 void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL
      ength, | 
| 1919                               const SkScalar pos[], int scalarsPerPos, | 1942                               const SkScalar pos[], int scalarsPerPos, | 
| 1920                               const SkPoint& offset, const SkPaint& paint) { | 1943                               const SkPoint& offset, const SkPaint& paint) { | 
| 1921     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPosText", fContext); | 1944     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPosText", fContext); | 
| 1922     CHECK_SHOULD_DRAW(draw); | 1945     CHECK_SHOULD_DRAW(draw); | 
| 1923 | 1946 | 
| 1924     GrPaint grPaint; | 1947     GrPaint grPaint; | 
| 1925     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 1948     if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRend
      erTarget)) { | 
| 1926         return; | 1949         return; | 
| 1927     } | 1950     } | 
| 1928 | 1951 | 
| 1929     SkDEBUGCODE(this->validate();) | 1952     SkDEBUGCODE(this->validate();) | 
| 1930 | 1953 | 
| 1931     fDrawContext->drawPosText(fClip, grPaint, paint, *draw.fMatrix, | 1954     fDrawContext->drawPosText(fClip, grPaint, paint, *draw.fMatrix, | 
| 1932                               (const char *)text, byteLength, pos, scalarsPerPos
      , offset, | 1955                               (const char *)text, byteLength, pos, scalarsPerPos
      , offset, | 
| 1933                               draw.fClip->getBounds()); | 1956                               draw.fClip->getBounds()); | 
| 1934 } | 1957 } | 
| 1935 | 1958 | 
| 1936 void SkGpuDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSca
      lar x, SkScalar y, | 1959 void SkGpuDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSca
      lar x, SkScalar y, | 
| 1937                                const SkPaint& paint, SkDrawFilter* drawFilter) { | 1960                                const SkPaint& paint, SkDrawFilter* drawFilter) { | 
|  | 1961     if (fContext->abandoned()) { | 
|  | 1962         return; | 
|  | 1963     } | 
|  | 1964 | 
| 1938     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawTextBlob", fContext); | 1965     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawTextBlob", fContext); | 
| 1939     CHECK_SHOULD_DRAW(draw); | 1966     CHECK_SHOULD_DRAW(draw); | 
| 1940 | 1967 | 
| 1941     SkDEBUGCODE(this->validate();) | 1968     SkDEBUGCODE(this->validate();) | 
| 1942 | 1969 | 
| 1943     fDrawContext->drawTextBlob(fClip, paint, *draw.fMatrix, | 1970     fDrawContext->drawTextBlob(fClip, paint, *draw.fMatrix, | 
| 1944                                blob, x, y, drawFilter, draw.fClip->getBounds()); | 1971                                blob, x, y, drawFilter, draw.fClip->getBounds()); | 
| 1945 } | 1972 } | 
| 1946 | 1973 | 
| 1947 /////////////////////////////////////////////////////////////////////////////// | 1974 /////////////////////////////////////////////////////////////////////////////// | 
| 1948 | 1975 | 
| 1949 bool SkGpuDevice::onShouldDisableLCD(const SkPaint& paint) const { | 1976 bool SkGpuDevice::onShouldDisableLCD(const SkPaint& paint) const { | 
| 1950     return GrTextContext::ShouldDisableLCD(paint); | 1977     return GrTextContext::ShouldDisableLCD(paint); | 
| 1951 } | 1978 } | 
| 1952 | 1979 | 
| 1953 void SkGpuDevice::flush() { | 1980 void SkGpuDevice::flush() { | 
| 1954     DO_DEFERRED_CLEAR(); | 1981     DO_DEFERRED_CLEAR(); | 
|  | 1982 | 
| 1955     fRenderTarget->prepareForExternalIO(); | 1983     fRenderTarget->prepareForExternalIO(); | 
| 1956 } | 1984 } | 
| 1957 | 1985 | 
| 1958 /////////////////////////////////////////////////////////////////////////////// | 1986 /////////////////////////////////////////////////////////////////////////////// | 
| 1959 | 1987 | 
| 1960 SkBaseDevice* SkGpuDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint
      *) { | 1988 SkBaseDevice* SkGpuDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint
      *) { | 
| 1961     GrSurfaceDesc desc; | 1989     GrSurfaceDesc desc; | 
| 1962     desc.fConfig = fRenderTarget->config(); | 1990     desc.fConfig = fRenderTarget->config(); | 
| 1963     desc.fFlags = kRenderTarget_GrSurfaceFlag; | 1991     desc.fFlags = kRenderTarget_GrSurfaceFlag; | 
| 1964     desc.fWidth = cinfo.fInfo.width(); | 1992     desc.fWidth = cinfo.fInfo.width(); | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 1989     } | 2017     } | 
| 1990 } | 2018 } | 
| 1991 | 2019 | 
| 1992 SkSurface* SkGpuDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps
      & props) { | 2020 SkSurface* SkGpuDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps
      & props) { | 
| 1993     // TODO: Change the signature of newSurface to take a budgeted parameter. | 2021     // TODO: Change the signature of newSurface to take a budgeted parameter. | 
| 1994     static const SkSurface::Budgeted kBudgeted = SkSurface::kNo_Budgeted; | 2022     static const SkSurface::Budgeted kBudgeted = SkSurface::kNo_Budgeted; | 
| 1995     return SkSurface::NewRenderTarget(fContext, kBudgeted, info, fRenderTarget->
      desc().fSampleCnt, | 2023     return SkSurface::NewRenderTarget(fContext, kBudgeted, info, fRenderTarget->
      desc().fSampleCnt, | 
| 1996                                       &props); | 2024                                       &props); | 
| 1997 } | 2025 } | 
| 1998 | 2026 | 
|  | 2027 #define SK_IGNORE_GPU_LAYER_HOISTING 1 | 
|  | 2028 | 
| 1999 bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* mainCanvas, const SkPicture
      * mainPicture, | 2029 bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* mainCanvas, const SkPicture
      * mainPicture, | 
| 2000                                            const SkMatrix* matrix, const SkPaint
      * paint) { | 2030                                            const SkMatrix* matrix, const SkPaint
      * paint) { | 
| 2001 #ifndef SK_IGNORE_GPU_LAYER_HOISTING | 2031 #ifndef SK_IGNORE_GPU_LAYER_HOISTING | 
| 2002     // todo: should handle this natively | 2032     // todo: should handle this natively | 
| 2003     if (paint) { | 2033     if (paint) { | 
| 2004         return false; | 2034         return false; | 
| 2005     } | 2035     } | 
| 2006 | 2036 | 
| 2007     const SkBigPicture::AccelData* data = nullptr; | 2037     const SkBigPicture::AccelData* data = nullptr; | 
| 2008     if (const SkBigPicture* bp = mainPicture->asSkBigPicture()) { | 2038     if (const SkBigPicture* bp = mainPicture->asSkBigPicture()) { | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2070     return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 2100     return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 
| 2071 } | 2101 } | 
| 2072 | 2102 | 
| 2073 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 2103 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 
| 2074     // We always return a transient cache, so it is freed after each | 2104     // We always return a transient cache, so it is freed after each | 
| 2075     // filter traversal. | 2105     // filter traversal. | 
| 2076     return SkGpuDevice::NewImageFilterCache(); | 2106     return SkGpuDevice::NewImageFilterCache(); | 
| 2077 } | 2107 } | 
| 2078 | 2108 | 
| 2079 #endif | 2109 #endif | 
| OLD | NEW | 
|---|