blob: 24b4959e4fbff5d215ca0b54a75be4f23da0f979 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com8a1c16f2008-12-17 15:59:43 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#ifndef SkAvoidXfermode_DEFINED
11#define SkAvoidXfermode_DEFINED
12
13#include "SkXfermode.h"
14
15/** \class SkAvoidXfermode
16
17 This xfermode will draw the src everywhere except on top of the specified
18 color.
19*/
20class SkAvoidXfermode : public SkXfermode {
21public:
22 enum Mode {
23 kAvoidColor_Mode, //!< draw everywhere except on the opColor
24 kTargetColor_Mode //!< draw only on top of the opColor
25 };
26
reed@android.com0db5a7f2009-11-09 16:01:36 +000027 /** This xfermode draws, or doesn't draw, based on the destination's
28 distance from an op-color.
tomhudson@google.com1447c6f2011-04-27 14:09:52 +000029
reed@android.com0db5a7f2009-11-09 16:01:36 +000030 There are two modes, and each mode interprets a tolerance value.
tomhudson@google.com1447c6f2011-04-27 14:09:52 +000031
reed@android.com0db5a7f2009-11-09 16:01:36 +000032 Avoid: In this mode, drawing is allowed only on destination pixels that
33 are different from the op-color.
reed@android.com81dc3312010-02-18 19:32:03 +000034 Tolerance near 0: avoid any colors even remotely similar to the op-color
35 Tolerance near 255: avoid only colors nearly identical to the op-color
tomhudson@google.com1447c6f2011-04-27 14:09:52 +000036
reed@android.com0db5a7f2009-11-09 16:01:36 +000037 Target: In this mode, drawing only occurs on destination pixels that
38 are similar to the op-color
reed@android.com81dc3312010-02-18 19:32:03 +000039 Tolerance near 0: draw only on colors that are nearly identical to the op-color
40 Tolerance near 255: draw on any colors even remotely similar to the op-color
reed@android.com0db5a7f2009-11-09 16:01:36 +000041 */
reed@android.com8a1c16f2008-12-17 15:59:43 +000042 SkAvoidXfermode(SkColor opColor, U8CPU tolerance, Mode mode);
43
44 // overrides from SkXfermode
45 virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
46 const SkAlpha aa[]);
47 virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
48 const SkAlpha aa[]);
49 virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
50 const SkAlpha aa[]);
51 virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
52 const SkAlpha aa[]);
53
54 // overrides from SkFlattenable
55 virtual Factory getFactory();
56 virtual void flatten(SkFlattenableWriteBuffer&);
57
tomhudson@google.com1447c6f2011-04-27 14:09:52 +000058 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
59 return SkNEW_ARGS(SkAvoidXfermode, (buffer));
60 }
61
reed@android.com8a1c16f2008-12-17 15:59:43 +000062protected:
63 SkAvoidXfermode(SkFlattenableReadBuffer&);
64
65private:
66 SkColor fOpColor;
67 uint32_t fDistMul; // x.14
68 Mode fMode;
tomhudson@google.com1447c6f2011-04-27 14:09:52 +000069
reed@android.com8a1c16f2008-12-17 15:59:43 +000070 static SkFlattenable* Create(SkFlattenableReadBuffer&);
tomhudson@google.com1447c6f2011-04-27 14:09:52 +000071
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 typedef SkXfermode INHERITED;
73};
74
75#endif