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