14a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org/*
24a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org * Copyright 2012 The Android Open Source Project
34a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org *
44a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
54a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org * found in the LICENSE file.
64a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org */
74a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
84a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org#ifndef SkMergeImageFilter_DEFINED
94a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org#define SkMergeImageFilter_DEFINED
104a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
114a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org#include "SkImageFilter.h"
124a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
134a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org#include "SkXfermode.h"
144a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
154a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.orgclass SK_API SkMergeImageFilter : public SkImageFilter {
164a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.orgpublic:
174a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    virtual ~SkMergeImageFilter();
184a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
19cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkMergeImageFilter* Create(SkImageFilter* first, SkImageFilter* second,
20cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                      SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
215e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                      const CropRect* cropRect = NULL,
225e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                      uint32_t uniqueID = 0) {
239ea3d57fde28a5fe4487a111dc3dd49418235e5esenorblanco        SkImageFilter* inputs[2] = { first, second };
249ea3d57fde28a5fe4487a111dc3dd49418235e5esenorblanco        SkXfermode::Mode modes[2] = { mode, mode };
255e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco        return SkNEW_ARGS(SkMergeImageFilter, (inputs, 2, modes, cropRect, uniqueID));
26cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
27cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkMergeImageFilter* Create(SkImageFilter* filters[], int count,
28cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                      const SkXfermode::Mode modes[] = NULL,
295e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                      const CropRect* cropRect = NULL,
305e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                      uint32_t uniqueID = 0) {
315e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco        return SkNEW_ARGS(SkMergeImageFilter, (filters, count, modes, cropRect, uniqueID));
32cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
33cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
344a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter)
354a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
364a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.orgprotected:
37cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    SkMergeImageFilter(SkImageFilter* filters[], int count,
389ea3d57fde28a5fe4487a111dc3dd49418235e5esenorblanco                       const SkXfermode::Mode modes[],
395e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                       const CropRect* cropRect,
405e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                       uint32_t uniqueID);
419fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
42bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit SkMergeImageFilter(SkReadBuffer& buffer);
439fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
44bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
45bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org
46bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
47bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                               SkBitmap* result, SkIPoint* loc) const SK_OVERRIDE;
48bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org
494a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.orgprivate:
504a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    uint8_t*            fModes; // SkXfermode::Mode
514a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
524a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    // private storage, to avoid dynamically allocating storage for our copy
534a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    // of the modes (unless the count is so large we can't fit).
544a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    intptr_t    fStorage[16];
554a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
564a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    void initAllocModes();
574a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    void initModes(const SkXfermode::Mode []);
584a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
594a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org    typedef SkImageFilter INHERITED;
604a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org};
614a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org
624a9a612b5200597cca0bda0a356250835cbdc7d6senorblanco@chromium.org#endif
63