180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkPorterDuff_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkPorterDuff_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkColor.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkXfermode.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkXfermode; 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API SkPorterDuff { 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** List of predefined xfermodes. In general, the algebra for the modes 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uses the following symbols: 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Sa, Sc - source alpha and color 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Da, Dc - destination alpha and color (before compositing) 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru [a, c] - Resulting (alpha, color) values 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru For these equations, the colors are in premultiplied state. 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru If no xfermode is specified, kSrcOver is assumed. 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum Mode { 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kClear_Mode, //!< [0, 0] 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kSrc_Mode, //!< [Sa, Sc] 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDst_Mode, //!< [Da, Dc] 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc] 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc] 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kSrcIn_Mode, //!< [Sa * Da, Sc * Da] 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDstIn_Mode, //!< [Sa * Da, Sa * Dc] 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kXor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDarken_Mode, //!< [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kLighten_Mode, //!< [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] 41d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kModulate_Mode, //!< [Sa * Da, Sc * Dc] multiplies all components 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kScreen_Mode, //!< [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kAdd_Mode, //!< Saturate(S + D) 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_BUILD_FOR_ANDROID 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kOverlay_Mode, 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kModeCount 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Return an SkXfermode object for the specified mode. 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkXfermode* CreateXfermode(Mode mode); 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Return a function pointer to a routine that applies the specified 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru porter-duff transfer mode. 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkXfermodeProc GetXfermodeProc(Mode mode); 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Return a function pointer to a routine that applies the specified 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru porter-duff transfer mode and srcColor to a 16bit device color. Note, 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if the mode+srcColor might return a non-opaque color, then there is not 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16bit proc, and this will return NULL. 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkXfermodeProc16 GetXfermodeProc16(Mode mode, SkColor srcColor); 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** If the specified xfermode advertises itself as one of the porterduff 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru modes (via SkXfermode::Coeff), return true and if not null, set mode 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru to the corresponding porterduff mode. If it is not recognized as a one, 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false and ignore the mode parameter. 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static bool IsMode(SkXfermode*, Mode* mode); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Return the corersponding SkXfermode::Mode 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkXfermode::Mode ToXfermodeMode(Mode); 770a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger} SK_ATTR_DEPRECATED("use SkXfermode::Mode"); 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 80