Index: src/core/SkDrawLooper.cpp |
diff --git a/src/core/SkDrawLooper.cpp b/src/core/SkDrawLooper.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..79a3f015f10139cb2611be80e0c3d3e66d33fbf4 |
--- /dev/null |
+++ b/src/core/SkDrawLooper.cpp |
@@ -0,0 +1,57 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkDrawLooper.h" |
+#include "SkCanvas.h" |
+#include "SkMatrix.h" |
+#include "SkPaint.h" |
+#include "SkRect.h" |
+ |
+SK_DEFINE_INST_COUNT(SkDrawLooper) |
+ |
+bool SkDrawLooper::canComputeFastBounds(const SkPaint& paint) { |
+ SkCanvas canvas; |
+ |
+ this->init(&canvas); |
+ for (;;) { |
+ SkPaint p(paint); |
+ if (this->next(&canvas, &p)) { |
+ p.setLooper(NULL); |
+ if (!p.canComputeFastBounds()) { |
+ return false; |
+ } |
+ } else { |
+ break; |
+ } |
+ } |
+ return true; |
+} |
+ |
+void SkDrawLooper::computeFastBounds(const SkPaint& paint, const SkRect& src, |
+ SkRect* dst) { |
+ SkCanvas canvas; |
+ |
+ this->init(&canvas); |
+ for (bool firstTime = true;; firstTime = false) { |
+ SkPaint p(paint); |
+ if (this->next(&canvas, &p)) { |
+ SkRect r(src); |
+ |
+ p.setLooper(NULL); |
+ p.computeFastBounds(r, &r); |
+ canvas.getTotalMatrix().mapRect(&r); |
+ |
+ if (firstTime) { |
+ *dst = r; |
+ } else { |
+ dst->join(r); |
+ } |
+ } else { |
+ break; |
+ } |
+ } |
+} |