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