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