blob: e85cc1f97fd45a8aadd134b28f0b482a1ff9a56a [file] [log] [blame]
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +00001/*
2 * Copyright 2012 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#ifndef SkMergeImageFilter_DEFINED
9#define SkMergeImageFilter_DEFINED
10
11#include "SkImageFilter.h"
12
13#include "SkXfermode.h"
14
15class SK_API SkMergeImageFilter : public SkImageFilter {
16public:
robertphillips393aa362016-03-10 04:44:20 -080017 ~SkMergeImageFilter() override;
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000018
robertphillips2238c9d2016-03-30 13:34:16 -070019 static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> first, sk_sp<SkImageFilter> second,
20 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
21 const CropRect* cropRect = nullptr) {
22 sk_sp<SkImageFilter> inputs[2] = { first, second };
senorblanco9ea3d572014-07-08 09:16:22 -070023 SkXfermode::Mode modes[2] = { mode, mode };
robertphillips2238c9d2016-03-30 13:34:16 -070024 return sk_sp<SkImageFilter>(new SkMergeImageFilter(inputs, 2, modes, cropRect));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000025 }
reed5ea95df2015-10-06 14:05:32 -070026
robertphillips2238c9d2016-03-30 13:34:16 -070027 static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> filters[],
28 int count,
29 const SkXfermode::Mode modes[] = nullptr,
30 const CropRect* cropRect = nullptr) {
31 return sk_sp<SkImageFilter>(new SkMergeImageFilter(filters, count, modes, cropRect));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000032 }
33
robertphillipsf3f5bad2014-12-19 13:49:15 -080034 SK_TO_STRING_OVERRIDE()
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000035 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter)
36
robertphillips2238c9d2016-03-30 13:34:16 -070037#ifdef SK_SUPPORT_LEGACY_IMAGEFILTER_PTR
38 static SkImageFilter* Create(SkImageFilter* first, SkImageFilter* second,
39 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
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>[count]);
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
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000057protected:
mtklein36352bf2015-03-25 18:17:31 -070058 void flatten(SkWriteBuffer&) const override;
robertphillips2302de92016-03-24 07:26:32 -070059 sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
60 SkIPoint* offset) const override;
commit-bot@chromium.orgbd0be252014-05-15 15:40:41 +000061
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000062private:
robertphillips2238c9d2016-03-30 13:34:16 -070063 SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkXfermode::Mode modes[],
reed5ea95df2015-10-06 14:05:32 -070064 const CropRect* cropRect);
65
66 uint8_t* fModes; // SkXfermode::Mode
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000067
68 // private storage, to avoid dynamically allocating storage for our copy
69 // of the modes (unless the count is so large we can't fit).
70 intptr_t fStorage[16];
71
72 void initAllocModes();
73 void initModes(const SkXfermode::Mode []);
74
75 typedef SkImageFilter INHERITED;
76};
77
78#endif