Chromium Code Reviews| Index: src/gpu/SkGpuDevice.cpp |
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
| index dd68a407c9404208640e519d7120d85a785cc6a3..3a883751a641093fce5325c99ebeba924f5c9f11 100644 |
| --- a/src/gpu/SkGpuDevice.cpp |
| +++ b/src/gpu/SkGpuDevice.cpp |
| @@ -1447,8 +1447,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( |
|
msarett
2016/08/18 15:16:08
Another option is to convert the |center| rect to
|
| + 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, |
| @@ -1475,6 +1477,58 @@ 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 |
| + if (as_IB(image)->peekTexture()) { |
| + GrImageTextureAdjuster adjuster(as_IB(image)); |
| + 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 |