/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkLerpXfermode.h"
#include "SkColorPriv.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkString.h"

SkXfermode* SkLerpXfermode::Create(SkScalar scale) {
    int scale256 = SkScalarRoundToInt(scale * 256);
    if (scale256 >= 256) {
        return SkXfermode::Create(SkXfermode::kSrc_Mode);
    } else if (scale256 <= 0) {
        return SkXfermode::Create(SkXfermode::kDst_Mode);
    }
    return SkNEW_ARGS(SkLerpXfermode, (scale256));
}

SkLerpXfermode::SkLerpXfermode(unsigned scale256) : fScale256(scale256) {}

#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
SkLerpXfermode::SkLerpXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {
    fScale256 = buffer.readUInt();
}
#endif

void SkLerpXfermode::flatten(SkWriteBuffer& buffer) const {
    buffer.writeUInt(fScale256);
}

SkFlattenable* SkLerpXfermode::CreateProc(SkReadBuffer& buffer) {
    return SkNEW_ARGS(SkLerpXfermode, (buffer.readUInt()));
}

void SkLerpXfermode::xfer32(SkPMColor dst[], const SkPMColor src[], int count,
                             const SkAlpha aa[]) const {
    const int scale = fScale256;

    if (aa) {
        for (int i = 0; i < count; ++i) {
            unsigned a = aa[i];
            if (a) {
                SkPMColor dstC = dst[i];
                SkPMColor resC = SkFastFourByteInterp256(src[i], dstC, scale);
                if (a < 255) {
                    resC = SkFastFourByteInterp256(resC, dstC, a + (a >> 7));
                }
                dst[i] = resC;
            }
        }
    } else {
        for (int i = 0; i < count; ++i) {
            dst[i] = SkFastFourByteInterp256(src[i], dst[i], scale);
        }
    }
}

void SkLerpXfermode::xfer16(uint16_t dst[], const SkPMColor src[], int count,
                             const SkAlpha aa[]) const {
    const int scale = fScale256;

    if (aa) {
        for (int i = 0; i < count; ++i) {
            unsigned a = aa[i];
            if (a) {
                SkPMColor dstC = SkPixel16ToPixel32(dst[i]);
                SkPMColor resC = SkFastFourByteInterp256(src[i], dstC, scale);
                if (a < 255) {
                    resC = SkFastFourByteInterp256(resC, dstC, a + (a >> 7));
                }
                dst[i] = SkPixel32ToPixel16(resC);
            }
        }
    } else {
        for (int i = 0; i < count; ++i) {
            SkPMColor dstC = SkPixel16ToPixel32(dst[i]);
            SkPMColor resC = SkFastFourByteInterp256(src[i], dstC, scale);
            dst[i] = SkPixel32ToPixel16(resC);
        }
    }
}

void SkLerpXfermode::xferA8(SkAlpha dst[], const SkPMColor src[], int count,
                             const SkAlpha aa[]) const {
    const int scale = fScale256;

    if (aa) {
        for (int i = 0; i < count; ++i) {
            unsigned a = aa[i];
            if (a) {
                unsigned dstA = dst[i];
                unsigned resA = SkAlphaBlend(SkGetPackedA32(src[i]), dstA, scale);
                if (a < 255) {
                    resA = SkAlphaBlend(resA, dstA, a + (a >> 7));
                }
                dst[i] = resA;
            }
        }
    } else {
        for (int i = 0; i < count; ++i) {
            dst[i] = SkAlphaBlend(SkGetPackedA32(src[i]), dst[i], scale);
        }
    }
}

#ifndef SK_IGNORE_TO_STRING
void SkLerpXfermode::toString(SkString* str) const {
    str->printf("SkLerpXfermode: scale: %g", fScale256 / 256.0);
}
#endif
