blob: a80848a3bc308f1053894789e04bf91c0ce0892e [file] [log] [blame]
/*
* 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(const rive::Vec2D& point) {
return SkPoint::Make(point[0], point[1]);
}
// 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