blob: 25a75d9323c81e7297bbd5f44cf94f1560e4fffd [file] [log] [blame] [edit]
// Copyright 2013 The Flutter 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 FLUTTER_IMPELLER_TOOLKIT_INTEROP_IMPELLER_HPP_
#define FLUTTER_IMPELLER_TOOLKIT_INTEROP_IMPELLER_HPP_
#include <functional>
#include <memory>
#include <string>
#include <string_view>
#include <utility>
#include "impeller.h"
//------------------------------------------------------------------------------
/// A C++ 17 wrapper to the C Impeller API. This is a convenience wrapper for
/// the C++ API and only depends on standard libc++ utilities in addition to
/// impeller.h
///
#ifndef IMPELLER_HPP_NAMESPACE
#define IMPELLER_HPP_NAMESPACE impeller::hpp
#endif // IMPELLER_HPP_NAMESPACE
// Tripping this assertion means that the C++ wrapper needs to be updated to
// account for impeller.h changes as necessary.
static_assert(IMPELLER_VERSION == IMPELLER_MAKE_VERSION(1, 1, 2, 0),
"C++ bindings must be for the same version as the C API.");
namespace IMPELLER_HPP_NAMESPACE {
template <class T>
struct Proc {
using FunctionType = T;
const char* name = nullptr;
FunctionType* function = nullptr;
template <class... Args>
auto operator()(Args&&... args) const {
return function(std::forward<Args>(args)...);
}
};
#define IMPELLER_HPP_EACH_PROC(PROC) \
PROC(ImpellerColorFilterCreateBlendNew) \
PROC(ImpellerColorFilterCreateColorMatrixNew) \
PROC(ImpellerColorFilterRelease) \
PROC(ImpellerColorFilterRetain) \
PROC(ImpellerColorSourceCreateConicalGradientNew) \
PROC(ImpellerColorSourceCreateImageNew) \
PROC(ImpellerColorSourceCreateLinearGradientNew) \
PROC(ImpellerColorSourceCreateRadialGradientNew) \
PROC(ImpellerColorSourceCreateSweepGradientNew) \
PROC(ImpellerColorSourceRelease) \
PROC(ImpellerColorSourceRetain) \
PROC(ImpellerContextCreateOpenGLESNew) \
PROC(ImpellerContextRelease) \
PROC(ImpellerContextRetain) \
PROC(ImpellerDisplayListBuilderClipOval) \
PROC(ImpellerDisplayListBuilderClipPath) \
PROC(ImpellerDisplayListBuilderClipRect) \
PROC(ImpellerDisplayListBuilderClipRoundedRect) \
PROC(ImpellerDisplayListBuilderCreateDisplayListNew) \
PROC(ImpellerDisplayListBuilderDrawDashedLine) \
PROC(ImpellerDisplayListBuilderDrawDisplayList) \
PROC(ImpellerDisplayListBuilderDrawLine) \
PROC(ImpellerDisplayListBuilderDrawOval) \
PROC(ImpellerDisplayListBuilderDrawPaint) \
PROC(ImpellerDisplayListBuilderDrawParagraph) \
PROC(ImpellerDisplayListBuilderDrawPath) \
PROC(ImpellerDisplayListBuilderDrawRect) \
PROC(ImpellerDisplayListBuilderDrawRoundedRect) \
PROC(ImpellerDisplayListBuilderDrawRoundedRectDifference) \
PROC(ImpellerDisplayListBuilderDrawTexture) \
PROC(ImpellerDisplayListBuilderDrawTextureRect) \
PROC(ImpellerDisplayListBuilderGetSaveCount) \
PROC(ImpellerDisplayListBuilderGetTransform) \
PROC(ImpellerDisplayListBuilderNew) \
PROC(ImpellerDisplayListBuilderRelease) \
PROC(ImpellerDisplayListBuilderResetTransform) \
PROC(ImpellerDisplayListBuilderRestore) \
PROC(ImpellerDisplayListBuilderRestoreToCount) \
PROC(ImpellerDisplayListBuilderRetain) \
PROC(ImpellerDisplayListBuilderRotate) \
PROC(ImpellerDisplayListBuilderSave) \
PROC(ImpellerDisplayListBuilderSaveLayer) \
PROC(ImpellerDisplayListBuilderScale) \
PROC(ImpellerDisplayListBuilderSetTransform) \
PROC(ImpellerDisplayListBuilderTransform) \
PROC(ImpellerDisplayListBuilderTranslate) \
PROC(ImpellerDisplayListRelease) \
PROC(ImpellerDisplayListRetain) \
PROC(ImpellerGetVersion) \
PROC(ImpellerImageFilterCreateBlurNew) \
PROC(ImpellerImageFilterCreateComposeNew) \
PROC(ImpellerImageFilterCreateDilateNew) \
PROC(ImpellerImageFilterCreateErodeNew) \
PROC(ImpellerImageFilterCreateMatrixNew) \
PROC(ImpellerImageFilterRelease) \
PROC(ImpellerImageFilterRetain) \
PROC(ImpellerMaskFilterCreateBlurNew) \
PROC(ImpellerMaskFilterRelease) \
PROC(ImpellerMaskFilterRetain) \
PROC(ImpellerPaintNew) \
PROC(ImpellerPaintRelease) \
PROC(ImpellerPaintRetain) \
PROC(ImpellerPaintSetBlendMode) \
PROC(ImpellerPaintSetColor) \
PROC(ImpellerPaintSetColorFilter) \
PROC(ImpellerPaintSetColorSource) \
PROC(ImpellerPaintSetDrawStyle) \
PROC(ImpellerPaintSetImageFilter) \
PROC(ImpellerPaintSetMaskFilter) \
PROC(ImpellerPaintSetStrokeCap) \
PROC(ImpellerPaintSetStrokeJoin) \
PROC(ImpellerPaintSetStrokeMiter) \
PROC(ImpellerPaintSetStrokeWidth) \
PROC(ImpellerParagraphBuilderAddText) \
PROC(ImpellerParagraphBuilderBuildParagraphNew) \
PROC(ImpellerParagraphBuilderNew) \
PROC(ImpellerParagraphBuilderPopStyle) \
PROC(ImpellerParagraphBuilderPushStyle) \
PROC(ImpellerParagraphBuilderRelease) \
PROC(ImpellerParagraphBuilderRetain) \
PROC(ImpellerParagraphGetAlphabeticBaseline) \
PROC(ImpellerParagraphGetHeight) \
PROC(ImpellerParagraphGetIdeographicBaseline) \
PROC(ImpellerParagraphGetLineCount) \
PROC(ImpellerParagraphGetLongestLineWidth) \
PROC(ImpellerParagraphGetMaxIntrinsicWidth) \
PROC(ImpellerParagraphGetMaxWidth) \
PROC(ImpellerParagraphGetMinIntrinsicWidth) \
PROC(ImpellerParagraphRelease) \
PROC(ImpellerParagraphRetain) \
PROC(ImpellerParagraphStyleNew) \
PROC(ImpellerParagraphStyleRelease) \
PROC(ImpellerParagraphStyleRetain) \
PROC(ImpellerParagraphStyleSetBackground) \
PROC(ImpellerParagraphStyleSetFontFamily) \
PROC(ImpellerParagraphStyleSetFontSize) \
PROC(ImpellerParagraphStyleSetFontStyle) \
PROC(ImpellerParagraphStyleSetFontWeight) \
PROC(ImpellerParagraphStyleSetForeground) \
PROC(ImpellerParagraphStyleSetHeight) \
PROC(ImpellerParagraphStyleSetLocale) \
PROC(ImpellerParagraphStyleSetMaxLines) \
PROC(ImpellerParagraphStyleSetTextAlignment) \
PROC(ImpellerParagraphStyleSetTextDirection) \
PROC(ImpellerPathBuilderAddArc) \
PROC(ImpellerPathBuilderAddOval) \
PROC(ImpellerPathBuilderAddRect) \
PROC(ImpellerPathBuilderAddRoundedRect) \
PROC(ImpellerPathBuilderClose) \
PROC(ImpellerPathBuilderCopyPathNew) \
PROC(ImpellerPathBuilderCubicCurveTo) \
PROC(ImpellerPathBuilderLineTo) \
PROC(ImpellerPathBuilderMoveTo) \
PROC(ImpellerPathBuilderNew) \
PROC(ImpellerPathBuilderQuadraticCurveTo) \
PROC(ImpellerPathBuilderRelease) \
PROC(ImpellerPathBuilderRetain) \
PROC(ImpellerPathBuilderTakePathNew) \
PROC(ImpellerPathRelease) \
PROC(ImpellerPathRetain) \
PROC(ImpellerSurfaceCreateWrappedFBONew) \
PROC(ImpellerSurfaceDrawDisplayList) \
PROC(ImpellerSurfaceRelease) \
PROC(ImpellerSurfaceRetain) \
PROC(ImpellerTextureCreateWithContentsNew) \
PROC(ImpellerTextureCreateWithOpenGLTextureHandleNew) \
PROC(ImpellerTextureGetOpenGLHandle) \
PROC(ImpellerTextureRelease) \
PROC(ImpellerTextureRetain) \
PROC(ImpellerTypographyContextNew) \
PROC(ImpellerTypographyContextRegisterFont) \
PROC(ImpellerTypographyContextRelease) \
PROC(ImpellerTypographyContextRetain)
struct ProcTable {
bool Initialize(
const std::function<void*(const char* function_name)>& resolver) {
#define IMPELLER_HPP_PROC(proc) \
{ \
proc.function = \
reinterpret_cast<decltype(proc.function)>(resolver(proc.name)); \
if (proc.function == nullptr) { \
return false; \
} \
}
IMPELLER_HPP_EACH_PROC(IMPELLER_HPP_PROC)
#undef IMPELLER_HPP_PROC
return true;
}
#define IMPELLER_HPP_PROC(name) Proc<decltype(name)> name = {#name, nullptr};
IMPELLER_HPP_EACH_PROC(IMPELLER_HPP_PROC)
#undef IMPELLER_HPP_PROC
};
extern ProcTable gGlobalProcTable;
enum class AdoptTag {
kAdopt,
};
template <class T, class Traits>
class Object {
public:
Object() = default;
explicit Object(T object) { Reset(object); }
Object(T object, AdoptTag) : object_(object) {}
~Object() { Reset(); }
Object(Object&& other) { std::swap(object_, other.object_); }
Object(const Object& other) { Reset(other.Get()); }
Object& operator=(Object&& other) {
std::swap(object_, other.object_);
return *this;
}
Object& operator=(const Object& other) {
Reset(other.Get());
return *this;
}
T Get() const { return object_; }
explicit operator bool() const { return object_ != nullptr; }
private:
T object_ = nullptr;
void Reset(T other = nullptr) {
if (object_ == other) {
return;
}
if (object_) {
Traits::Release(object_);
object_ = nullptr;
}
if (other) {
Traits::Retain(other);
object_ = other;
}
}
[[nodiscard]] T Leak() {
T result = object_;
object_ = nullptr;
return result;
}
};
#define IMPELLER_HPP_DEFINE_TRAITS(object) \
struct object##Traits { \
static void Retain(object ctx) { \
gGlobalProcTable.object##Retain(ctx); \
} \
static void Release(object ctx) { \
gGlobalProcTable.object##Release(ctx); \
} \
};
IMPELLER_HPP_DEFINE_TRAITS(ImpellerColorFilter);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerColorSource);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerContext);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerDisplayList);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerDisplayListBuilder);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerImageFilter);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerMaskFilter);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerPaint);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerParagraph);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerParagraphBuilder);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerParagraphStyle);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerPath);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerPathBuilder);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerSurface);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerTexture);
IMPELLER_HPP_DEFINE_TRAITS(ImpellerTypographyContext);
#undef IMPELLER_HPP_DEFINE_TRAITS
class Mapping final {
public:
Mapping(const uint8_t* mapping,
size_t size,
std::function<void()> release_callback)
: mapping_(mapping),
size_(size),
release_callback_(std::move(release_callback)) {}
const uint8_t* GetMapping() const { return mapping_; }
size_t GetSize() const { return size_; }
private:
const uint8_t* mapping_ = nullptr;
size_t size_ = 0u;
std::function<void()> release_callback_;
};
//------------------------------------------------------------------------------
/// @see ImpellerContext
///
class Context final : public Object<ImpellerContext, ImpellerContextTraits> {
public:
Context(ImpellerContext context, AdoptTag tag) : Object(context, tag) {}
//----------------------------------------------------------------------------
/// @see ImpellerContextCreateOpenGLESNew
///
static Context OpenGLES(
const std::function<void*(const char*)>& gl_proc_address_resolver) {
struct UserData {
std::function<void*(const char*)> resolver;
};
UserData user_data;
user_data.resolver = gl_proc_address_resolver;
ImpellerProcAddressCallback callback = [](const char* proc_name,
void* user_data) -> void* {
return reinterpret_cast<UserData*>(user_data)->resolver(proc_name);
};
return Context(
gGlobalProcTable.ImpellerContextCreateOpenGLESNew(IMPELLER_VERSION, //
callback, //
&user_data //
),
AdoptTag::kAdopt);
}
};
//------------------------------------------------------------------------------
/// @see ImpellerTexture
///
class Texture final : public Object<ImpellerTexture, ImpellerTextureTraits> {
public:
Texture(ImpellerTexture texture, AdoptTag adopt) : Object(texture, adopt) {}
//----------------------------------------------------------------------------
/// @see ImpellerTextureCreateWithContentsNew
///
static Texture WithContents(const Context& context,
const ImpellerTextureDescriptor& descriptor,
std::unique_ptr<Mapping> mapping = nullptr) {
if (mapping == nullptr) {
mapping = std::make_unique<Mapping>(nullptr, 0u, nullptr);
}
ImpellerMapping c_mapping = {};
c_mapping.data = mapping->GetMapping();
c_mapping.length = mapping->GetSize();
c_mapping.on_release = [](void* user_data) -> void {
delete reinterpret_cast<Mapping*>(user_data);
};
return Texture(gGlobalProcTable.ImpellerTextureCreateWithContentsNew(
context.Get(), //
&descriptor, //
&c_mapping, //
mapping.release() //
),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerTextureCreateWithOpenGLTextureHandleNew
///
static Texture WithOpenGLTexture(const Context& context,
const ImpellerTextureDescriptor& descriptor,
uint64_t handle) {
return Texture(
gGlobalProcTable.ImpellerTextureCreateWithOpenGLTextureHandleNew(
context.Get(), //
&descriptor, //
handle //
),
AdoptTag::kAdopt);
}
uint64_t GetOpenGLHandle() const {
return gGlobalProcTable.ImpellerTextureGetOpenGLHandle(Get());
}
};
//------------------------------------------------------------------------------
/// @see ImpellerColorFilter
///
class ColorFilter final
: public Object<ImpellerColorFilter, ImpellerColorFilterTraits> {
public:
ColorFilter(ImpellerColorFilter filter, AdoptTag tag) : Object(filter, tag) {}
//----------------------------------------------------------------------------
/// @see ImpellerColorFilterCreateBlendNew
///
static ColorFilter Blend(const ImpellerColor& color, ImpellerBlendMode mode) {
return ColorFilter(
gGlobalProcTable.ImpellerColorFilterCreateBlendNew(&color, mode),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerColorFilterCreateColorMatrixNew
///
static ColorFilter Matrix(const ImpellerColorMatrix& color_matrix) {
return ColorFilter(
gGlobalProcTable.ImpellerColorFilterCreateColorMatrixNew(&color_matrix),
AdoptTag::kAdopt);
}
};
//------------------------------------------------------------------------------
/// @see ImpellerColorSource
///
class ColorSource final
: public Object<ImpellerColorSource, ImpellerColorSourceTraits> {
public:
ColorSource(ImpellerColorSource source, AdoptTag tag) : Object(source, tag) {}
//----------------------------------------------------------------------------
/// @see ImpellerColorSourceCreateConicalGradientNew
///
static ColorSource ConicalGradient(
const ImpellerPoint& start_center,
float start_radius,
const ImpellerPoint& end_center,
float end_radius,
uint32_t stop_count,
const ImpellerColor* colors,
const float* stops,
ImpellerTileMode tile_mode,
const ImpellerMatrix* transformation = nullptr) {
return ColorSource(
gGlobalProcTable.ImpellerColorSourceCreateConicalGradientNew(
&start_center, //
start_radius, //
&end_center, //
end_radius, //
stop_count, //
colors, //
stops, //
tile_mode, //
transformation //
),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerColorSourceCreateImageNew
///
static ColorSource Image(const Texture& image,
ImpellerTileMode horizontal_tile_mode,
ImpellerTileMode vertical_tile_mode,
ImpellerTextureSampling sampling,
const ImpellerMatrix* transformation = nullptr) {
return ColorSource(gGlobalProcTable.ImpellerColorSourceCreateImageNew(
image.Get(), //
horizontal_tile_mode, //
vertical_tile_mode, //
sampling, //
transformation //
),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerColorSourceCreateLinearGradientNew
///
static ColorSource LinearGradient(
const ImpellerPoint& start_point,
const ImpellerPoint& end_point,
uint32_t stop_count,
const ImpellerColor* colors,
const float* stops,
ImpellerTileMode tile_mode,
const ImpellerMatrix* transformation = nullptr) {
return ColorSource(
gGlobalProcTable.ImpellerColorSourceCreateLinearGradientNew(
&start_point,
&end_point, //
stop_count, //
colors, //
stops, //
tile_mode, //
transformation //
),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerColorSourceCreateRadialGradientNew
///
static ColorSource RadialGradient(
const ImpellerPoint& center,
float radius,
uint32_t stop_count,
const ImpellerColor* colors,
const float* stops,
ImpellerTileMode tile_mode,
const ImpellerMatrix* transformation = nullptr) {
return ColorSource(
gGlobalProcTable.ImpellerColorSourceCreateRadialGradientNew(
&center, //
radius, //
stop_count, //
colors, //
stops, //
tile_mode, //
transformation //
),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerColorSourceCreateSweepGradientNew
///
static ColorSource SweepGradient(
const ImpellerPoint& center,
float start,
float end,
uint32_t stop_count,
const ImpellerColor* colors,
const float* stops,
ImpellerTileMode tile_mode,
const ImpellerMatrix* transformation = nullptr) {
return ColorSource(
gGlobalProcTable.ImpellerColorSourceCreateSweepGradientNew(
&center, //
start, //
end, //
stop_count, //
colors, //
stops, //
tile_mode, //
transformation //
),
AdoptTag::kAdopt);
}
};
//------------------------------------------------------------------------------
/// @see ImpellerImageFilter
///
class ImageFilter final
: public Object<ImpellerImageFilter, ImpellerImageFilterTraits> {
public:
ImageFilter(ImpellerImageFilter filter, AdoptTag tag) : Object(filter, tag) {}
//----------------------------------------------------------------------------
/// @see ImpellerImageFilterCreateBlurNew
///
static ImageFilter Blur(float x_sigma,
float y_sigma,
ImpellerTileMode tile_mode) {
return ImageFilter(gGlobalProcTable.ImpellerImageFilterCreateBlurNew(
x_sigma, y_sigma, tile_mode),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerImageFilterCreateComposeNew
///
static ImageFilter Compose(const ImageFilter& outer,
const ImageFilter& inner) {
return ImageFilter(gGlobalProcTable.ImpellerImageFilterCreateComposeNew(
outer.Get(), inner.Get()),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerImageFilterCreateDilateNew
///
static ImageFilter Dilate(float x_radius, float y_radius) {
return ImageFilter(
gGlobalProcTable.ImpellerImageFilterCreateDilateNew(x_radius, y_radius),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerImageFilterCreateErodeNew
///
static ImageFilter Erode(float x_radius, float y_radius) {
return ImageFilter(
gGlobalProcTable.ImpellerImageFilterCreateErodeNew(x_radius, y_radius),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerImageFilterCreateMatrixNew
///
static ImageFilter Matrix(const ImpellerMatrix& matrix,
ImpellerTextureSampling sampling) {
return ImageFilter(
gGlobalProcTable.ImpellerImageFilterCreateMatrixNew(&matrix, sampling),
AdoptTag::kAdopt);
}
};
//------------------------------------------------------------------------------
/// @see ImpellerMaskFilter
///
class MaskFilter final
: public Object<ImpellerMaskFilter, ImpellerMaskFilterTraits> {
public:
MaskFilter(ImpellerMaskFilter filter, AdoptTag tag) : Object(filter, tag) {}
//----------------------------------------------------------------------------
/// @see ImpellerMaskFilterCreateBlurNew
///
static MaskFilter Blur(ImpellerBlurStyle style, float sigma) {
return MaskFilter(
gGlobalProcTable.ImpellerMaskFilterCreateBlurNew(style, sigma),
AdoptTag::kAdopt);
}
};
//------------------------------------------------------------------------------
/// @see ImpellerParagraph
///
class Paragraph final
: public Object<ImpellerParagraph, ImpellerParagraphTraits> {
public:
Paragraph(ImpellerParagraph paragraph, AdoptTag tag)
: Object(paragraph, AdoptTag::kAdopt) {}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphGetAlphabeticBaseline
///
float GetAlphabeticBaseline() {
return gGlobalProcTable.ImpellerParagraphGetAlphabeticBaseline(Get());
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphGetHeight
///
float GetHeight() {
return gGlobalProcTable.ImpellerParagraphGetHeight(Get());
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphGetIdeographicBaseline
///
float GetIdeographicBaseline() {
return gGlobalProcTable.ImpellerParagraphGetIdeographicBaseline(Get());
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphGetLineCount
///
uint32_t GetLineCount() {
return gGlobalProcTable.ImpellerParagraphGetLineCount(Get());
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphGetLongestLineWidth
///
float GetLongestLineWidth() {
return gGlobalProcTable.ImpellerParagraphGetLongestLineWidth(Get());
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphGetMaxIntrinsicWidth
///
float GetMaxIntrinsicWidth() {
return gGlobalProcTable.ImpellerParagraphGetMaxIntrinsicWidth(Get());
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphGetMaxWidth
///
float GetMaxWidth() {
return gGlobalProcTable.ImpellerParagraphGetMaxWidth(Get());
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphGetMinIntrinsicWidth
///
float GetMinIntrinsicWidth() {
return gGlobalProcTable.ImpellerParagraphGetMinIntrinsicWidth(Get());
}
};
//------------------------------------------------------------------------------
/// @see ImpellerPaint
///
class Paint final : public Object<ImpellerPaint, ImpellerPaintTraits> {
public:
Paint() : Object(gGlobalProcTable.ImpellerPaintNew(), AdoptTag::kAdopt) {}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetColor
///
Paint& SetColor(const ImpellerColor& color) {
gGlobalProcTable.ImpellerPaintSetColor(Get(), &color);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetBlendMode
///
Paint& SetBlendMode(ImpellerBlendMode mode) {
gGlobalProcTable.ImpellerPaintSetBlendMode(Get(), mode);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetDrawStyle
///
Paint& SetDrawStyle(ImpellerDrawStyle style) {
gGlobalProcTable.ImpellerPaintSetDrawStyle(Get(), style);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetStrokeCap
///
Paint& SetStrokeCap(ImpellerStrokeCap cap) {
gGlobalProcTable.ImpellerPaintSetStrokeCap(Get(), cap);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetStrokeJoin
///
Paint& SetStrokeJoin(ImpellerStrokeJoin join) {
gGlobalProcTable.ImpellerPaintSetStrokeJoin(Get(), join);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetStrokeWidth
///
Paint& SetStrokeWidth(float width) {
gGlobalProcTable.ImpellerPaintSetStrokeWidth(Get(), width);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetStrokeMiter
///
Paint& SetStrokeMiter(float miter) {
gGlobalProcTable.ImpellerPaintSetStrokeMiter(Get(), miter);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetColorFilter
///
Paint& SetColorFilter(const ColorFilter& filter) {
gGlobalProcTable.ImpellerPaintSetColorFilter(Get(), filter.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetColorSource
///
Paint& SetColorSource(const ColorSource& source) {
gGlobalProcTable.ImpellerPaintSetColorSource(Get(), source.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetImageFilter
///
Paint& SetImageFilter(const ImageFilter& filter) {
gGlobalProcTable.ImpellerPaintSetImageFilter(Get(), filter.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPaintSetMaskFilter
///
Paint& SetMaskFilter(const MaskFilter& filter) {
gGlobalProcTable.ImpellerPaintSetMaskFilter(Get(), filter.Get());
return *this;
}
};
//------------------------------------------------------------------------------
/// @see ImpellerParagraphStyle
///
class ParagraphStyle final
: public Object<ImpellerParagraphStyle, ImpellerParagraphStyleTraits> {
public:
ParagraphStyle()
: Object(gGlobalProcTable.ImpellerParagraphStyleNew(), AdoptTag::kAdopt) {
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetBackground
///
ParagraphStyle& SetBackground(const Paint& paint) {
gGlobalProcTable.ImpellerParagraphStyleSetBackground(Get(), paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetFontFamily
///
ParagraphStyle& SetFontFamily(const char* family_name) {
gGlobalProcTable.ImpellerParagraphStyleSetFontFamily(Get(), family_name);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetFontSize
///
ParagraphStyle& SetFontSize(float size) {
gGlobalProcTable.ImpellerParagraphStyleSetFontSize(Get(), size);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetFontStyle
///
ParagraphStyle& SetFontStyle(ImpellerFontStyle style) {
gGlobalProcTable.ImpellerParagraphStyleSetFontStyle(Get(), style);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetFontWeight
///
ParagraphStyle& SetFontWeight(ImpellerFontWeight weight) {
gGlobalProcTable.ImpellerParagraphStyleSetFontWeight(Get(), weight);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetForeground
///
ParagraphStyle& SetForeground(const Paint& paint) {
gGlobalProcTable.ImpellerParagraphStyleSetForeground(Get(), paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetHeight
///
ParagraphStyle& SetHeight(float height) {
gGlobalProcTable.ImpellerParagraphStyleSetHeight(Get(), height);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetLocale
///
ParagraphStyle& SetLocale(const char* locale) {
gGlobalProcTable.ImpellerParagraphStyleSetLocale(Get(), locale);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetMaxLines
///
ParagraphStyle& SetMaxLines(uint32_t max_lines) {
gGlobalProcTable.ImpellerParagraphStyleSetMaxLines(Get(), max_lines);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetTextAlignment
///
ParagraphStyle& SetTextAlignment(ImpellerTextAlignment align) {
gGlobalProcTable.ImpellerParagraphStyleSetTextAlignment(Get(), align);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphStyleSetTextDirection
///
ParagraphStyle& SetTextDirection(ImpellerTextDirection direction) {
gGlobalProcTable.ImpellerParagraphStyleSetTextDirection(Get(), direction);
return *this;
}
};
//------------------------------------------------------------------------------
/// @see ImpellerTypographyContext
///
class TypographyContext final : public Object<ImpellerTypographyContext,
ImpellerTypographyContextTraits> {
public:
TypographyContext()
: Object(gGlobalProcTable.ImpellerTypographyContextNew(),
AdoptTag::kAdopt) {}
//----------------------------------------------------------------------------
/// @see ImpellerTypographyContextRegisterFont
///
bool RegisterFont(std::unique_ptr<Mapping> mapping,
const char* optional_family_name_alias = nullptr) {
if (!mapping) {
return false;
}
ImpellerMapping c_mapping = {};
c_mapping.data = mapping->GetMapping();
c_mapping.length = mapping->GetSize();
c_mapping.on_release = [](void* user_data) {
delete reinterpret_cast<Mapping*>(user_data);
};
return gGlobalProcTable.ImpellerTypographyContextRegisterFont(
Get(), //
&c_mapping, //
mapping.release(), //
optional_family_name_alias //
);
}
};
//------------------------------------------------------------------------------
/// @see ImpellerParagraphBuilder
///
class ParagraphBuilder final
: public Object<ImpellerParagraphBuilder, ImpellerParagraphBuilderTraits> {
public:
explicit ParagraphBuilder(const TypographyContext& context)
: Object(gGlobalProcTable.ImpellerParagraphBuilderNew(context.Get()),
AdoptTag::kAdopt) {}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphBuilderBuildParagraphNew
///
Paragraph Build(float width) {
return Paragraph(
gGlobalProcTable.ImpellerParagraphBuilderBuildParagraphNew(Get(), //
width //
),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphBuilderPushStyle
///
ParagraphBuilder& PushStyle(const ParagraphStyle& style) {
gGlobalProcTable.ImpellerParagraphBuilderPushStyle(Get(), style.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphBuilderPopStyle
///
ParagraphBuilder& PopStyle() {
gGlobalProcTable.ImpellerParagraphBuilderPopStyle(Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphBuilderAddText
///
ParagraphBuilder& AddText(const uint8_t* utf8_data, uint32_t length) {
gGlobalProcTable.ImpellerParagraphBuilderAddText(Get(), utf8_data, length);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphBuilderAddText
///
ParagraphBuilder& AddText(const std::string& string) {
return AddText(reinterpret_cast<const uint8_t*>(string.data()),
string.size());
}
//----------------------------------------------------------------------------
/// @see ImpellerParagraphBuilderAddText
///
ParagraphBuilder& AddText(const std::string_view& string) {
return AddText(reinterpret_cast<const uint8_t*>(string.data()),
string.size());
}
};
//------------------------------------------------------------------------------
/// @see ImpellerPath
///
class Path final : public Object<ImpellerPath, ImpellerPathTraits> {
public:
Path(ImpellerPath path, AdoptTag tag) : Object(path, tag) {}
};
//------------------------------------------------------------------------------
/// @see ImpellerPathBuilder
///
class PathBuilder final
: public Object<ImpellerPathBuilder, ImpellerPathBuilderTraits> {
public:
PathBuilder()
: Object(gGlobalProcTable.ImpellerPathBuilderNew(), AdoptTag::kAdopt) {}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderCopyPathNew
///
Path BuildCopy(ImpellerFillType fill =
ImpellerFillType::kImpellerFillTypeNonZero) const {
return Path(gGlobalProcTable.ImpellerPathBuilderCopyPathNew(Get(), fill),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderTakePathNew
///
Path Build(
ImpellerFillType fill = ImpellerFillType::kImpellerFillTypeNonZero) {
return Path(gGlobalProcTable.ImpellerPathBuilderTakePathNew(Get(), fill),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderAddArc
///
PathBuilder& AddArc(const ImpellerRect& oval_bounds,
float start_angle_degrees,
float end_angle_degrees) {
gGlobalProcTable.ImpellerPathBuilderAddArc(Get(), //
&oval_bounds, //
start_angle_degrees, //
end_angle_degrees //
);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderAddOval
///
PathBuilder& AddOval(const ImpellerRect& oval_bounds) {
gGlobalProcTable.ImpellerPathBuilderAddOval(Get(), &oval_bounds);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderAddRect
///
PathBuilder& AddRect(const ImpellerRect& rect) {
gGlobalProcTable.ImpellerPathBuilderAddRect(Get(), &rect);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderAddRoundedRect
///
PathBuilder& AddRoundedRect(const ImpellerRect& rect,
const ImpellerRoundingRadii& rounding_radii) {
gGlobalProcTable.ImpellerPathBuilderAddRoundedRect(Get(), &rect,
&rounding_radii);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderClose
///
PathBuilder& Close() {
gGlobalProcTable.ImpellerPathBuilderClose(Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderCubicCurveTo
///
PathBuilder& CubicCurveTo(const ImpellerPoint& control_point_1,
const ImpellerPoint& control_point_2,
const ImpellerPoint& end_point) {
gGlobalProcTable.ImpellerPathBuilderCubicCurveTo(
Get(), &control_point_1, &control_point_2, &end_point);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderLineTo
///
PathBuilder& LineTo(const ImpellerPoint& location) {
gGlobalProcTable.ImpellerPathBuilderLineTo(Get(), &location);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderMoveTo
///
PathBuilder& MoveTo(const ImpellerPoint& location) {
gGlobalProcTable.ImpellerPathBuilderMoveTo(Get(), &location);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerPathBuilderQuadraticCurveTo
///
PathBuilder& QuadraticCurveTo(const ImpellerPoint& control_point,
const ImpellerPoint& end_point) {
gGlobalProcTable.ImpellerPathBuilderQuadraticCurveTo(Get(), &control_point,
&end_point);
return *this;
}
};
//------------------------------------------------------------------------------
/// @see ImpellerDisplayList
///
class DisplayList final
: public Object<ImpellerDisplayList, ImpellerDisplayListTraits> {
public:
DisplayList(ImpellerDisplayList display_list, AdoptTag tag)
: Object(display_list, tag) {}
};
//------------------------------------------------------------------------------
/// @see ImpellerSurface
///
class Surface final : public Object<ImpellerSurface, ImpellerSurfaceTraits> {
public:
explicit Surface(ImpellerSurface surface) : Object(surface) {}
Surface(ImpellerSurface surface, AdoptTag tag) : Object(surface, tag) {}
//----------------------------------------------------------------------------
/// @see ImpellerSurfaceCreateWrappedFBONew
///
static Surface WrapFBO(const Context& context,
uint64_t fbo,
ImpellerPixelFormat format,
const ImpellerISize& size) {
return Surface(
gGlobalProcTable.ImpellerSurfaceCreateWrappedFBONew(context.Get(), //
fbo, //
format, //
&size //
),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerSurfaceDrawDisplayList
///
bool Draw(const DisplayList& display_list) {
return gGlobalProcTable.ImpellerSurfaceDrawDisplayList(Get(),
display_list.Get());
}
};
//------------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilder
///
class DisplayListBuilder final
: public Object<ImpellerDisplayListBuilder,
ImpellerDisplayListBuilderTraits> {
public:
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderNew
///
explicit DisplayListBuilder(const ImpellerRect* cull_rect = nullptr)
: Object(gGlobalProcTable.ImpellerDisplayListBuilderNew(cull_rect),
AdoptTag::kAdopt) {}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderCreateDisplayListNew
///
DisplayList Build() {
return DisplayList(
gGlobalProcTable.ImpellerDisplayListBuilderCreateDisplayListNew(Get()),
AdoptTag::kAdopt);
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderClipOval
///
DisplayListBuilder& ClipOval(const ImpellerRect& oval_bounds,
ImpellerClipOperation op) {
gGlobalProcTable.ImpellerDisplayListBuilderClipOval(Get(), //
&oval_bounds, //
op);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderClipPath
///
DisplayListBuilder& ClipPath(const Path& path, ImpellerClipOperation op) {
gGlobalProcTable.ImpellerDisplayListBuilderClipPath(Get(), //
path.Get(), //
op);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderClipRect
///
DisplayListBuilder& ClipRect(const ImpellerRect& rect,
ImpellerClipOperation op) {
gGlobalProcTable.ImpellerDisplayListBuilderClipRect(Get(), //
&rect, //
op);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderClipRoundedRect
///
DisplayListBuilder& ClipRoundedRect(const ImpellerRect& rect,
const ImpellerRoundingRadii& radii,
ImpellerClipOperation op) {
gGlobalProcTable.ImpellerDisplayListBuilderClipRoundedRect(Get(), //
&rect, //
&radii, //
op //
);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawDashedLine
///
DisplayListBuilder& DrawDashedLine(const ImpellerPoint& from,
const ImpellerPoint& to,
float on_length,
float off_length,
const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawDashedLine(Get(), //
&from, //
&to, //
on_length, //
off_length, //
paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawDisplayList
///
DisplayListBuilder& DrawDisplayList(const DisplayList& display_list,
float opacity = 1.0f) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawDisplayList(
Get(), display_list.Get(), opacity);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawLine
///
DisplayListBuilder& DrawLine(const ImpellerPoint& from,
const ImpellerPoint& to,
const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawLine(Get(), //
&from, //
&to, //
paint.Get() //
);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawOval
///
DisplayListBuilder& DrawOval(const ImpellerRect& oval_bounds,
const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawOval(Get(), //
&oval_bounds, //
paint.Get() //
);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawPaint
///
DisplayListBuilder& DrawPaint(const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawPaint(Get(), paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawParagraph
///
DisplayListBuilder& DrawParagraph(const Paragraph& paragraph,
const ImpellerPoint& point) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawParagraph(
Get(), paragraph.Get(), &point);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawPath
///
DisplayListBuilder& DrawPath(const Path& path, const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawPath(Get(), path.Get(),
paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawRect
///
DisplayListBuilder& DrawRect(const ImpellerRect& rect, const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawRect(Get(), &rect,
paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawRoundedRect
///
DisplayListBuilder& DrawRoundedRect(const ImpellerRect& rect,
const ImpellerRoundingRadii& radii,
const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawRoundedRect(Get(), //
&rect, //
&radii, //
paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawRoundedRectDifference
///
DisplayListBuilder& DrawRoundedRectDifference(
const ImpellerRect& outer_rect,
const ImpellerRoundingRadii& outer_radii,
const ImpellerRect& inner_rect,
const ImpellerRoundingRadii& inner_radii,
const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawRoundedRectDifference(
Get(), //
&outer_rect, //
&outer_radii, //
&inner_rect, //
&inner_radii, //
paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawTexture
///
DisplayListBuilder& DrawTexture(const Texture& texture,
const ImpellerPoint& point,
ImpellerTextureSampling sampling,
const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawTexture(
Get(), texture.Get(), &point, sampling, paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderDrawTextureRect
///
DisplayListBuilder& DrawTextureRect(const Texture& texture,
const ImpellerRect& src_rect,
const ImpellerRect& dst_rect,
ImpellerTextureSampling sampling,
const Paint& paint) {
gGlobalProcTable.ImpellerDisplayListBuilderDrawTextureRect(
Get(), texture.Get(), //
&src_rect, //
&dst_rect, //
sampling, //
paint.Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderGetSaveCount
///
uint32_t GetSaveCount() {
return gGlobalProcTable.ImpellerDisplayListBuilderGetSaveCount(Get());
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderGetTransform
///
ImpellerMatrix GetTransform() {
ImpellerMatrix result;
gGlobalProcTable.ImpellerDisplayListBuilderGetTransform(Get(), &result);
return result;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderResetTransform
///
DisplayListBuilder& ResetTransform() {
gGlobalProcTable.ImpellerDisplayListBuilderResetTransform(Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderRestore
///
DisplayListBuilder& Restore() {
gGlobalProcTable.ImpellerDisplayListBuilderRestore(Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderRestoreToCount
///
DisplayListBuilder& RestoreToCount(uint32_t count) {
gGlobalProcTable.ImpellerDisplayListBuilderRestoreToCount(Get(), //
count);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderRotate
///
DisplayListBuilder& Rotate(float angle_degrees) {
gGlobalProcTable.ImpellerDisplayListBuilderRotate(Get(), //
angle_degrees);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderSave
///
DisplayListBuilder& Save() {
gGlobalProcTable.ImpellerDisplayListBuilderSave(Get());
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderSaveLayer
///
DisplayListBuilder& SaveLayer(const ImpellerRect& bounds,
const Paint* paint = nullptr,
const ImageFilter* backdrop = nullptr) {
gGlobalProcTable.ImpellerDisplayListBuilderSaveLayer(
Get(), //
&bounds, //
paint ? paint->Get() : NULL, //
backdrop ? backdrop->Get() : NULL //
);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderScale
///
DisplayListBuilder& Scale(float x_scale, float y_scale) {
gGlobalProcTable.ImpellerDisplayListBuilderScale(Get(), //
x_scale, //
y_scale);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderSetTransform
///
DisplayListBuilder& SetTransform(const ImpellerMatrix& transform) {
gGlobalProcTable.ImpellerDisplayListBuilderSetTransform(Get(), &transform);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderTransform
///
DisplayListBuilder& Transform(const ImpellerMatrix& transform) {
gGlobalProcTable.ImpellerDisplayListBuilderTransform(Get(), &transform);
return *this;
}
//----------------------------------------------------------------------------
/// @see ImpellerDisplayListBuilderTranslate
///
DisplayListBuilder& Translate(float x_translation, float y_translation) {
gGlobalProcTable.ImpellerDisplayListBuilderTranslate(Get(), //
x_translation, //
y_translation //
);
return *this;
}
};
} // namespace IMPELLER_HPP_NAMESPACE
#endif // FLUTTER_IMPELLER_TOOLKIT_INTEROP_IMPELLER_HPP_