PicturePlayer: Use C++ virtual interface instead of C function table

Also use C function table instead of `void*` table function casts.

Improve type safety and readability.

Change-Id: Ie5f544b5c2bb9f2333fe3353462325dbfb4453ec
Reviewed-on: https://review.haiku-os.org/c/haiku/+/9656
Reviewed-by: Adrien Destugues <[email protected]>
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
X512
2026-01-04 22:56:43 +00:00
committed by waddlesplash
parent ceaf2dd2d6
commit 2a4448e033
4 changed files with 1154 additions and 1263 deletions
+179 -74
View File
@@ -32,78 +32,184 @@ class Layer;
namespace BPrivate {
struct picture_player_callbacks {
void (*move_pen_by)(void* userData, const BPoint& where);
void (*stroke_line)(void* userData, const BPoint& start, const BPoint& end);
void (*draw_rect)(void* userData, const BRect& rect, bool fill);
void (*draw_round_rect)(void* userData, const BRect& rect,
const BPoint& radii, bool fill);
void (*draw_bezier)(void* userData, const BPoint controlPoints[4], bool fill);
void (*draw_arc)(void* userData, const BPoint& center, const BPoint& radii,
float startTheta, float arcTheta, bool fill);
void (*draw_ellipse)(void* userData, const BRect& rect, bool fill);
void (*draw_polygon)(void* userData, size_t numPoints,
const BPoint points[], bool isClosed, bool fill);
void (*draw_shape)(void* userData, const BShape& shape, bool fill);
void (*draw_string)(void* userData, const char* string, size_t length,
float spaceEscapement, float nonSpaceEscapement);
void (*draw_pixels)(void* userData, const BRect& source,
const BRect& destination, uint32 width, uint32 height,
size_t bytesPerRow, color_space pixelFormat, uint32 flags,
const void* data, size_t length);
void (*draw_picture)(void* userData, const BPoint& where, int32 token);
void (*set_clipping_rects)(void* userData, size_t numRects,
const clipping_rect rects[]);
void (*clip_to_picture)(void* userData, int32 token,
const BPoint& where, bool clipToInverse);
void (*push_state)(void* userData);
void (*pop_state)(void* userData);
void (*enter_state_change)(void* userData);
void (*exit_state_change)(void* userData);
void (*enter_font_state)(void* userData);
void (*exit_font_state)(void* userData);
void (*set_origin)(void* userData, const BPoint& origin);
void (*set_pen_location)(void* userData, const BPoint& location);
void (*set_drawing_mode)(void* userData, drawing_mode mode);
void (*set_line_mode)(void* userData, cap_mode capMode, join_mode joinMode,
struct picture_player_callbacks_compat {
/* 0 */ void (*nop)(void* user);
/* 1 */ void (*move_pen_by)(void* user, BPoint delta);
/* 2 */ void (*stroke_line)(void* user, BPoint start, BPoint end);
/* 3 */ void (*stroke_rect)(void* user, BRect rect);
/* 4 */ void (*fill_rect)(void* user, BRect rect);
/* 5 */ void (*stroke_round_rect)(void* user, BRect rect, BPoint radii);
/* 6 */ void (*fill_round_rect)(void* user, BRect rect, BPoint radii);
/* 7 */ void (*stroke_bezier)(void* user, BPoint* control);
/* 8 */ void (*fill_bezier)(void* user, BPoint* control);
/* 9 */ void (*stroke_arc)(void* user, BPoint center, BPoint radii, float startTheta,
float arcTheta);
/* 10 */ void (*fill_arc)(void* user, BPoint center, BPoint radii, float startTheta,
float arcTheta);
/* 11 */ void (*stroke_ellipse)(void* user, BPoint center, BPoint radii);
/* 12 */ void (*fill_ellipse)(void* user, BPoint center, BPoint radii);
/* 13 */ void (*stroke_polygon)(void* user, int32 numPoints, const BPoint* points,
bool isClosed);
/* 14 */ void (*fill_polygon)(void* user, int32 numPoints, const BPoint* points,
bool isClosed);
// Called "Reserved" in BeBook
/* 15 */ void (*stroke_shape)(void* user, const BShape *shape);
// Called "Reserved" in BeBook
/* 16 */ void (*fill_shape)(void* user, const BShape *shape);
/* 17 */ void (*draw_string)(void* user, const char* string, float deltax, float deltay);
/* 18 */ void (*draw_pixels)(void* user, BRect src, BRect dest, int32 width, int32 height,
int32 bytesPerRow, int32 pixelFormat, int32 flags, const void* data);
// Called "Reserved" in BeBook
/* 19 */ void (*draw_picture)(void* user, BPoint where, int32 token);
/* 20 */ void (*set_clipping_rects)(void* user, const BRect* rects, uint32 numRects);
// Called "Reserved" in BeBook
/* 21 */ void (*clip_to_picture)(void* user, int32 token, BPoint point,
bool clip_to_inverse_picture);
/* 22 */ void (*push_state)(void* user);
/* 23 */ void (*pop_state)(void* user);
/* 24 */ void (*enter_state_change)(void* user);
/* 25 */ void (*exit_state_change)(void* user);
/* 26 */ void (*enter_font_state)(void* user);
/* 27 */ void (*exit_font_state)(void* user);
/* 28 */ void (*set_origin)(void* user, BPoint pt);
/* 29 */ void (*set_pen_location)(void* user, BPoint pt);
/* 30 */ void (*set_drawing_mode)(void* user, drawing_mode mode);
/* 31 */ void (*set_line_mode)(void* user, cap_mode capMode, join_mode joinMode,
float miterLimit);
void (*set_pen_size)(void* userData, float size);
void (*set_fore_color)(void* userData, const rgb_color& color);
void (*set_back_color)(void* userData, const rgb_color& color);
void (*set_stipple_pattern)(void* userData, const pattern& patter);
void (*set_scale)(void* userData, float scale);
void (*set_font_family)(void* userData, const char* familyName,
size_t length);
void (*set_font_style)(void* userData, const char* styleName,
size_t length);
void (*set_font_spacing)(void* userData, uint8 spacing);
void (*set_font_size)(void* userData, float size);
void (*set_font_rotation)(void* userData, float rotation);
void (*set_font_encoding)(void* userData, uint8 encoding);
void (*set_font_flags)(void* userData, uint32 flags);
void (*set_font_shear)(void* userData, float shear);
void (*set_font_face)(void* userData, uint16 face);
void (*set_blending_mode)(void* userData, source_alpha alphaSourceMode,
alpha_function alphaFunctionMode);
void (*set_transform)(void* userData, const BAffineTransform& transform);
void (*translate_by)(void* userData, double x, double y);
void (*scale_by)(void* userData, double x, double y);
void (*rotate_by)(void* userData, double angleRadians);
void (*blend_layer)(void* userData, Layer* layer);
void (*clip_to_rect)(void* userData, const BRect& rect, bool inverse);
void (*clip_to_shape)(void* userData, int32 opCount, const uint32 opList[],
int32 ptCount, const BPoint ptList[], bool inverse);
void (*draw_string_locations)(void* userData, const char* string,
size_t length, const BPoint locations[], size_t locationCount);
void (*draw_rect_gradient)(void* userData, const BRect& rect, BGradient& gradient, bool fill);
void (*draw_round_rect_gradient)(void* userData, const BRect& rect, const BPoint& radii, BGradient& gradient, bool fill);
void (*draw_bezier_gradient)(void* userData, const BPoint controlPoints[4], BGradient& gradient, bool fill);
void (*draw_arc_gradient)(void* userData, const BPoint& center, const BPoint& radii, float startTheta, float arcTheta, BGradient& gradient, bool fill);
void (*draw_ellipse_gradient)(void* userData, const BRect& rect, BGradient& gradient, bool fill);
void (*draw_polygon_gradient)(void* userData, size_t numPoints, const BPoint points[], bool isClosed, BGradient& gradient, bool fill);
void (*draw_shape_gradient)(void* userData, const BShape& shape, BGradient& gradient, bool fill);
void (*set_fill_rule)(void* userData, int32 fillRule);
void (*stroke_line_gradient)(void* userData, const BPoint& start, const BPoint& end, const BGradient& gradient);
/* 32 */ void (*set_pen_size)(void* user, float size);
/* 33 */ void (*set_fore_color)(void* user, rgb_color color);
/* 34 */ void (*set_back_color)(void* user, rgb_color color);
/* 35 */ void (*set_stipple_pattern)(void* user, pattern p);
/* 36 */ void (*set_scale)(void* user, float scale);
/* 37 */ void (*set_font_family)(void* user, const char* family);
/* 38 */ void (*set_font_style)(void* user, const char* style);
/* 39 */ void (*set_font_spacing)(void* user, int32 spacing);
/* 40 */ void (*set_font_size)(void* user, float size);
/* 41 */ void (*set_font_rotate)(void* user, float rotation);
/* 42 */ void (*set_font_encoding)(void* user, int32 encoding);
/* 43 */ void (*set_font_flags)(void* user, int32 flags);
/* 44 */ void (*set_font_shear)(void* user, float shear);
// Called "Reserved" in BeBook
/* 45 */ void (*set_font_bpp)(void* user, int32 bpp);
/* 46 */ void (*set_font_face)(void* user, int32 flags);
// New in Haiku
/* 47 */ void (*set_blending_mode)(void* user, source_alpha alphaSrcMode,
alpha_function alphaFncMode);
/* 48 */ void (*set_transform)(void* user, const BAffineTransform& transform);
/* 49 */ void (*translate_by)(void* user, double x, double y);
/* 50 */ void (*scale_by)(void* user, double x, double y);
/* 51 */ void (*rotate_by)(void* user, double angleRadians);
// Broken when saved to file
/* 52 */ void (*blend_layer)(void* user, class Layer* layer);
/* 53 */ void (*clip_to_rect)(void* user, const BRect& rect, bool inverse);
// Why not BShape?
/* 54 */ void (*clip_to_shape)(void* user, int32 opCount, const uint32 opList[], int32 ptCount,
const BPoint ptList[], bool inverse);
/* 55 */ void (*draw_string_locations)(void* user, const char* string, const BPoint* locations,
size_t locationCount);
/* 56 */ void (*fill_rect_gradient)(void* user, BRect rect, const BGradient& gradient);
/* 57 */ void (*stroke_rect_gradient)(void* user, BRect rect, const BGradient& gradient);
/* 58 */ void (*fill_round_rect_gradient)(void* user, BRect rect, BPoint radii,
const BGradient& gradient);
/* 59 */ void (*stroke_round_rect_gradient)(void* user, BRect rect, BPoint radii,
const BGradient& gradient);
/* 60 */ void (*fill_bezier_gradient)(void* user, const BPoint* points,
const BGradient& gradient);
/* 61 */ void (*stroke_bezier_gradient)(void* user, const BPoint* points,
const BGradient& gradient);
/* 62 */ void (*fill_arc_gradient)(void* user, BPoint center, BPoint radii, float startTheta,
float arcTheta, const BGradient& gradient);
/* 63 */ void (*stroke_arc_gradient)(void* user, BPoint center, BPoint radii, float startTheta,
float arcTheta, const BGradient& gradient);
/* 64 */ void (*fill_ellipse_gradient)(void* user, BPoint center, BPoint radii,
const BGradient& gradient);
/* 65 */ void (*stroke_ellipse_gradient)(void* user, BPoint center, BPoint radii,
const BGradient& gradient);
/* 66 */ void (*fill_polygon_gradient)(void* user, int32 numPoints, const BPoint* points,
bool isClosed, const BGradient& gradient);
/* 67 */ void (*stroke_polygon_gradient)(void* user, int32 numPoints, const BPoint* points,
bool isClosed, const BGradient& gradient);
/* 68 */ void (*fill_shape_gradient)(void* user, BShape shape, const BGradient& gradient);
/* 69 */ void (*stroke_shape_gradient)(void* user, BShape shape, const BGradient& gradient);
/* 70 */ void (*set_fill_rule)(void* user, int32 fillRule);
/* 71 */ void (*stroke_line_gradient)(void* user, BPoint start, BPoint end,
const BGradient& gradient);
};
class PicturePlayerCallbacks {
public:
virtual void MovePenBy(const BPoint& where) {}
virtual void StrokeLine(const BPoint& start, const BPoint& end) {}
virtual void DrawRect(const BRect& rect, bool fill) {}
virtual void DrawRoundRect(const BRect& rect, const BPoint& radii, bool fill) {}
virtual void DrawBezier(const BPoint controlPoints[4], bool fill) {}
virtual void DrawArc(const BPoint& center, const BPoint& radii, float startTheta,
float arcTheta, bool fill) {}
virtual void DrawEllipse(const BRect& rect, bool fill) {}
virtual void DrawPolygon(size_t numPoints, const BPoint points[], bool isClosed, bool fill) {}
virtual void DrawShape(const BShape& shape, bool fill) {}
virtual void DrawString(const char* string, size_t length, float spaceEscapement,
float nonSpaceEscapement) {}
virtual void DrawPixels(const BRect& source, const BRect& destination, uint32 width,
uint32 height, size_t bytesPerRow, color_space pixelFormat, uint32 flags, const void* data,
size_t length) {}
virtual void DrawPicture(const BPoint& where, int32 token) {}
virtual void SetClippingRects(size_t numRects, const clipping_rect rects[]) {}
virtual void ClipToPicture(int32 token, const BPoint& where, bool clipToInverse) {}
virtual void PushState() {}
virtual void PopState() {}
virtual void EnterStateChange() {}
virtual void ExitStateChange() {}
virtual void EnterFontState() {}
virtual void ExitFontState() {}
virtual void SetOrigin(const BPoint& origin) {}
virtual void SetPenLocation(const BPoint& location) {}
virtual void SetDrawingMode(drawing_mode mode) {}
virtual void SetLineMode(cap_mode capMode, join_mode joinMode, float miterLimit) {}
virtual void SetPenSize(float size) {}
virtual void SetForeColor(const rgb_color& color) {}
virtual void SetBackColor(const rgb_color& color) {}
virtual void SetStipplePattern(const pattern& patter) {}
virtual void SetScale(float scale) {}
virtual void SetFontFamily(const char* familyName, size_t length) {}
virtual void SetFontStyle(const char* styleName, size_t length) {}
virtual void SetFontSpacing(uint8 spacing) {}
virtual void SetFontSize(float size) {}
virtual void SetFontRotation(float rotation) {}
virtual void SetFontEncoding(uint8 encoding) {}
virtual void SetFontFlags(uint32 flags) {}
virtual void SetFontShear(float shear) {}
virtual void SetFontFace(uint16 face) {}
virtual void SetBlendingMode(source_alpha alphaSourceMode, alpha_function alphaFunctionMode) {}
virtual void SetTransform(const BAffineTransform& transform) {}
virtual void TranslateBy(double x, double y) {}
virtual void ScaleBy(double x, double y) {}
virtual void RotateBy(double angleRadians) {}
virtual void BlendLayer(Layer* layer) {}
virtual void ClipToRect(const BRect& rect, bool inverse) {}
virtual void ClipToShape(int32 opCount, const uint32 opList[], int32 ptCount,
const BPoint ptList[], bool inverse) {}
virtual void DrawStringLocations(const char* string, size_t length, const BPoint locations[],
size_t locationCount) {}
virtual void DrawRectGradient(const BRect& rect, BGradient& gradient, bool fill) {}
virtual void DrawRoundRectGradient(const BRect& rect, const BPoint& radii, BGradient& gradient,
bool fill) {}
virtual void DrawBezierGradient(const BPoint controlPoints[4], BGradient& gradient, bool fill)
{}
virtual void DrawArcGradient(const BPoint& center, const BPoint& radii, float startTheta,
float arcTheta, BGradient& gradient, bool fill) {}
virtual void DrawEllipseGradient(const BRect& rect, BGradient& gradient, bool fill) {}
virtual void DrawPolygonGradient(size_t numPoints, const BPoint points[], bool isClosed,
BGradient& gradient, bool fill) {}
virtual void DrawShapeGradient(const BShape& shape, BGradient& gradient, bool fill) {}
virtual void SetFillRule(int32 fillRule) {}
virtual void StrokeLineGradient(const BPoint& start, const BPoint& end,
const BGradient& gradient) {}
};
@@ -115,11 +221,10 @@ public:
status_t Play(void** callbacks, int32 tableEntries,
void* userData);
status_t Play(const picture_player_callbacks& callbacks,
size_t callbacksSize, void* userData);
status_t Play(PicturePlayerCallbacks& callbacks);
private:
status_t _Play(const picture_player_callbacks& callbacks, void* userData,
status_t _Play(PicturePlayerCallbacks& callbacks,
const void* data, size_t length, uint16 parentOp);
const void* fData;