Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef SkAvoidXfermode_DEFINED
     18 #define SkAvoidXfermode_DEFINED
     19 
     20 #include "SkXfermode.h"
     21 
     22 /** \class SkAvoidXfermode
     23 
     24     This xfermode will draw the src everywhere except on top of the specified
     25     color.
     26 */
     27 class SkAvoidXfermode : public SkXfermode {
     28 public:
     29     enum Mode {
     30         kAvoidColor_Mode,   //!< draw everywhere except on the opColor
     31         kTargetColor_Mode   //!< draw only on top of the opColor
     32     };
     33 
     34     /** This xfermode draws, or doesn't draw, based on the destination's
     35         distance from an op-color.
     36 
     37         There are two modes, and each mode interprets a tolerance value.
     38 
     39         Avoid: In this mode, drawing is allowed only on destination pixels that
     40                are different from the op-color.
     41                Tolerance near 0: avoid any colors even remotely similar to the op-color
     42                Tolerance near 255: avoid only colors nearly identical to the op-color
     43 
     44         Target: In this mode, drawing only occurs on destination pixels that
     45                 are similar to the op-color
     46                 Tolerance near 0: draw only on colors that are nearly identical to the op-color
     47                 Tolerance near 255: draw on any colors even remotely similar to the op-color
     48      */
     49     SkAvoidXfermode(SkColor opColor, U8CPU tolerance, Mode mode);
     50 
     51     // overrides from SkXfermode
     52     virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
     53                         const SkAlpha aa[]);
     54     virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
     55                         const SkAlpha aa[]);
     56     virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
     57                           const SkAlpha aa[]);
     58     virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
     59                         const SkAlpha aa[]);
     60 
     61     // overrides from SkFlattenable
     62     virtual Factory getFactory();
     63     virtual void flatten(SkFlattenableWriteBuffer&);
     64 
     65     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
     66         return SkNEW_ARGS(SkAvoidXfermode, (buffer));
     67     }
     68 
     69 protected:
     70     SkAvoidXfermode(SkFlattenableReadBuffer&);
     71 
     72 private:
     73     SkColor     fOpColor;
     74     uint32_t    fDistMul;   // x.14
     75     Mode        fMode;
     76 
     77     static SkFlattenable* Create(SkFlattenableReadBuffer&);
     78 
     79     typedef SkXfermode INHERITED;
     80 };
     81 
     82 #endif
     83