/* * Copyright 2013 The Android Open Source Project * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkXfermodeImageFilter_DEFINED #define SkXfermodeImageFilter_DEFINED #include "SkImageFilter.h" class SkBitmap; class SkXfermode; class SK_API SkXfermodeImageFilter : public SkImageFilter { /** * This filter takes an xfermode, and uses it to composite the foreground * over the background. If foreground or background is NULL, the input * bitmap (src) is used instead. */ public: static sk_sp Make(sk_sp mode, sk_sp background, sk_sp foreground, const CropRect* cropRect); static sk_sp Make(sk_sp mode, sk_sp background) { return Make(std::move(mode), std::move(background), nullptr, nullptr); } #ifdef SK_SUPPORT_LEGACY_XFERMODE_PTR static SkImageFilter* Create(SkXfermode* mode, SkImageFilter* background, SkImageFilter* foreground = NULL, const CropRect* cropRect = NULL) { return Make(sk_ref_sp(mode), sk_ref_sp(background), sk_ref_sp(foreground), cropRect).release(); } #endif #ifdef SK_SUPPORT_LEGACY_IMAGEFILTER_PTR static sk_sp Make(sk_sp mode, SkImageFilter* background, SkImageFilter* foreground, const CropRect* cropRect) { return Make(std::move(mode), sk_ref_sp(background), sk_ref_sp(foreground), cropRect); } static sk_sp Make(sk_sp mode, SkImageFilter* background) { return Make(std::move(mode), sk_ref_sp(background)); } #endif SK_TO_STRING_OVERRIDE() SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkXfermodeImageFilter) protected: sk_sp onFilterImage(SkSpecialImage* source, const Context&, SkIPoint* offset) const override; #if SK_SUPPORT_GPU sk_sp filterImageGPU(SkSpecialImage* source, sk_sp background, const SkIPoint& backgroundOffset, sk_sp foreground, const SkIPoint& foregroundOffset, const SkIRect& bounds) const; #endif SkXfermodeImageFilter(sk_sp mode, sk_sp inputs[2], const CropRect* cropRect); void flatten(SkWriteBuffer&) const override; private: sk_sp fMode; typedef SkImageFilter INHERITED; }; #endif