| Index: src/core/SkCanvas.cpp
|
| diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
|
| index d7c62e8e1133ad23e5efd7931dda6e6408dc14ed..88339ff4f387c8989a145dc37bb6d48d7b84734d 100644
|
| --- a/src/core/SkCanvas.cpp
|
| +++ b/src/core/SkCanvas.cpp
|
| @@ -16,6 +16,7 @@
|
| #include "SkErrorInternals.h"
|
| #include "SkImage.h"
|
| #include "SkMetaData.h"
|
| +#include "SkNinePatchIter.h"
|
| #include "SkPathOps.h"
|
| #include "SkPatchUtils.h"
|
| #include "SkPicture.h"
|
| @@ -1771,8 +1772,19 @@ void SkCanvas::drawImageRect(const SkImage* image, const SkRect* src, const SkRe
|
| this->onDrawImageRect(image, src, dst, paint);
|
| }
|
|
|
| +void SkCanvas::drawImageNine(const SkImage* image, const SkIRect& center, const SkRect& dst,
|
| + const SkPaint* paint) {
|
| + if (dst.isEmpty()) {
|
| + return;
|
| + }
|
| + if (!SkNinePatchIter::Valid(image->width(), image->height(), center)) {
|
| + this->drawImageRect(image, NULL, dst, paint);
|
| + }
|
| + this->onDrawImageNine(image, center, dst, paint);
|
| +}
|
| +
|
| void SkCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar dx, SkScalar dy, const SkPaint* paint) {
|
| - if (bitmap.empty()) {
|
| + if (bitmap.drawsNothing()) {
|
| return;
|
| }
|
| this->onDrawBitmap(bitmap, dx, dy, paint);
|
| @@ -1780,7 +1792,7 @@ void SkCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar dx, SkScalar dy, cons
|
|
|
| void SkCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
|
| const SkPaint* paint, DrawBitmapRectFlags flags) {
|
| - if (bitmap.empty()) {
|
| + if (bitmap.drawsNothing() || dst.isEmpty()) {
|
| return;
|
| }
|
| this->onDrawBitmapRect(bitmap, src, dst, paint, flags);
|
| @@ -1788,14 +1800,17 @@ void SkCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, c
|
|
|
| void SkCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst,
|
| const SkPaint* paint) {
|
| - if (bitmap.empty()) {
|
| + if (bitmap.drawsNothing() || dst.isEmpty()) {
|
| return;
|
| }
|
| + if (!SkNinePatchIter::Valid(bitmap.width(), bitmap.height(), center)) {
|
| + this->drawBitmapRectToRect(bitmap, NULL, dst, paint);
|
| + }
|
| this->onDrawBitmapNine(bitmap, center, dst, paint);
|
| }
|
|
|
| void SkCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, const SkPaint* paint) {
|
| - if (bitmap.empty()) {
|
| + if (bitmap.drawsNothing()) {
|
| return;
|
| }
|
| this->onDrawSprite(bitmap, left, top, paint);
|
| @@ -2116,15 +2131,13 @@ void SkCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const
|
| this->internalDrawBitmapRect(bitmap, src, dst, paint, flags);
|
| }
|
|
|
| -void SkCanvas::internalDrawBitmapNine(const SkBitmap& bitmap,
|
| - const SkIRect& center, const SkRect& dst,
|
| - const SkPaint* paint) {
|
| - if (bitmap.drawsNothing()) {
|
| - return;
|
| - }
|
| +void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, const SkRect& dst,
|
| + const SkPaint* paint) {
|
| + TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageNine()");
|
| +
|
| + SkRect storage;
|
| + const SkRect* bounds = &dst;
|
| if (NULL == paint || paint->canComputeFastBounds()) {
|
| - SkRect storage;
|
| - const SkRect* bounds = &dst;
|
| if (paint) {
|
| bounds = &paint->computeFastBounds(dst, &storage);
|
| }
|
| @@ -2132,58 +2145,19 @@ void SkCanvas::internalDrawBitmapNine(const SkBitmap& bitmap,
|
| return;
|
| }
|
| }
|
| -
|
| - const int32_t w = bitmap.width();
|
| - const int32_t h = bitmap.height();
|
| -
|
| - SkIRect c = center;
|
| - // pin center to the bounds of the bitmap
|
| - c.fLeft = SkMax32(0, center.fLeft);
|
| - c.fTop = SkMax32(0, center.fTop);
|
| - c.fRight = SkPin32(center.fRight, c.fLeft, w);
|
| - c.fBottom = SkPin32(center.fBottom, c.fTop, h);
|
| -
|
| - const SkScalar srcX[4] = {
|
| - 0, SkIntToScalar(c.fLeft), SkIntToScalar(c.fRight), SkIntToScalar(w)
|
| - };
|
| - const SkScalar srcY[4] = {
|
| - 0, SkIntToScalar(c.fTop), SkIntToScalar(c.fBottom), SkIntToScalar(h)
|
| - };
|
| - SkScalar dstX[4] = {
|
| - dst.fLeft, dst.fLeft + SkIntToScalar(c.fLeft),
|
| - dst.fRight - SkIntToScalar(w - c.fRight), dst.fRight
|
| - };
|
| - SkScalar dstY[4] = {
|
| - dst.fTop, dst.fTop + SkIntToScalar(c.fTop),
|
| - dst.fBottom - SkIntToScalar(h - c.fBottom), dst.fBottom
|
| - };
|
| -
|
| - if (dstX[1] > dstX[2]) {
|
| - dstX[1] = dstX[0] + (dstX[3] - dstX[0]) * c.fLeft / (w - c.width());
|
| - dstX[2] = dstX[1];
|
| - }
|
| -
|
| - if (dstY[1] > dstY[2]) {
|
| - dstY[1] = dstY[0] + (dstY[3] - dstY[0]) * c.fTop / (h - c.height());
|
| - dstY[2] = dstY[1];
|
| +
|
| + SkLazyPaint lazy;
|
| + if (NULL == paint) {
|
| + paint = lazy.init();
|
| }
|
| -
|
| - for (int y = 0; y < 3; y++) {
|
| - SkRect s, d;
|
| -
|
| - s.fTop = srcY[y];
|
| - s.fBottom = srcY[y+1];
|
| - d.fTop = dstY[y];
|
| - d.fBottom = dstY[y+1];
|
| - for (int x = 0; x < 3; x++) {
|
| - s.fLeft = srcX[x];
|
| - s.fRight = srcX[x+1];
|
| - d.fLeft = dstX[x];
|
| - d.fRight = dstX[x+1];
|
| - this->internalDrawBitmapRect(bitmap, &s, d, paint,
|
| - kNone_DrawBitmapRectFlag);
|
| - }
|
| +
|
| + LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds)
|
| +
|
| + while (iter.next()) {
|
| + iter.fDevice->drawImageNine(iter, image, center, dst, looper.paint());
|
| }
|
| +
|
| + LOOPER_END
|
| }
|
|
|
| void SkCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst,
|
| @@ -2191,8 +2165,29 @@ void SkCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, c
|
| TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapNine()");
|
| SkDEBUGCODE(bitmap.validate();)
|
|
|
| - // Need a device entry-point, so gpu can use a mesh
|
| - this->internalDrawBitmapNine(bitmap, center, dst, paint);
|
| + SkRect storage;
|
| + const SkRect* bounds = &dst;
|
| + if (NULL == paint || paint->canComputeFastBounds()) {
|
| + if (paint) {
|
| + bounds = &paint->computeFastBounds(dst, &storage);
|
| + }
|
| + if (this->quickReject(*bounds)) {
|
| + return;
|
| + }
|
| + }
|
| +
|
| + SkLazyPaint lazy;
|
| + if (NULL == paint) {
|
| + paint = lazy.init();
|
| + }
|
| +
|
| + LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds)
|
| +
|
| + while (iter.next()) {
|
| + iter.fDevice->drawBitmapNine(iter, bitmap, center, dst, looper.paint());
|
| + }
|
| +
|
| + LOOPER_END
|
| }
|
|
|
| class SkDeviceFilteredPaint {
|
|
|