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