diff --git a/headers/private/interface/PicturePlayer.h b/headers/private/interface/PicturePlayer.h index 735e925035..f5c3033c22 100644 --- a/headers/private/interface/PicturePlayer.h +++ b/headers/private/interface/PicturePlayer.h @@ -18,6 +18,7 @@ #include #include #include +#include class BAffineTransform; @@ -52,7 +53,7 @@ struct picture_player_callbacks { 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 BRect rects[]); + const clipping_rect rects[]); void (*clip_to_picture)(void* userData, int32 token, const BPoint& where, bool clipToInverse); void (*push_state)(void* userData); diff --git a/src/kits/interface/PictureDataWriter.cpp b/src/kits/interface/PictureDataWriter.cpp index 73283f70d7..07109925d8 100644 --- a/src/kits/interface/PictureDataWriter.cpp +++ b/src/kits/interface/PictureDataWriter.cpp @@ -301,18 +301,14 @@ PictureDataWriter::WriteClipToPicture(int32 pictureToken, status_t PictureDataWriter::WriteSetClipping(const BRegion& region) { - // TODO: I don't know if it's compatible with R5's BPicture version try { + BeginOp(B_PIC_SET_CLIPPING_RECTS); + Write(region.FrameInt()); const int32 numRects = region.CountRects(); - if (numRects > 0 && region.Frame().IsValid()) { - BeginOp(B_PIC_SET_CLIPPING_RECTS); - Write(numRects); - for (int32 i = 0; i < numRects; i++) - Write(region.RectAt(i)); + for (int32 i = 0; i < numRects; i++) + Write(region.RectAtInt(i)); - EndOp(); - } else - WriteClearClipping(); + EndOp(); } catch (status_t& status) { return status; } diff --git a/src/kits/interface/PicturePlayer.cpp b/src/kits/interface/PicturePlayer.cpp index e1695ce303..d832d643de 100644 --- a/src/kits/interface/PicturePlayer.cpp +++ b/src/kits/interface/PicturePlayer.cpp @@ -186,7 +186,7 @@ draw_picture(void* _context, const BPoint& where, int32 token) static void -set_clipping_rects(void* _context, size_t numRects, const BRect _rects[]) +set_clipping_rects(void* _context, size_t numRects, const clipping_rect _rects[]) { adapter_context* context = reinterpret_cast(_context); @@ -195,7 +195,10 @@ set_clipping_rects(void* _context, size_t numRects, const BRect _rects[]) if (!rects.IsValid()) return; - memcpy((void*)rects, _rects, numRects * sizeof(BRect)); + for (size_t i = 0; i < numRects; i++) { + clipping_rect srcRect = _rects[i]; + rects[i] = BRect(srcRect.left, srcRect.top, srcRect.right, srcRect.bottom); + } ((void (*)(void*, BRect*, uint32))context->function_table[20])( context->user_data, rects, numRects); @@ -1278,14 +1281,20 @@ PicturePlayer::_Play(const picture_player_callbacks& callbacks, void* userData, case B_PIC_SET_CLIPPING_RECTS: { - const uint32* numRects; - const BRect* rects; - if (callbacks.set_clipping_rects == NULL - || !reader.Get(numRects) || !reader.Get(rects, *numRects)) { + if (callbacks.set_clipping_rects == NULL) break; - } - callbacks.set_clipping_rects(userData, *numRects, rects); + const clipping_rect* frame; + if (!reader.Get(frame)) + break; + + uint32 numRects = reader.Remaining() / sizeof(clipping_rect); + + const clipping_rect* rects; + if (!reader.Get(rects, numRects)) + break; + + callbacks.set_clipping_rects(userData, numRects, rects); break; } diff --git a/src/servers/app/PictureBoundingBoxPlayer.cpp b/src/servers/app/PictureBoundingBoxPlayer.cpp index aff4c72f8f..77d9c33fdb 100644 --- a/src/servers/app/PictureBoundingBoxPlayer.cpp +++ b/src/servers/app/PictureBoundingBoxPlayer.cpp @@ -447,7 +447,7 @@ draw_picture(void* _state, const BPoint& where, int32 token) static void -set_clipping_rects(void* _state, size_t numRects, const BRect rects[]) +set_clipping_rects(void* _state, size_t numRects, const clipping_rect rects[]) { TRACE_BB("%p cliping rects (%ld rects)\n", _state, numRects); diff --git a/src/servers/app/ServerPicture.cpp b/src/servers/app/ServerPicture.cpp index 4f65bd1e2d..b3813354b4 100644 --- a/src/servers/app/ServerPicture.cpp +++ b/src/servers/app/ServerPicture.cpp @@ -599,7 +599,7 @@ draw_picture(void* _canvas, const BPoint& where, int32 token) static void -set_clipping_rects(void* _canvas, size_t numRects, const BRect rects[]) +set_clipping_rects(void* _canvas, size_t numRects, const clipping_rect rects[]) { Canvas* const canvas = reinterpret_cast(_canvas);