// 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_CANVAS_H_
#define SKY_ENGINE_CORE_PAINTING_CANVAS_H_

#include "sky/engine/bindings/exception_state.h"
#include "sky/engine/core/painting/CanvasPath.h"
#include "sky/engine/core/painting/Drawable.h"
#include "sky/engine/core/painting/Offset.h"
#include "sky/engine/core/painting/Paint.h"
#include "sky/engine/core/painting/PaintingNode.h"
#include "sky/engine/core/painting/Picture.h"
#include "sky/engine/core/painting/PictureRecorder.h"
#include "sky/engine/core/painting/Point.h"
#include "sky/engine/core/painting/RRect.h"
#include "sky/engine/core/painting/Rect.h"
#include "sky/engine/core/painting/Size.h"
#include "sky/engine/core/painting/RSTransform.h"
#include "sky/engine/platform/graphics/DisplayList.h"
#include "sky/engine/tonic/dart_wrappable.h"
#include "sky/engine/tonic/float32_list.h"
#include "sky/engine/wtf/PassRefPtr.h"
#include "sky/engine/wtf/RefCounted.h"
#include "third_party/skia/include/core/SkCanvas.h"

namespace blink {
class CanvasImage;

class Canvas : public RefCounted<Canvas>, public DartWrappable {
    DEFINE_WRAPPERTYPEINFO();
public:
    static PassRefPtr<Canvas> create(SkCanvas* skCanvas) {
        ASSERT(skCanvas);
        return adoptRef(new Canvas(skCanvas));
    }

    // TODO(ianh): fix crashes here https://github.com/domokit/mojo/issues/326
    static PassRefPtr<Canvas> create(PictureRecorder* recorder,
                                     Rect& bounds,
                                     ExceptionState& es) {
        ASSERT(recorder);
        if (recorder->isRecording()) {
            es.ThrowTypeError(
                "You must call PictureRecorder.endRecording() before reusing a"
                " PictureRecorder to create a new Canvas object.");
            // TODO(iansf): We should return a nullptr here, I think, but doing
            //              so will require modifying the dart template code to
            //              to correctly handle constructors that throw
            //              exceptions.  For now, just let it return a dart
            //              object that may cause a crash later on -- if the
            //              dart code catches the error, it will leak a canvas
            //              but it won't crash.
        }
        PassRefPtr<Canvas> canvas = create(recorder->beginRecording(bounds));
        recorder->set_canvas(canvas.get());
        return canvas;
    }

    ~Canvas() override;

    void save();
    void saveLayer(const Rect& bounds, const Paint& paint);
    void restore();
    int getSaveCount();

    void translate(float dx, float dy);
    void scale(float sx, float sy);
    void rotate(float radians);
    void skew(float sx, float sy);
    void concat(const Float32List& matrix4, ExceptionState&);

    void setMatrix(const Float32List& matrix4, ExceptionState&);
    Float32List getTotalMatrix() const;

    void clipRect(const Rect& rect);
    void clipRRect(const RRect* rrect);
    void clipPath(const CanvasPath* path);

    void drawColor(SkColor color, SkXfermode::Mode transferMode);
    void drawLine(const Point& p1, const Point& p2, const Paint& paint);
    void drawPaint(const Paint& paint);
    void drawRect(const Rect& rect, const Paint& paint);
    void drawRRect(const RRect* rrect, const Paint& paint);
    void drawDRRect(const RRect* outer, const RRect* inner, const Paint& paint);
    void drawOval(const Rect& rect, const Paint& paint);
    void drawCircle(const Point& c, float radius, const Paint& paint);
    void drawPath(const CanvasPath* path, const Paint& paint);
    void drawImage(const CanvasImage* image, const Point& p, const Paint& paint);
    void drawImageRect(const CanvasImage* image, Rect& src, Rect& dst, const Paint& paint);
    void drawPicture(Picture* picture);
    void drawDrawable(Drawable* drawable);
    void drawPaintingNode(PaintingNode* paintingNode, const Point& p);

    void drawAtlas(CanvasImage* atlas,
        const Vector<RSTransform>& transforms, const Vector<Rect>& rects,
        const Vector<SkColor>& colors, SkXfermode::Mode mode,
        const Rect& cullRect, const Paint& paint, ExceptionState&);

    SkCanvas* skCanvas() { return m_canvas; }
    void clearSkCanvas() { m_canvas = nullptr; }
    bool isRecording() const { return !!m_canvas; }

protected:
    explicit Canvas(SkCanvas* skCanvas);

private:
    // The SkCanvas is supplied by a call to SkPictureRecorder::beginRecording,
    // which does not transfer ownership.  For this reason, we hold a raw
    // pointer and manually set the SkCanvas to null in clearSkCanvas.
    SkCanvas* m_canvas;
};

} // namespace blink

#endif  // SKY_ENGINE_CORE_PAINTING_CANVAS_H_
