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