// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SKY_ENGINE_CORE_PAINTING_PAINT_H_
#define SKY_ENGINE_CORE_PAINTING_PAINT_H_

#include "sky/engine/core/painting/CanvasColor.h"
#include "sky/engine/core/painting/PaintingStyle.h"
#include "sky/engine/core/painting/TransferMode.h"
#include "sky/engine/tonic/dart_wrappable.h"
#include "sky/engine/wtf/PassRefPtr.h"
#include "sky/engine/wtf/RefCounted.h"
#include "third_party/skia/include/core/SkPaint.h"

namespace blink {

class DrawLooper;
class ColorFilter;
class MaskFilter;
class Shader;

class Paint : public RefCounted<Paint>, public DartWrappable {
    DEFINE_WRAPPERTYPEINFO();
public:
    ~Paint() override;
    static PassRefPtr<Paint> create()
    {
        return adoptRef(new Paint);
    }

    bool isAntiAlias() const { return m_paint.isAntiAlias(); }
    void setIsAntiAlias(bool value) { m_paint.setAntiAlias(value); }

    SkColor color() const { return m_paint.getColor(); }
    void setColor(SkColor color) { m_paint.setColor(color); }

    SkScalar strokeWidth() const { return m_paint.getStrokeWidth(); }
    void setStrokeWidth(SkScalar strokeWidth) { m_paint.setStrokeWidth(strokeWidth); }

    void setARGB(unsigned a, unsigned r, unsigned g, unsigned b)
    {
        m_paint.setARGB(a, r, g, b);
    }
    void setDrawLooper(DrawLooper* looper);
    void setColorFilter(ColorFilter* filter);
    void setMaskFilter(MaskFilter* filter);
    void setShader(Shader* shader);
    void setStyle(SkPaint::Style style);
    void setTransferMode(SkXfermode::Mode transfer_mode);

    const SkPaint& paint() const { return m_paint; }
    void setPaint(const SkPaint& paint) { m_paint = paint; }

private:
    Paint();

    SkPaint m_paint;
};

} // namespace blink

#endif  // SKY_ENGINE_CORE_PAINTING_PAINT_H_
