blob: 03f0cea4e04b23c17842c4de3a406436bcd2e4be [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
Mike Reed71fecc32016-11-18 17:19:54 -050011#include "SkBlendMode.h"
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000012#include "SkImageFilter.h"
13
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000014class SK_API SkMergeImageFilter : public SkImageFilter {
15public:
robertphillips393aa362016-03-10 04:44:20 -080016 ~SkMergeImageFilter() override;
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000017
robertphillips2238c9d2016-03-30 13:34:16 -070018 static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> first, sk_sp<SkImageFilter> second,
Mike Reed7d954ad2016-10-28 15:42:34 -040019 SkBlendMode, const CropRect* cropRect = nullptr);
20 static sk_sp<SkImageFilter> MakeN(sk_sp<SkImageFilter>[], int count, const SkBlendMode[],
robertphillips225db442016-04-17 14:27:05 -070021 const CropRect* cropRect = nullptr);
Mike Reed7d954ad2016-10-28 15:42:34 -040022
robertphillipsf3f5bad2014-12-19 13:49:15 -080023 SK_TO_STRING_OVERRIDE()
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000024 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter)
25
26protected:
mtklein36352bf2015-03-25 18:17:31 -070027 void flatten(SkWriteBuffer&) const override;
robertphillips2302de92016-03-24 07:26:32 -070028 sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
29 SkIPoint* offset) const override;
Matt Sarett6d72ed92017-04-10 16:35:33 -040030 sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override;
reed96a04f32016-04-25 09:25:15 -070031 bool onCanHandleComplexCTM() const override { return true; }
commit-bot@chromium.orgbd0be252014-05-15 15:40:41 +000032
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000033private:
Mike Reed7d954ad2016-10-28 15:42:34 -040034 SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkBlendMode modes[],
reed5ea95df2015-10-06 14:05:32 -070035 const CropRect* cropRect);
36
Mike Reed71fecc32016-11-18 17:19:54 -050037 uint8_t* fModes; // SkBlendMode
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000038
39 // private storage, to avoid dynamically allocating storage for our copy
40 // of the modes (unless the count is so large we can't fit).
41 intptr_t fStorage[16];
42
43 void initAllocModes();
Mike Reed7d954ad2016-10-28 15:42:34 -040044 void initModes(const SkBlendMode[]);
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000045
46 typedef SkImageFilter INHERITED;
47};
48
49#endif