diff options
Diffstat (limited to 'include/core/SkXfermode.h')
-rw-r--r-- | include/core/SkXfermode.h | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/include/core/SkXfermode.h b/include/core/SkXfermode.h new file mode 100644 index 0000000..f7e6510 --- /dev/null +++ b/include/core/SkXfermode.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SkXfermode_DEFINED +#define SkXfermode_DEFINED + +#include "SkFlattenable.h" +#include "SkColor.h" + +/** \class SkXfermode + + SkXfermode is the base class for objects that are called to implement custom + "transfer-modes" in the drawing pipeline. The static function Create(Modes) + can be called to return an instance of any of the predefined subclasses as + specified in the Modes enum. When an SkXfermode is assigned to an SkPaint, + then objects drawn with that paint have the xfermode applied. +*/ +class SkXfermode : public SkFlattenable { +public: + SkXfermode() {} + + virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, + const SkAlpha aa[]); + virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, + const SkAlpha aa[]); + virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count, + const SkAlpha aa[]); + virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, + const SkAlpha aa[]); + + enum Coeff { + kZero_Coeff, + kOne_Coeff, + kSC_Coeff, + kISC_Coeff, + kDC_Coeff, + kIDC_Coeff, + kSA_Coeff, + kISA_Coeff, + kDA_Coeff, + kIDA_Coeff, + + kCoeffCount + }; + virtual bool asCoeff(Coeff* src, Coeff* dst); + +protected: + SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {} + + /** The default implementation of xfer32/xfer16/xferA8 in turn call this + method, 1 color at a time (upscaled to a SkPMColor). The default + implmentation of this method just returns dst. If performance is + important, your subclass should override xfer32/xfer16/xferA8 directly. + + This method will not be called directly by the client, so it need not + be implemented if your subclass has overridden xfer32/xfer16/xferA8 + */ + virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst); + +private: + typedef SkFlattenable INHERITED; +}; + +/////////////////////////////////////////////////////////////////////////////// + +/** \class SkProcXfermode + + SkProcXfermode is a xfermode that applies the specified proc to its colors. + This class is not exported to java. +*/ +class SkProcXfermode : public SkXfermode { +public: + SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {} + + // overrides from SkXfermode + virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, + const SkAlpha aa[]); + virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, + const SkAlpha aa[]); + virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count, + const SkAlpha aa[]); + virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, + const SkAlpha aa[]); + + // overrides from SkFlattenable + virtual Factory getFactory() { return CreateProc; } + virtual void flatten(SkFlattenableWriteBuffer&); + +protected: + SkProcXfermode(SkFlattenableReadBuffer&); + +private: + SkXfermodeProc fProc; + + static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { + return SkNEW_ARGS(SkProcXfermode, (buffer)); } + + typedef SkXfermode INHERITED; +}; + +#endif + |