michael@0: michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "SkPorterDuff.h" michael@0: #include "SkXfermode.h" michael@0: michael@0: /* This file just exists as a compatibility layer, gluing the PorterDuff API michael@0: into the (extended) SkXfermode API michael@0: */ michael@0: michael@0: #define MAKE_PAIR(mode) { SkPorterDuff::k##mode##_Mode, SkXfermode::k##mode##_Mode } michael@0: michael@0: // this table must be in SkPorterDuff::Mode order, so it can be indexed directly michael@0: // with a porterduff mode. michael@0: static const struct Pair { michael@0: SkPorterDuff::Mode fPD; michael@0: SkXfermode::Mode fXF; michael@0: } gPairs[] = { michael@0: MAKE_PAIR(Clear), michael@0: MAKE_PAIR(Src), michael@0: MAKE_PAIR(Dst), michael@0: MAKE_PAIR(SrcOver), michael@0: MAKE_PAIR(DstOver), michael@0: MAKE_PAIR(SrcIn), michael@0: MAKE_PAIR(DstIn), michael@0: MAKE_PAIR(SrcOut), michael@0: MAKE_PAIR(DstOut), michael@0: MAKE_PAIR(SrcATop), michael@0: MAKE_PAIR(DstATop), michael@0: MAKE_PAIR(Xor), michael@0: MAKE_PAIR(Darken), michael@0: MAKE_PAIR(Lighten), michael@0: MAKE_PAIR(Modulate), michael@0: MAKE_PAIR(Screen), michael@0: { SkPorterDuff::kAdd_Mode, SkXfermode::kPlus_Mode }, michael@0: #ifdef SK_BUILD_FOR_ANDROID michael@0: MAKE_PAIR(Overlay), michael@0: #endif michael@0: }; michael@0: michael@0: static bool find_pdmode(SkXfermode::Mode src, SkPorterDuff::Mode* dst) { michael@0: const Pair* pairs = gPairs; michael@0: for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) { michael@0: if (pairs[i].fXF == src) { michael@0: if (dst) { michael@0: *dst = pairs[i].fPD; michael@0: } michael@0: return true; michael@0: } michael@0: } michael@0: return false; michael@0: } michael@0: michael@0: SkXfermode::Mode SkPorterDuff::ToXfermodeMode(Mode mode) { michael@0: SkASSERT((unsigned)mode < SkPorterDuff::kModeCount); michael@0: const Pair& pair = gPairs[mode]; michael@0: SkASSERT(pair.fPD == mode); michael@0: return pair.fXF; michael@0: } michael@0: michael@0: SkXfermode* SkPorterDuff::CreateXfermode(SkPorterDuff::Mode mode) { michael@0: const Pair& pair = gPairs[mode]; michael@0: SkASSERT(pair.fPD == mode); michael@0: return SkXfermode::Create(pair.fXF); michael@0: } michael@0: michael@0: bool SkPorterDuff::IsMode(SkXfermode* xfer, Mode* pdmode) { michael@0: SkXfermode::Mode xfmode; michael@0: if (!SkXfermode::AsMode(xfer, &xfmode)) { michael@0: return false; michael@0: } michael@0: return find_pdmode(xfmode, pdmode); michael@0: } michael@0: michael@0: SkXfermodeProc SkPorterDuff::GetXfermodeProc(Mode mode) { michael@0: return SkXfermode::GetProc(gPairs[mode].fXF); michael@0: } michael@0: michael@0: SkXfermodeProc16 SkPorterDuff::GetXfermodeProc16(Mode mode, SkColor srcColor) { michael@0: return SkXfermode::GetProc16(gPairs[mode].fXF, srcColor); michael@0: }