BPicture: fix clipping region storage
Part of #1133. Change-Id: I0d727056dd7302f5a320987b83a27c9571e9684f Reviewed-on: https://review.haiku-os.org/c/haiku/+/9609 Tested-by: Commit checker robot <[email protected]> Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
#include <InterfaceDefs.h>
|
#include <InterfaceDefs.h>
|
||||||
#include <Point.h>
|
#include <Point.h>
|
||||||
#include <Rect.h>
|
#include <Rect.h>
|
||||||
|
#include <Region.h>
|
||||||
|
|
||||||
|
|
||||||
class BAffineTransform;
|
class BAffineTransform;
|
||||||
@@ -52,7 +53,7 @@ struct picture_player_callbacks {
|
|||||||
const void* data, size_t length);
|
const void* data, size_t length);
|
||||||
void (*draw_picture)(void* userData, const BPoint& where, int32 token);
|
void (*draw_picture)(void* userData, const BPoint& where, int32 token);
|
||||||
void (*set_clipping_rects)(void* userData, size_t numRects,
|
void (*set_clipping_rects)(void* userData, size_t numRects,
|
||||||
const BRect rects[]);
|
const clipping_rect rects[]);
|
||||||
void (*clip_to_picture)(void* userData, int32 token,
|
void (*clip_to_picture)(void* userData, int32 token,
|
||||||
const BPoint& where, bool clipToInverse);
|
const BPoint& where, bool clipToInverse);
|
||||||
void (*push_state)(void* userData);
|
void (*push_state)(void* userData);
|
||||||
|
|||||||
@@ -301,18 +301,14 @@ PictureDataWriter::WriteClipToPicture(int32 pictureToken,
|
|||||||
status_t
|
status_t
|
||||||
PictureDataWriter::WriteSetClipping(const BRegion& region)
|
PictureDataWriter::WriteSetClipping(const BRegion& region)
|
||||||
{
|
{
|
||||||
// TODO: I don't know if it's compatible with R5's BPicture version
|
|
||||||
try {
|
try {
|
||||||
|
BeginOp(B_PIC_SET_CLIPPING_RECTS);
|
||||||
|
Write<clipping_rect>(region.FrameInt());
|
||||||
const int32 numRects = region.CountRects();
|
const int32 numRects = region.CountRects();
|
||||||
if (numRects > 0 && region.Frame().IsValid()) {
|
for (int32 i = 0; i < numRects; i++)
|
||||||
BeginOp(B_PIC_SET_CLIPPING_RECTS);
|
Write<clipping_rect>(region.RectAtInt(i));
|
||||||
Write<uint32>(numRects);
|
|
||||||
for (int32 i = 0; i < numRects; i++)
|
|
||||||
Write<BRect>(region.RectAt(i));
|
|
||||||
|
|
||||||
EndOp();
|
EndOp();
|
||||||
} else
|
|
||||||
WriteClearClipping();
|
|
||||||
} catch (status_t& status) {
|
} catch (status_t& status) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ draw_picture(void* _context, const BPoint& where, int32 token)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
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<adapter_context*>(_context);
|
adapter_context* context = reinterpret_cast<adapter_context*>(_context);
|
||||||
|
|
||||||
@@ -195,7 +195,10 @@ set_clipping_rects(void* _context, size_t numRects, const BRect _rects[])
|
|||||||
if (!rects.IsValid())
|
if (!rects.IsValid())
|
||||||
return;
|
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])(
|
((void (*)(void*, BRect*, uint32))context->function_table[20])(
|
||||||
context->user_data, rects, numRects);
|
context->user_data, rects, numRects);
|
||||||
@@ -1278,14 +1281,20 @@ PicturePlayer::_Play(const picture_player_callbacks& callbacks, void* userData,
|
|||||||
|
|
||||||
case B_PIC_SET_CLIPPING_RECTS:
|
case B_PIC_SET_CLIPPING_RECTS:
|
||||||
{
|
{
|
||||||
const uint32* numRects;
|
if (callbacks.set_clipping_rects == NULL)
|
||||||
const BRect* rects;
|
|
||||||
if (callbacks.set_clipping_rects == NULL
|
|
||||||
|| !reader.Get(numRects) || !reader.Get(rects, *numRects)) {
|
|
||||||
break;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ draw_picture(void* _state, const BPoint& where, int32 token)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
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);
|
TRACE_BB("%p cliping rects (%ld rects)\n", _state, numRects);
|
||||||
|
|
||||||
|
|||||||
@@ -599,7 +599,7 @@ draw_picture(void* _canvas, const BPoint& where, int32 token)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
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*>(_canvas);
|
Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user