Spaces:
Runtime error
Runtime error
enum class ShapeType { | |
Circle, | |
Ellipse, | |
Path, | |
Rect | |
}; | |
struct Circle { | |
float radius; | |
Vector2f center; | |
ptr<void> get_ptr() { | |
return ptr<void>(this); | |
} | |
}; | |
struct Ellipse { | |
Vector2f radius; | |
Vector2f center; | |
ptr<void> get_ptr() { | |
return ptr<void>(this); | |
} | |
}; | |
struct Path { | |
Path(ptr<int> num_control_points, | |
ptr<float> points, | |
ptr<float> thickness, | |
int num_base_points, | |
int num_points, | |
bool is_closed, | |
bool use_distance_approx) : | |
num_control_points(num_control_points.get()), | |
points(points.get()), | |
thickness(thickness.get()), | |
num_base_points(num_base_points), | |
num_points(num_points), | |
is_closed(is_closed), | |
use_distance_approx(use_distance_approx) {} | |
int *num_control_points; | |
float *points; | |
float *thickness; | |
int num_base_points; | |
int num_points; | |
bool is_closed; | |
bool use_distance_approx; | |
bool has_thickness() const { | |
return thickness != nullptr; | |
} | |
void copy_to(ptr<float> points, ptr<float> thickness) const; | |
ptr<void> get_ptr() { | |
return ptr<void>(this); | |
} | |
}; | |
struct Rect { | |
Vector2f p_min; | |
Vector2f p_max; | |
ptr<void> get_ptr() { | |
return ptr<void>(this); | |
} | |
}; | |
struct Shape { | |
Shape() {} | |
Shape(const ShapeType &type, | |
ptr<void> shape_ptr, | |
float stroke_width) | |
: type(type), ptr(shape_ptr.get()), stroke_width(stroke_width) {} | |
Circle as_circle() const { | |
return *(Circle*)ptr; | |
} | |
Ellipse as_ellipse() const { | |
return *(Ellipse*)ptr; | |
} | |
Path as_path() const { | |
return *(Path*)ptr; | |
} | |
Rect as_rect() const { | |
return *(Rect*)ptr; | |
} | |
ShapeType type; | |
void *ptr; | |
float stroke_width; | |
}; | |
struct ShapeGroup { | |
ShapeGroup() {} | |
ShapeGroup(ptr<int> shape_ids, | |
int num_shapes, | |
const ColorType &fill_color_type, | |
ptr<void> fill_color, | |
const ColorType &stroke_color_type, | |
ptr<void> stroke_color, | |
bool use_even_odd_rule, | |
ptr<float> shape_to_canvas) | |
: shape_ids(shape_ids.get()), | |
num_shapes(num_shapes), | |
fill_color_type(fill_color_type), | |
fill_color(fill_color.get()), | |
stroke_color_type(stroke_color_type), | |
stroke_color(stroke_color.get()), | |
use_even_odd_rule(use_even_odd_rule), | |
shape_to_canvas(shape_to_canvas.get()) { | |
canvas_to_shape = inverse(this->shape_to_canvas); | |
} | |
bool has_fill_color() const { | |
return fill_color != nullptr; | |
} | |
Constant fill_color_as_constant() const { | |
return *(Constant*)fill_color; | |
} | |
LinearGradient fill_color_as_linear_gradient() const { | |
return *(LinearGradient*)fill_color; | |
} | |
RadialGradient fill_color_as_radial_gradient() const { | |
return *(RadialGradient*)fill_color; | |
} | |
bool has_stroke_color() const { | |
return stroke_color != nullptr; | |
} | |
Constant stroke_color_as_constant() const { | |
return *(Constant*)stroke_color; | |
} | |
LinearGradient stroke_color_as_linear_gradient() const { | |
return *(LinearGradient*)stroke_color; | |
} | |
RadialGradient stroke_color_as_radial_gradient() const { | |
return *(RadialGradient*)stroke_color; | |
} | |
void copy_to(ptr<float> shape_to_canvas) const; | |
int *shape_ids; | |
int num_shapes; | |
ColorType fill_color_type; | |
void *fill_color; | |
ColorType stroke_color_type; | |
void *stroke_color; | |
bool use_even_odd_rule; | |
Matrix3x3f canvas_to_shape; | |
Matrix3x3f shape_to_canvas; | |
}; | |