18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkPorterDuff_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPorterDuff_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColor.h"
12845fdaca174f4675e9acc164b510e3a5ffa9053creed@android.com#include "SkXfermode.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkXfermode;
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
166806fe87e0b39e283291c1a1c7d1d864230aa2aatfarina@chromium.orgclass SK_API SkPorterDuff {
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** List of predefined xfermodes. In general, the algebra for the modes
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        uses the following symbols:
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        Sa, Sc  - source alpha and color
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        Da, Dc - destination alpha and color (before compositing)
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        [a, c] - Resulting (alpha, color) values
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        For these equations, the colors are in premultiplied state.
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        If no xfermode is specified, kSrcOver is assumed.
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum Mode {
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kClear_Mode,    //!< [0, 0]
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSrc_Mode,      //!< [Sa, Sc]
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDst_Mode,      //!< [Da, Dc]
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSrcOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc]
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDstOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc]
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSrcIn_Mode,    //!< [Sa * Da, Sc * Da]
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDstIn_Mode,    //!< [Sa * Da, Sa * Dc]
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSrcOut_Mode,   //!< [Sa * (1 - Da), Sc * (1 - Da)]
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDstOut_Mode,   //!< [Da * (1 - Sa), Dc * (1 - Sa)]
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSrcATop_Mode,  //!< [Da, Sc * Da + (1 - Sa) * Dc]
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDstATop_Mode,  //!< [Sa, Sa * Dc + Sc * (1 - Da)]
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kXor_Mode,      //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDarken_Mode,   //!< [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kLighten_Mode,  //!< [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]
418d3cd7a170c810e3816bf00220cbef51e7b16795reed@google.com        kModulate_Mode, //!< [Sa * Da, Sc * Dc] multiplies all components
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kScreen_Mode,   //!< [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
43543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.com        kAdd_Mode,      //!< Saturate(S + D)
4456c69773aea56c6c6bd47bc7e7970dd081205184djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
45cd9d69b9ce7eb301a9fd8d91b9f95fd99b07bae5djsollen@google.com        kOverlay_Mode,
46cd9d69b9ce7eb301a9fd8d91b9f95fd99b07bae5djsollen@google.com#endif
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kModeCount
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
50845fdaca174f4675e9acc164b510e3a5ffa9053creed@android.com
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Return an SkXfermode object for the specified mode.
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkXfermode* CreateXfermode(Mode mode);
54fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Return a function pointer to a routine that applies the specified
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        porter-duff transfer mode.
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkXfermodeProc GetXfermodeProc(Mode mode);
59fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Return a function pointer to a routine that applies the specified
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        porter-duff transfer mode and srcColor to a 16bit device color. Note,
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if the mode+srcColor might return a non-opaque color, then there is not
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        16bit proc, and this will return NULL.
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkXfermodeProc16 GetXfermodeProc16(Mode mode, SkColor srcColor);
66fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** If the specified xfermode advertises itself as one of the porterduff
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        modes (via SkXfermode::Coeff), return true and if not null, set mode
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        to the corresponding porterduff mode. If it is not recognized as a one,
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return false and ignore the mode parameter.
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool IsMode(SkXfermode*, Mode* mode);
73845fdaca174f4675e9acc164b510e3a5ffa9053creed@android.com
74845fdaca174f4675e9acc164b510e3a5ffa9053creed@android.com    /** Return the corersponding SkXfermode::Mode
75845fdaca174f4675e9acc164b510e3a5ffa9053creed@android.com     */
76845fdaca174f4675e9acc164b510e3a5ffa9053creed@android.com    static SkXfermode::Mode ToXfermodeMode(Mode);
774469938e92d779dff05e745559e67907bbf21e78reed@google.com} SK_ATTR_DEPRECATED("use SkXfermode::Mode");
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
80