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

#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGStop.h"
#include "experimental/svg/model/SkSVGValue.h"

SkSVGStop::SkSVGStop() : INHERITED(SkSVGTag::kStop) {}

void SkSVGStop::setOffset(const SkSVGLength& offset) {
    fOffset = offset;
}

void SkSVGStop::setStopColor(const SkSVGColorType& color) {
    fStopColor = color;
}

void SkSVGStop::setStopOpacity(const SkSVGNumberType& opacity) {
    fStopOpacity = SkTPin<SkScalar>(opacity.value(), 0, 1);
}

void SkSVGStop::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
    switch (attr) {
    case SkSVGAttribute::kOffset:
        if (const auto* offset = v.as<SkSVGLengthValue>()) {
            this->setOffset(*offset);
        }
        break;
    case SkSVGAttribute::kStopColor:
        if (const auto* color = v.as<SkSVGColorValue>()) {
            this->setStopColor(*color);
        }
        break;
    case SkSVGAttribute::kStopOpacity:
        if (const auto* opacity = v.as<SkSVGNumberValue>()) {
            this->setStopOpacity(*opacity);
        }
        break;
    default:
        this->INHERITED::onSetAttribute(attr, v);
    }
}
