135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPixelXorXfermode.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColorPriv.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// we always return an opaque color, 'cause I don't know what to do with
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// the alpha-component and still return a valid premultiplied color.
1535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkPMColor SkPixelXorXfermode::xferColor(SkPMColor src, SkPMColor dst) {
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor res = src ^ dst ^ fOpColor;
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    res |= (SK_A32_MASK << SK_A32_SHIFT);   // force it to be opaque
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return res;
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid SkPixelXorXfermode::flatten(SkFlattenableWriteBuffer& wb) {
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this->INHERITED::flatten(wb);
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    wb.write32(fOpColor);
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPixelXorXfermode::SkPixelXorXfermode(SkFlattenableReadBuffer& rb)
2735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        : SkXfermode(rb) {
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fOpColor = rb.readU32();
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkFlattenable::Factory SkPixelXorXfermode::getFactory() {
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return Create;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkFlattenable* SkPixelXorXfermode::Create(SkFlattenableReadBuffer& rb) {
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkNEW_ARGS(SkPixelXorXfermode, (rb));
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
391cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSK_DEFINE_FLATTENABLE_REGISTRAR(SkPixelXorXfermode)
40