diff options
author | bsalomon <bsalomon@google.com> | 2015-12-09 12:50:56 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-09 12:50:56 -0800 |
commit | 2bbd0c61618405854e27f545cd501ebab93842a1 (patch) | |
tree | b4e5fb1bb0faa8311b2d6e0a978fc180e17b6bf2 /src/gpu | |
parent | 632199ec6e2b99beb87a2cb52969f00e61e5a138 (diff) |
Rewrite drawBitmap/ImageNine on top of GrTextureProducer
Review URL: https://codereview.chromium.org/1504723004
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 93 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.h | 3 |
2 files changed, 50 insertions, 46 deletions
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 52f730a017..9527870a89 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1472,30 +1472,9 @@ void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const } } -static bool wrap_as_bm(GrContext* ctx, const SkImage* image, SkBitmap* bm) { - // TODO: It is wrong to assume these texture params here. - SkAutoTUnref<GrTexture> tex(as_IB(image)->asTextureRef(ctx, GrTextureParams::ClampNoFilter())); - if (tex) { - GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpaque(), bm); - return true; - } else { - return as_IB(image)->getROPixels(bm); - } -} - -void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image, - const SkIRect& center, const SkRect& dst, const SkPaint& paint) { - // TODO write native implementation - SkBitmap bitmap; - if (!wrap_as_bm(this->context(), image, &bitmap)) { - return; - } - return this->drawBitmapNine(draw, bitmap, center, dst, paint); -} - -void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, const SkIRect& center, - const SkRect& dst, const SkPaint& paint) { - GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawBitmapNine", fContext); +void SkGpuDevice::drawProducerNine(const SkDraw& draw, GrTextureProducer* producer, bool alphaOnly, + const SkIRect& center, const SkRect& dst, const SkPaint& paint) { + GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawProducerNine", fContext); CHECK_FOR_ANNOTATION(paint); CHECK_SHOULD_DRAW(draw); @@ -1504,42 +1483,64 @@ void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, con fRenderTarget->isUnifiedMultisampled(); bool doBicubic; GrTextureParams::FilterMode textureFilterMode = - GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), *draw.fMatrix, SkMatrix::I(), - &doBicubic); - - // TODO handle bilerp(vie texture domains), MSAA(via snapping) + GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), *draw.fMatrix, SkMatrix::I(), + &doBicubic); if (useFallback || doBicubic || GrTextureParams::kNone_FilterMode != textureFilterMode) { - SkNinePatchIter iter(bitmap.width(), bitmap.height(), center, dst); + SkNinePatchIter iter(producer->width(), producer->height(), center, dst); SkRect srcR, dstR; while (iter.next(&srcR, &dstR)) { - this->drawBitmapRect(draw, bitmap, &srcR, dstR, paint, - SkCanvas::kStrict_SrcRectConstraint); + this->drawTextureProducer(producer, alphaOnly, &srcR, &dstR, + SkCanvas::kStrict_SrcRectConstraint, *draw.fMatrix, fClip, + paint); } return; } - GrTextureParams params = GrTextureParams::ClampNoFilter(); - - SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(this->context(), bitmap, params)); - if (nullptr == texture) { + static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_FilterMode; + SkAutoTUnref<const GrFragmentProcessor> fp( + producer->createFragmentProcessor(SkMatrix::I(), + SkRect::MakeIWH(producer->width(), producer->height()), + GrTextureProducer::kNo_FilterConstraint, true, + &kMode)); + GrPaint grPaint; + if (!SkPaintToGrPaintWithTexture(this->context(), paint, *draw.fMatrix, fp, + alphaOnly, &grPaint)) { return; } - SkMatrix texMatrix; - texMatrix.setIDiv(texture->width(), texture->height()); - - SkAutoTUnref<const GrFragmentProcessor> fp(GrSimpleTextureEffect::Create(texture, texMatrix, - params)); + fDrawContext->drawImageNine(fClip, grPaint, *draw.fMatrix, producer->width(), + producer->height(), center, dst); +} - GrPaint grPaint; - if (!SkPaintToGrPaintWithTexture(this->context(), paint, *draw.fMatrix, fp, - kAlpha_8_SkColorType == bitmap.colorType(), &grPaint)) { - return; +void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image, + const SkIRect& center, const SkRect& dst, const SkPaint& paint) { + if (GrTexture* tex = as_IB(image)->peekTexture()) { + bool alphaOnly = GrPixelConfigIsAlphaOnly(tex->config()); + GrImageTextureAdjuster adjuster(as_IB(image)); + this->drawProducerNine(draw, &adjuster, alphaOnly, center, dst, paint); + } else { + SkBitmap bm; + if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) { + GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_CachingHint); + bool alphaOnly = kAlpha_8_SkColorType == cacher->info().colorType(); + this->drawProducerNine(draw, &maker, alphaOnly, center, dst, paint); + } else if (as_IB(image)->getROPixels(&bm)) { + this->drawBitmapNine(draw, bm, center, dst, paint); + } } +} - fDrawContext->drawImageNine(fClip, grPaint, *draw.fMatrix, bitmap.width(), bitmap.height(), - center, dst); +void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, const SkIRect& center, + const SkRect& dst, const SkPaint& paint) { + bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); + if (bitmap.getTexture()) { + GrBitmapTextureAdjuster adjuster(&bitmap); + this->drawProducerNine(draw, &adjuster, alphaOnly, center, dst, paint); + } else { + GrBitmapTextureMaker maker(fContext, bitmap); + this->drawProducerNine(draw, &maker, alphaOnly, center, dst, paint); + } } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h index 219b76573b..ec5bc9e201 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -249,6 +249,9 @@ private: const GrClip&, const SkPaint&); + void drawProducerNine(const SkDraw&, GrTextureProducer*, bool alphaOnly, + const SkIRect& center, const SkRect& dst, const SkPaint&); + bool drawDashLine(const SkPoint pts[2], const SkPaint& paint); static GrRenderTarget* CreateRenderTarget(GrContext*, SkSurface::Budgeted, const SkImageInfo&, |