/*
 * Copyright 2022 Rive
 */

#ifndef _RIVE_TO_SKIA_HPP_
#define _RIVE_TO_SKIA_HPP_

#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPathTypes.h"
#include "include/core/SkTileMode.h"

#include "rive/math/mat2d.hpp"
#include "rive/math/vec2d.hpp"
#include "rive/renderer.hpp"
#include "rive/shapes/paint/stroke_cap.hpp"
#include "rive/shapes/paint/stroke_join.hpp"
#include "rive/shapes/paint/blend_mode.hpp"

namespace rive {
    class ToSkia {
    public:
        static SkMatrix convert(const rive::Mat2D& m) {
            return SkMatrix::MakeAll(m[0], m[2], m[4], m[1], m[3], m[5], 0, 0, 1);
        }

        static SkPoint convert(rive::Vec2D point) {
            return SkPoint::Make(point.x, point.y);
        }

        // clang-format off
        static SkTileMode convert(RenderTileMode rtm) {
            switch (rtm) {
                case RenderTileMode::clamp:  return SkTileMode::kClamp;
                case RenderTileMode::repeat: return SkTileMode::kRepeat;
                case RenderTileMode::mirror: return SkTileMode::kMirror;
                case RenderTileMode::decal:  return SkTileMode::kDecal;
            }
            assert(false);
            return SkTileMode::kClamp;
        }

        static SkPathFillType convert(FillRule value) {
            switch (value) {
                case FillRule::evenOdd: return SkPathFillType::kEvenOdd;
                case FillRule::nonZero: return SkPathFillType::kWinding;
            }
            assert(false);
            return SkPathFillType::kWinding;
        }

        static SkPaint::Cap convert(rive::StrokeCap cap) {
            switch (cap) {
                case StrokeCap::butt:   return SkPaint::Cap::kButt_Cap;
                case StrokeCap::round:  return SkPaint::Cap::kRound_Cap;
                case StrokeCap::square: return SkPaint::Cap::kSquare_Cap;
            }
            assert(false);
            return SkPaint::Cap::kButt_Cap;
        }

        static SkPaint::Join convert(StrokeJoin join) {
            switch (join) {
                case StrokeJoin::bevel: return SkPaint::Join::kBevel_Join;
                case StrokeJoin::round: return SkPaint::Join::kRound_Join;
                case StrokeJoin::miter: return SkPaint::Join::kMiter_Join;
            }
            assert(false);
            return SkPaint::Join::kMiter_Join;
        }

        static SkBlendMode convert(BlendMode blendMode) {
            switch (blendMode) {
                case BlendMode::srcOver:    return SkBlendMode::kSrcOver;
                case BlendMode::screen:     return SkBlendMode::kScreen;
                case BlendMode::overlay:    return SkBlendMode::kOverlay;
                case BlendMode::darken:     return SkBlendMode::kDarken;
                case BlendMode::lighten:    return SkBlendMode::kLighten;
                case BlendMode::colorDodge: return SkBlendMode::kColorDodge;
                case BlendMode::colorBurn:  return SkBlendMode::kColorBurn;
                case BlendMode::hardLight:  return SkBlendMode::kHardLight;
                case BlendMode::softLight:  return SkBlendMode::kSoftLight;
                case BlendMode::difference: return SkBlendMode::kDifference;
                case BlendMode::exclusion:  return SkBlendMode::kExclusion;
                case BlendMode::multiply:   return SkBlendMode::kMultiply;
                case BlendMode::hue:        return SkBlendMode::kHue;
                case BlendMode::saturation: return SkBlendMode::kSaturation;
                case BlendMode::color:      return SkBlendMode::kColor;
                case BlendMode::luminosity: return SkBlendMode::kLuminosity;
            }
            assert(false);
            return SkBlendMode::kSrcOver;
        }
        // clang-format off
    };
} // namespace rive
#endif
