Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index 376d5e1b57669789c47d504126db628f06313761..040833b731d22c359289807e4f9374971425430c 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -1409,8 +1409,10 @@ void SkGpuDevice::drawProducerNine(const SkDraw& draw, GrTextureProducer* produc |
return; |
} |
- fDrawContext->drawImageNine(fClip, grPaint, *draw.fMatrix, producer->width(), |
- producer->height(), center, dst); |
+ std::unique_ptr<SkLatticeIter> iter( |
+ new SkLatticeIter(producer->width(), producer->height(), center, dst)); |
+ fDrawContext->drawImageLattice(fClip, grPaint, *draw.fMatrix, producer->width(), |
+ producer->height(), std::move(iter), dst); |
} |
void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image, |
@@ -1440,6 +1442,61 @@ void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, con |
this->drawProducerNine(draw, &maker, center, dst, paint); |
} |
+void SkGpuDevice::drawProducerLattice(const SkDraw& draw, GrTextureProducer* producer, |
+ const SkCanvas::Lattice& lattice, const SkRect& dst, |
+ const SkPaint& paint) { |
+ GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawProducerLattice", fContext); |
+ |
+ CHECK_SHOULD_DRAW(draw); |
+ |
+ static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_FilterMode; |
+ sk_sp<GrFragmentProcessor> fp( |
+ producer->createFragmentProcessor(SkMatrix::I(), |
+ SkRect::MakeIWH(producer->width(), producer->height()), |
+ GrTextureProducer::kNo_FilterConstraint, true, |
+ &kMode, fDrawContext->getColorSpace(), |
+ fDrawContext->sourceGammaTreatment())); |
+ GrPaint grPaint; |
+ if (!SkPaintToGrPaintWithTexture(this->context(), fDrawContext.get(), paint, *draw.fMatrix, |
+ std::move(fp), producer->isAlphaOnly(), &grPaint)) { |
+ return; |
+ } |
+ |
+ std::unique_ptr<SkLatticeIter> iter( |
+ new SkLatticeIter(producer->width(), producer->height(), lattice, dst)); |
+ fDrawContext->drawImageLattice(fClip, grPaint, *draw.fMatrix, producer->width(), |
+ producer->height(), std::move(iter), dst); |
+} |
+ |
+void SkGpuDevice::drawImageLattice(const SkDraw& draw, const SkImage* image, |
+ const SkCanvas::Lattice& lattice, const SkRect& dst, |
+ const SkPaint& paint) { |
+ ASSERT_SINGLE_OWNER |
+ uint32_t pinnedUniqueID; |
+ if (sk_sp<GrTexture> tex = as_IB(image)->refPinnedTexture(&pinnedUniqueID)) { |
+ CHECK_SHOULD_DRAW(draw); |
+ GrTextureAdjuster adjuster(tex.get(), image->alphaType(), image->bounds(), pinnedUniqueID, |
+ as_IB(image)->onImageInfo().colorSpace()); |
+ this->drawProducerLattice(draw, &adjuster, lattice, dst, paint); |
+ } else { |
+ SkBitmap bm; |
+ if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) { |
+ GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_CachingHint); |
+ this->drawProducerLattice(draw, &maker, lattice, dst, paint); |
+ } else if (as_IB(image)->getROPixels(&bm)) { |
+ this->drawBitmapLattice(draw, bm, lattice, dst, paint); |
+ } |
+ } |
+} |
+ |
+void SkGpuDevice::drawBitmapLattice(const SkDraw& draw, const SkBitmap& bitmap, |
+ const SkCanvas::Lattice& lattice, const SkRect& dst, |
+ const SkPaint& paint) { |
+ ASSERT_SINGLE_OWNER |
+ GrBitmapTextureMaker maker(fContext, bitmap); |
+ this->drawProducerLattice(draw, &maker, lattice, dst, paint); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
// must be in SkCanvas::VertexMode order |