OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2013 The Android Open Source Project |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. |
| 6 */ |
| 7 |
| 8 #include "SkCompositeImageFilter.h" |
| 9 #include "SkBitmap.h" |
| 10 #include "SkCanvas.h" |
| 11 #include "SkDevice.h" |
| 12 #include "SkFlattenableBuffers.h" |
| 13 #include "SkMatrix.h" |
| 14 #include "SkPaint.h" |
| 15 |
| 16 SkCompositeImageFilter::SkCompositeImageFilter(SkFlattenableReadBuffer& buffer)
: |
| 17 INHERITED(buffer) { |
| 18 fMode = (SkXfermode::Mode) buffer.readInt(); |
| 19 } |
| 20 |
| 21 bool SkCompositeImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, co
nst SkMatrix& ctm, |
| 22 SkBitmap* dst, SkIPoint* offset) { |
| 23 SkBitmap background = src; |
| 24 SkBitmap foreground = src; |
| 25 SkImageFilter* backgroundInput = getInput(0); |
| 26 SkImageFilter* foregroundInput = getInput(1); |
| 27 SkIPoint backgroundOffset = SkIPoint::Make(0, 0), foregroundOffset = SkIPoin
t::Make(0, 0); |
| 28 if (backgroundInput && |
| 29 !backgroundInput->filterImage(proxy, src, ctm, &background, &backgroundO
ffset)) { |
| 30 return false; |
| 31 } |
| 32 |
| 33 if (foregroundInput && |
| 34 !foregroundInput->filterImage(proxy, src, ctm, &foreground, &foregroundO
ffset)) { |
| 35 return false; |
| 36 } |
| 37 |
| 38 SkIRect bounds; |
| 39 background.getBounds(&bounds); |
| 40 if (!applyCropRect(&bounds, ctm)) { |
| 41 return false; |
| 42 } |
| 43 backgroundOffset.fX -= bounds.left(); |
| 44 backgroundOffset.fY -= bounds.top(); |
| 45 foregroundOffset.fX -= bounds.left(); |
| 46 foregroundOffset.fY -= bounds.top(); |
| 47 |
| 48 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds
.height())); |
| 49 SkCanvas canvas(device); |
| 50 SkPaint paint; |
| 51 paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| 52 canvas.drawBitmap(background, SkIntToScalar(backgroundOffset.fX), |
| 53 SkIntToScalar(backgroundOffset.fY), &paint); |
| 54 paint.setXfermodeMode(fMode); |
| 55 canvas.drawBitmap(foreground, SkIntToScalar(foregroundOffset.fX), |
| 56 SkIntToScalar(foregroundOffset.fY), &paint); |
| 57 *dst = device->accessBitmap(false); |
| 58 offset->fX += bounds.left(); |
| 59 offset->fY += bounds.top(); |
| 60 return true; |
| 61 } |
| 62 |
| 63 void SkCompositeImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
| 64 this->INHERITED::flatten(buffer); |
| 65 buffer.writeInt((int) fMode); |
| 66 } |
OLD | NEW |