• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 will draw the src everywhere except on top of the opColor
35         or, depending on the Mode, draw only on top of the opColor.
36         @param opColor  the color to avoid (or to target depending on Mode).
37                         note: the alpha in opColor is ignored
38         @param tolerance    How closely we compare a pixel to the opColor.
39                             0 - only operate if exact match
40                             255 - maximum gradation (blending) based on how
41                             similar the pixel is to our opColor (max tolerance)
42         @param mode If we should avoid or target the opColor
43     */
44     SkAvoidXfermode(SkColor opColor, U8CPU tolerance, Mode mode);
45 
46     // overrides from SkXfermode
47     virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
48                         const SkAlpha aa[]);
49     virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
50                         const SkAlpha aa[]);
51     virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
52                           const SkAlpha aa[]);
53     virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
54                         const SkAlpha aa[]);
55 
56     // overrides from SkFlattenable
57     virtual Factory getFactory();
58     virtual void flatten(SkFlattenableWriteBuffer&);
59 
60 protected:
61     SkAvoidXfermode(SkFlattenableReadBuffer&);
62 
63 private:
64     SkColor     fOpColor;
65     uint32_t    fDistMul;   // x.14
66     Mode        fMode;
67 
68     static SkFlattenable* Create(SkFlattenableReadBuffer&);
69 
70     typedef SkXfermode INHERITED;
71 };
72 
73 #endif
74