OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2013 The Android Open Source Project | 2 * Copyright 2013 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkXfermodeImageFilter.h" | 8 #include "SkXfermodeImageFilter.h" |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkDevice.h" | |
10 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
11 #include "SkFlattenableBuffers.h" | 12 #include "SkFlattenableBuffers.h" |
12 #include "SkXfermode.h" | 13 #include "SkXfermode.h" |
13 #if SK_SUPPORT_GPU | 14 #if SK_SUPPORT_GPU |
14 #include "GrContext.h" | 15 #include "GrContext.h" |
15 #include "effects/GrSimpleTextureEffect.h" | 16 #include "effects/GrSimpleTextureEffect.h" |
16 #include "SkGr.h" | 17 #include "SkGr.h" |
17 #include "SkImageFilterUtils.h" | 18 #include "SkImageFilterUtils.h" |
18 #endif | 19 #endif |
19 | 20 |
20 /////////////////////////////////////////////////////////////////////////////// | 21 /////////////////////////////////////////////////////////////////////////////// |
21 | 22 |
22 SkXfermodeImageFilter::SkXfermodeImageFilter(SkXfermode* mode, | 23 SkXfermodeImageFilter::SkXfermodeImageFilter(SkXfermode* mode, |
23 SkImageFilter* background, | 24 SkImageFilter* background, |
24 SkImageFilter* foreground) | 25 SkImageFilter* foreground, |
25 : INHERITED(background, foreground), fMode(mode) { | 26 const SkIRect* cropRect) |
27 : INHERITED(background, foreground, cropRect), fMode(mode) { | |
26 SkSafeRef(fMode); | 28 SkSafeRef(fMode); |
27 } | 29 } |
28 | 30 |
29 SkXfermodeImageFilter::~SkXfermodeImageFilter() { | 31 SkXfermodeImageFilter::~SkXfermodeImageFilter() { |
30 SkSafeUnref(fMode); | 32 SkSafeUnref(fMode); |
31 } | 33 } |
32 | 34 |
33 SkXfermodeImageFilter::SkXfermodeImageFilter(SkFlattenableReadBuffer& buffer) | 35 SkXfermodeImageFilter::SkXfermodeImageFilter(SkFlattenableReadBuffer& buffer) |
34 : INHERITED(buffer) { | 36 : INHERITED(buffer) { |
35 fMode = buffer.readFlattenableT<SkXfermode>(); | 37 fMode = buffer.readFlattenableT<SkXfermode>(); |
(...skipping 15 matching lines...) Expand all Loading... | |
51 SkIPoint backgroundOffset = SkIPoint::Make(0, 0); | 53 SkIPoint backgroundOffset = SkIPoint::Make(0, 0); |
52 if (backgroundInput && | 54 if (backgroundInput && |
53 !backgroundInput->filterImage(proxy, src, ctm, &background, &backgroundO ffset)) { | 55 !backgroundInput->filterImage(proxy, src, ctm, &background, &backgroundO ffset)) { |
54 return false; | 56 return false; |
55 } | 57 } |
56 SkIPoint foregroundOffset = SkIPoint::Make(0, 0); | 58 SkIPoint foregroundOffset = SkIPoint::Make(0, 0); |
57 if (foregroundInput && | 59 if (foregroundInput && |
58 !foregroundInput->filterImage(proxy, src, ctm, &foreground, &foregroundO ffset)) { | 60 !foregroundInput->filterImage(proxy, src, ctm, &foreground, &foregroundO ffset)) { |
59 return false; | 61 return false; |
60 } | 62 } |
61 dst->setConfig(background.config(), background.width(), background.height()) ; | 63 |
62 dst->allocPixels(); | 64 if (cropRect().isLargest()) { |
Stephen White
2013/09/24 23:14:13
I think the code you've added below should work fo
sugoi1
2013/09/25 15:41:08
Done.
| |
63 SkCanvas canvas(*dst); | 65 dst->setConfig(background.config(), background.width(), background.heigh t()); |
64 SkPaint paint; | 66 dst->allocPixels(); |
65 paint.setXfermodeMode(SkXfermode::kSrc_Mode); | 67 SkCanvas canvas(*dst); |
66 canvas.drawBitmap(background, 0, 0, &paint); | 68 SkPaint paint; |
67 paint.setXfermode(fMode); | 69 paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
68 canvas.drawBitmap(foreground, | 70 canvas.drawBitmap(background, 0, 0, &paint); |
69 SkIntToScalar(foregroundOffset.fX - backgroundOffset.fX), | 71 paint.setXfermode(fMode); |
70 SkIntToScalar(foregroundOffset.fY - backgroundOffset.fY), | 72 canvas.drawBitmap(foreground, |
71 &paint); | 73 SkIntToScalar(foregroundOffset.fX - backgroundOffset.f X), |
72 offset->fX += backgroundOffset.fX; | 74 SkIntToScalar(foregroundOffset.fY - backgroundOffset.f Y), |
73 offset->fY += backgroundOffset.fY; | 75 &paint); |
76 offset->fX += backgroundOffset.fX; | |
77 offset->fY += backgroundOffset.fY; | |
78 } else { | |
79 SkIRect bounds; | |
80 background.getBounds(&bounds); | |
81 if (!applyCropRect(&bounds, ctm)) { | |
82 return false; | |
83 } | |
84 backgroundOffset.fX -= bounds.left(); | |
85 backgroundOffset.fY -= bounds.top(); | |
86 foregroundOffset.fX -= bounds.left(); | |
87 foregroundOffset.fY -= bounds.top(); | |
88 | |
89 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bo unds.height())); | |
90 SkCanvas canvas(device); | |
91 SkPaint paint; | |
92 paint.setXfermodeMode(SkXfermode::kSrc_Mode); | |
93 canvas.drawBitmap(background, SkIntToScalar(backgroundOffset.fX), | |
94 SkIntToScalar(backgroundOffset.fY), &paint); | |
95 paint.setXfermode(fMode); | |
96 canvas.drawBitmap(foreground, SkIntToScalar(foregroundOffset.fX), | |
97 SkIntToScalar(foregroundOffset.fY), &paint); | |
98 *dst = device->accessBitmap(false); | |
99 offset->fX += bounds.left(); | |
100 offset->fY += bounds.top(); | |
101 } | |
74 return true; | 102 return true; |
75 } | 103 } |
76 | 104 |
77 #if SK_SUPPORT_GPU | 105 #if SK_SUPPORT_GPU |
78 | 106 |
79 bool SkXfermodeImageFilter::filterImageGPU(Proxy* proxy, | 107 bool SkXfermodeImageFilter::filterImageGPU(Proxy* proxy, |
80 const SkBitmap& src, | 108 const SkBitmap& src, |
81 const SkMatrix& ctm, | 109 const SkMatrix& ctm, |
82 SkBitmap* result, | 110 SkBitmap* result, |
83 SkIPoint* offset) { | 111 SkIPoint* offset) { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
137 foregroundPaint.setBlendFunc(sk_blend_to_grblend(sm), sk_blend_to_grblen d(dm)); | 165 foregroundPaint.setBlendFunc(sk_blend_to_grblend(sm), sk_blend_to_grblen d(dm)); |
138 foregroundPaint.addColorTextureEffect(foregroundTex, foregroundMatrix); | 166 foregroundPaint.addColorTextureEffect(foregroundTex, foregroundMatrix); |
139 context->drawRect(foregroundPaint, srcRect); | 167 context->drawRect(foregroundPaint, srcRect); |
140 } | 168 } |
141 offset->fX += backgroundOffset.fX; | 169 offset->fX += backgroundOffset.fX; |
142 offset->fY += backgroundOffset.fY; | 170 offset->fY += backgroundOffset.fY; |
143 return SkImageFilterUtils::WrapTexture(dst, src.width(), src.height(), resul t); | 171 return SkImageFilterUtils::WrapTexture(dst, src.width(), src.height(), resul t); |
144 } | 172 } |
145 | 173 |
146 #endif | 174 #endif |
OLD | NEW |