Home | History | Annotate | Download | only in effects
      1 /*
      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 
     15 class SK_API SkMergeImageFilter : public SkImageFilter {
     16 public:
     17     virtual ~SkMergeImageFilter();
     18 
     19     static SkMergeImageFilter* Create(SkImageFilter* first, SkImageFilter* second,
     20                                       SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
     21                                       const CropRect* cropRect = NULL) {
     22         return SkNEW_ARGS(SkMergeImageFilter, (first, second, mode, cropRect));
     23     }
     24     static SkMergeImageFilter* Create(SkImageFilter* filters[], int count,
     25                                       const SkXfermode::Mode modes[] = NULL,
     26                                       const CropRect* cropRect = NULL) {
     27         return SkNEW_ARGS(SkMergeImageFilter, (filters, count, modes, cropRect));
     28     }
     29 
     30     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter)
     31 
     32 protected:
     33     SkMergeImageFilter(SkImageFilter* first, SkImageFilter* second,
     34                        SkXfermode::Mode = SkXfermode::kSrcOver_Mode,
     35                        const CropRect* cropRect = NULL);
     36     SkMergeImageFilter(SkImageFilter* filters[], int count,
     37                        const SkXfermode::Mode modes[] = NULL,
     38                        const CropRect* cropRect = NULL);
     39     explicit SkMergeImageFilter(SkReadBuffer& buffer);
     40     virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
     41 
     42     virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
     43                                SkBitmap* result, SkIPoint* loc) const SK_OVERRIDE;
     44 
     45 private:
     46     uint8_t*            fModes; // SkXfermode::Mode
     47 
     48     // private storage, to avoid dynamically allocating storage for our copy
     49     // of the modes (unless the count is so large we can't fit).
     50     intptr_t    fStorage[16];
     51 
     52     void initAllocModes();
     53     void initModes(const SkXfermode::Mode []);
     54 
     55     typedef SkImageFilter INHERITED;
     56 };
     57 
     58 #endif
     59