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

Unified Diff: src/core/SkDrawLooper.cpp

Issue 155513012: [WIP] Add Context to SkDrawLooper. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: static allocation of DrawContext; update rest of code. Created 6 years, 10 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
Index: src/core/SkDrawLooper.cpp
diff --git a/src/core/SkDrawLooper.cpp b/src/core/SkDrawLooper.cpp
index bac2d969c0505d318fe7881c638c1a4750544fd3..56d76fffc141ac124f4b8bdce1b6a58df7182da5 100644
--- a/src/core/SkDrawLooper.cpp
+++ b/src/core/SkDrawLooper.cpp
@@ -13,31 +13,37 @@
bool SkDrawLooper::canComputeFastBounds(const SkPaint& paint) {
SkCanvas canvas;
+ uint32_t storage[kDrawLooperContextStorageLongCount];
- this->init(&canvas);
+ SkDrawLooper::DrawContext* context =
+ this->init(&canvas, storage, sizeof(storage));
for (;;) {
SkPaint p(paint);
- if (this->next(&canvas, &p)) {
+ if (context->next(&canvas, &p)) {
p.setLooper(NULL);
if (!p.canComputeFastBounds()) {
+ context->cleanup(storage);
return false;
}
} else {
break;
}
}
+ context->cleanup(storage);
return true;
}
void SkDrawLooper::computeFastBounds(const SkPaint& paint, const SkRect& src,
SkRect* dst) {
SkCanvas canvas;
+ uint32_t storage[kDrawLooperContextStorageLongCount];
*dst = src; // catch case where there are no loops
- this->init(&canvas);
+ SkDrawLooper::DrawContext* context = this->init(
+ &canvas, storage, sizeof(storage));
for (bool firstTime = true;; firstTime = false) {
SkPaint p(paint);
- if (this->next(&canvas, &p)) {
+ if (context->next(&canvas, &p)) {
SkRect r(src);
p.setLooper(NULL);
@@ -53,4 +59,13 @@ void SkDrawLooper::computeFastBounds(const SkPaint& paint, const SkRect& src,
break;
}
}
+ context->cleanup(storage);
+}
+
+void SkDrawLooper::DrawContext::cleanup(void* storage) {
+ if ((void*)this == storage) {
+ this->~DrawContext();
+ } else {
+ SkDELETE(this);
+ }
}

Powered by Google App Engine
This is Rietveld 408576698