1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/effects/SkPorterDuff.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,87 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2011 Google Inc. 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkPorterDuff.h" 1.14 +#include "SkXfermode.h" 1.15 + 1.16 +/* This file just exists as a compatibility layer, gluing the PorterDuff API 1.17 + into the (extended) SkXfermode API 1.18 + */ 1.19 + 1.20 +#define MAKE_PAIR(mode) { SkPorterDuff::k##mode##_Mode, SkXfermode::k##mode##_Mode } 1.21 + 1.22 +// this table must be in SkPorterDuff::Mode order, so it can be indexed directly 1.23 +// with a porterduff mode. 1.24 +static const struct Pair { 1.25 + SkPorterDuff::Mode fPD; 1.26 + SkXfermode::Mode fXF; 1.27 +} gPairs[] = { 1.28 + MAKE_PAIR(Clear), 1.29 + MAKE_PAIR(Src), 1.30 + MAKE_PAIR(Dst), 1.31 + MAKE_PAIR(SrcOver), 1.32 + MAKE_PAIR(DstOver), 1.33 + MAKE_PAIR(SrcIn), 1.34 + MAKE_PAIR(DstIn), 1.35 + MAKE_PAIR(SrcOut), 1.36 + MAKE_PAIR(DstOut), 1.37 + MAKE_PAIR(SrcATop), 1.38 + MAKE_PAIR(DstATop), 1.39 + MAKE_PAIR(Xor), 1.40 + MAKE_PAIR(Darken), 1.41 + MAKE_PAIR(Lighten), 1.42 + MAKE_PAIR(Modulate), 1.43 + MAKE_PAIR(Screen), 1.44 + { SkPorterDuff::kAdd_Mode, SkXfermode::kPlus_Mode }, 1.45 +#ifdef SK_BUILD_FOR_ANDROID 1.46 + MAKE_PAIR(Overlay), 1.47 +#endif 1.48 +}; 1.49 + 1.50 +static bool find_pdmode(SkXfermode::Mode src, SkPorterDuff::Mode* dst) { 1.51 + const Pair* pairs = gPairs; 1.52 + for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) { 1.53 + if (pairs[i].fXF == src) { 1.54 + if (dst) { 1.55 + *dst = pairs[i].fPD; 1.56 + } 1.57 + return true; 1.58 + } 1.59 + } 1.60 + return false; 1.61 +} 1.62 + 1.63 +SkXfermode::Mode SkPorterDuff::ToXfermodeMode(Mode mode) { 1.64 + SkASSERT((unsigned)mode < SkPorterDuff::kModeCount); 1.65 + const Pair& pair = gPairs[mode]; 1.66 + SkASSERT(pair.fPD == mode); 1.67 + return pair.fXF; 1.68 +} 1.69 + 1.70 +SkXfermode* SkPorterDuff::CreateXfermode(SkPorterDuff::Mode mode) { 1.71 + const Pair& pair = gPairs[mode]; 1.72 + SkASSERT(pair.fPD == mode); 1.73 + return SkXfermode::Create(pair.fXF); 1.74 +} 1.75 + 1.76 +bool SkPorterDuff::IsMode(SkXfermode* xfer, Mode* pdmode) { 1.77 + SkXfermode::Mode xfmode; 1.78 + if (!SkXfermode::AsMode(xfer, &xfmode)) { 1.79 + return false; 1.80 + } 1.81 + return find_pdmode(xfmode, pdmode); 1.82 +} 1.83 + 1.84 +SkXfermodeProc SkPorterDuff::GetXfermodeProc(Mode mode) { 1.85 + return SkXfermode::GetProc(gPairs[mode].fXF); 1.86 +} 1.87 + 1.88 +SkXfermodeProc16 SkPorterDuff::GetXfermodeProc16(Mode mode, SkColor srcColor) { 1.89 + return SkXfermode::GetProc16(gPairs[mode].fXF, srcColor); 1.90 +}