SkAvoidXfermode.h revision 81dc331e65ba5a24d515c11890234dd205408c89
136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/*
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Copyright (C) 2006 The Android Open Source Project
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * you may not use this file except in compliance with the License.
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * You may obtain a copy of the License at
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Unless required by applicable law or agreed to in writing, software
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * See the License for the specific language governing permissions and
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * limitations under the License.
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines */
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef SkAvoidXfermode_DEFINED
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define SkAvoidXfermode_DEFINED
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "SkXfermode.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/** \class SkAvoidXfermode
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    This xfermode will draw the src everywhere except on top of the specified
25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    color.
26cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines*/
27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass SkAvoidXfermode : public SkXfermode {
28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinespublic:
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    enum Mode {
30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        kAvoidColor_Mode,   //!< draw everywhere except on the opColor
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        kTargetColor_Mode   //!< draw only on top of the opColor
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    };
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    /** This xfermode draws, or doesn't draw, based on the destination's
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        distance from an op-color.
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        There are two modes, and each mode interprets a tolerance value.
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        Avoid: In this mode, drawing is allowed only on destination pixels that
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines               are different from the op-color.
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines               Tolerance near 0: avoid any colors even remotely similar to the op-color
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines               Tolerance near 255: avoid only colors nearly identical to the op-color
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        Target: In this mode, drawing only occurs on destination pixels that
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                are similar to the op-color
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                Tolerance near 0: draw only on colors that are nearly identical to the op-color
47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                Tolerance near 255: draw on any colors even remotely similar to the op-color
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines     */
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    SkAvoidXfermode(SkColor opColor, U8CPU tolerance, Mode mode);
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // overrides from SkXfermode
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        const SkAlpha aa[]);
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        const SkAlpha aa[]);
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          const SkAlpha aa[]);
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        const SkAlpha aa[]);
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // overrides from SkFlattenable
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    virtual Factory getFactory();
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    virtual void flatten(SkFlattenableWriteBuffer&);
64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprotected:
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SkAvoidXfermode(SkFlattenableReadBuffer&);
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesprivate:
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SkColor     fOpColor;
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    uint32_t    fDistMul;   // x.14
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Mode        fMode;
72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    static SkFlattenable* Create(SkFlattenableReadBuffer&);
74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    typedef SkXfermode INHERITED;
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines