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