Index: src/effects/SkCompositeImageFilter.cpp |
diff --git a/src/effects/SkCompositeImageFilter.cpp b/src/effects/SkCompositeImageFilter.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..745b807de8c02bd955c7d0287b5542d5e6a8e40f |
--- /dev/null |
+++ b/src/effects/SkCompositeImageFilter.cpp |
@@ -0,0 +1,66 @@ |
+/* |
+ * Copyright 2013 The Android Open Source Project |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkCompositeImageFilter.h" |
+#include "SkBitmap.h" |
+#include "SkCanvas.h" |
+#include "SkDevice.h" |
+#include "SkFlattenableBuffers.h" |
+#include "SkMatrix.h" |
+#include "SkPaint.h" |
+ |
+SkCompositeImageFilter::SkCompositeImageFilter(SkFlattenableReadBuffer& buffer) : |
+ INHERITED(buffer) { |
+ fMode = (SkXfermode::Mode) buffer.readInt(); |
+} |
+ |
+bool SkCompositeImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm, |
+ SkBitmap* dst, SkIPoint* offset) { |
+ SkBitmap background = src; |
+ SkBitmap foreground = src; |
+ SkImageFilter* backgroundInput = getInput(0); |
+ SkImageFilter* foregroundInput = getInput(1); |
+ SkIPoint backgroundOffset = SkIPoint::Make(0, 0), foregroundOffset = SkIPoint::Make(0, 0); |
+ if (backgroundInput && |
+ !backgroundInput->filterImage(proxy, src, ctm, &background, &backgroundOffset)) { |
+ return false; |
+ } |
+ |
+ if (foregroundInput && |
+ !foregroundInput->filterImage(proxy, src, ctm, &foreground, &foregroundOffset)) { |
+ return false; |
+ } |
+ |
+ SkIRect bounds; |
+ background.getBounds(&bounds); |
+ if (!applyCropRect(&bounds, ctm)) { |
+ return false; |
+ } |
+ backgroundOffset.fX -= bounds.left(); |
+ backgroundOffset.fY -= bounds.top(); |
+ foregroundOffset.fX -= bounds.left(); |
+ foregroundOffset.fY -= bounds.top(); |
+ |
+ SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height())); |
+ SkCanvas canvas(device); |
+ SkPaint paint; |
+ paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
+ canvas.drawBitmap(background, SkIntToScalar(backgroundOffset.fX), |
+ SkIntToScalar(backgroundOffset.fY), &paint); |
+ paint.setXfermodeMode(fMode); |
+ canvas.drawBitmap(foreground, SkIntToScalar(foregroundOffset.fX), |
+ SkIntToScalar(foregroundOffset.fY), &paint); |
+ *dst = device->accessBitmap(false); |
+ offset->fX += bounds.left(); |
+ offset->fY += bounds.top(); |
+ return true; |
+} |
+ |
+void SkCompositeImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
+ this->INHERITED::flatten(buffer); |
+ buffer.writeInt((int) fMode); |
+} |