OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 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 #ifndef SkMergeImageFilter_DEFINED | 8 #ifndef SkMergeImageFilter_DEFINED |
9 #define SkMergeImageFilter_DEFINED | 9 #define SkMergeImageFilter_DEFINED |
10 | 10 |
11 #include "SkImageFilter.h" | 11 #include "SkImageFilter.h" |
12 | 12 |
13 #include "SkXfermode.h" | 13 #include "SkXfermode.h" |
14 | 14 |
15 class SK_API SkMergeImageFilter : public SkImageFilter { | 15 class SK_API SkMergeImageFilter : public SkImageFilter { |
16 public: | 16 public: |
17 ~SkMergeImageFilter() override; | 17 ~SkMergeImageFilter() override; |
18 | 18 |
19 static SkImageFilter* Create(SkImageFilter* first, SkImageFilter* second, | 19 static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> first, sk_sp<SkImageFi
lter> second, |
20 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mo
de, | 20 SkXfermode::Mode mode = SkXfermode::kSrcOve
r_Mode, |
21 const CropRect* cropRect = NULL) { | 21 const CropRect* cropRect = nullptr) { |
22 SkImageFilter* inputs[2] = { first, second }; | 22 sk_sp<SkImageFilter> inputs[2] = { first, second }; |
23 SkXfermode::Mode modes[2] = { mode, mode }; | 23 SkXfermode::Mode modes[2] = { mode, mode }; |
24 return new SkMergeImageFilter(inputs, 2, modes, cropRect); | 24 return sk_sp<SkImageFilter>(new SkMergeImageFilter(inputs, 2, modes, cro
pRect)); |
25 } | 25 } |
26 | 26 |
27 static SkImageFilter* Create(SkImageFilter* filters[], int count, | 27 static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> filters[], |
28 const SkXfermode::Mode modes[] = NULL, | 28 int count, |
29 const CropRect* cropRect = NULL) { | 29 const SkXfermode::Mode modes[] = nullptr, |
30 return new SkMergeImageFilter(filters, count, modes, cropRect); | 30 const CropRect* cropRect = nullptr) { |
| 31 return sk_sp<SkImageFilter>(new SkMergeImageFilter(filters, count, modes
, cropRect)); |
31 } | 32 } |
32 | 33 |
33 SK_TO_STRING_OVERRIDE() | 34 SK_TO_STRING_OVERRIDE() |
34 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter) | 35 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter) |
35 | 36 |
| 37 #ifdef SK_SUPPORT_LEGACY_IMAGEFILTER_PTR |
| 38 static SkImageFilter* Create(SkImageFilter* first, SkImageFilter* second, |
| 39 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mo
de, |
| 40 const CropRect* cropRect = nullptr) { |
| 41 return Make(sk_ref_sp<SkImageFilter>(first), |
| 42 sk_ref_sp<SkImageFilter>(second), |
| 43 mode, cropRect).release(); |
| 44 } |
| 45 |
| 46 static SkImageFilter* Create(SkImageFilter* filters[], int count, |
| 47 const SkXfermode::Mode modes[] = nullptr, |
| 48 const CropRect* cropRect = nullptr) { |
| 49 SkAutoTDeleteArray<sk_sp<SkImageFilter>> temp(new sk_sp<SkImageFilter>[c
ount]); |
| 50 for (int i = 0; i < count; ++i) { |
| 51 temp[i] = sk_ref_sp<SkImageFilter>(filters[i]); |
| 52 } |
| 53 return Make(temp.get(), count, modes, cropRect).release(); |
| 54 } |
| 55 #endif |
| 56 |
36 protected: | 57 protected: |
37 void flatten(SkWriteBuffer&) const override; | 58 void flatten(SkWriteBuffer&) const override; |
38 sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&, | 59 sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&, |
39 SkIPoint* offset) const override; | 60 SkIPoint* offset) const override; |
40 | 61 |
41 private: | 62 private: |
42 SkMergeImageFilter(SkImageFilter* filters[], int count, const SkXfermode::Mo
de modes[], | 63 SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkXfermo
de::Mode modes[], |
43 const CropRect* cropRect); | 64 const CropRect* cropRect); |
44 | 65 |
45 uint8_t* fModes; // SkXfermode::Mode | 66 uint8_t* fModes; // SkXfermode::Mode |
46 | 67 |
47 // private storage, to avoid dynamically allocating storage for our copy | 68 // private storage, to avoid dynamically allocating storage for our copy |
48 // of the modes (unless the count is so large we can't fit). | 69 // of the modes (unless the count is so large we can't fit). |
49 intptr_t fStorage[16]; | 70 intptr_t fStorage[16]; |
50 | 71 |
51 void initAllocModes(); | 72 void initAllocModes(); |
52 void initModes(const SkXfermode::Mode []); | 73 void initModes(const SkXfermode::Mode []); |
53 | 74 |
54 typedef SkImageFilter INHERITED; | 75 typedef SkImageFilter INHERITED; |
55 }; | 76 }; |
56 | 77 |
57 #endif | 78 #endif |
OLD | NEW |