Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Unified Diff: src/core/SkCanvas.cpp

Issue 1211583003: add drawImageNine (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: address comments from #9 Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/utils/SkDeferredCanvas.h ('k') | src/core/SkDevice.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
« no previous file with comments | « include/utils/SkDeferredCanvas.h ('k') | src/core/SkDevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698