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

#ifndef GrPipelineInput_DEFINED
#define GrPipelineInput_DEFINED

#include "GrColor.h"

/**
 * This describes the color or coverage input that will be seen by the first color or coverage stage
 * of a GrPipeline. This is also the GrPrimitiveProcessor color or coverage *output*.
 */
struct GrPipelineInput {
    enum class Opaque {
        kNo,
        kYes,
    };

    GrPipelineInput(Opaque opaque = Opaque::kNo)
            : fFlags(opaque == Opaque::kYes ? kIsOpaque_Flag : 0) {}

    GrPipelineInput(GrColor color) : fFlags(kColorIsKnown_Flag), fColor(color) {}

    void setToConstant(GrColor color) {
        fColor = color;
        if (GrColorIsOpaque(color)) {
            fFlags = kColorIsKnown_Flag | kIsOpaque_Flag;
        } else {
            fFlags = kColorIsKnown_Flag;
        }
    }

    void setToUnknown() { fFlags = 0; }

    void setToUnknownOpaque() { fFlags = kIsOpaque_Flag; }

    void setToSolidCoverage() {
        fColor = GrColor_WHITE;
        fFlags = kColorIsKnown_Flag | kIsOpaque_Flag;
    }

    void setToScalar(uint8_t alpha) {
        this->setToConstant(GrColorPackRGBA(alpha, alpha, alpha, alpha));
    }

    void setToLCDCoverage() { fFlags = kIsLCDCoverage_Flag; }

    bool isLCDCoverage() const { return SkToBool(kIsLCDCoverage_Flag & fFlags); }

    bool isOpaque() const { return SkToBool(kIsOpaque_Flag & fFlags); }

    bool isSolidWhite() const { return (kColorIsKnown_Flag & fFlags) && GrColor_WHITE == fColor; }

    bool isConstant(GrColor* color) const {
        if (kColorIsKnown_Flag & fFlags) {
            *color = fColor;
            return true;
        }
        return false;
    }

private:
    enum Flags {
        kColorIsKnown_Flag = 0x1,
        kIsOpaque_Flag = 0x2,
        kIsLCDCoverage_Flag = 0x4,
    };
    uint32_t fFlags;
    GrColor fColor;
};

#endif
