From c33ef86b1d1c733b21e4ba738c27f66cfc8198ef Mon Sep 17 00:00:00 2001 From: DarkWyrm Date: Fri, 17 Sep 2004 10:21:41 +0000 Subject: [PATCH] Made some tweaks for region, shape, and polygon support git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8990 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/View.cpp | 89 ++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 26 deletions(-) diff --git a/src/kits/interface/View.cpp b/src/kits/interface/View.cpp index b0d778d1fa..b99cb176eb 100644 --- a/src/kits/interface/View.cpp +++ b/src/kits/interface/View.cpp @@ -83,6 +83,8 @@ # define BVTRACE ; #endif +#define MAX_ATTACHMENT_SIZE 49152 + inline rgb_color _get_rgb_color( uint32 color ); inline uint32 _get_uint32_color( rgb_color c ); inline rgb_color _set_static_rgb_color( uint8 r, uint8 g, uint8 b, uint8 a=255 ); @@ -2508,11 +2510,18 @@ void BView::StrokePolygon(const BPoint* ptArray, int32 numPts, BRect bounds, BPolygon pol(ptArray,numPts); pol.MapTo(pol.Frame(),bounds); - owner->fLink->StartMessage( AS_STROKE_POLYGON ); - owner->fLink->Attach(pol.Frame()); - owner->fLink->Attach( closed ); - owner->fLink->Attach( pol.fCount ); - owner->fLink->Attach(pol.fPts,pol.fCount * sizeof(BPoint) ); + if(pol.fCount * sizeof(BPoint) < MAX_ATTACHMENT_SIZE) + { + owner->fLink->StartMessage( AS_STROKE_POLYGON ); + owner->fLink->Attach(pol.Frame()); + owner->fLink->Attach( closed ); + owner->fLink->Attach( pol.fCount ); + owner->fLink->Attach(pol.fPts,pol.fCount * sizeof(BPoint) ); + } + else + { + // TODO: send via an area + } } } @@ -2533,9 +2542,16 @@ void BView::FillPolygon(const BPolygon* aPolygon,pattern p) if ( _is_new_pattern( fState->patt, p ) ) SetPattern( p ); - owner->fLink->StartMessage( AS_FILL_POLYGON ); - owner->fLink->Attach( aPolygon->fCount ); - owner->fLink->Attach(aPolygon->fPts,aPolygon->fCount * sizeof(BPoint) ); + if(aPolygon->fCount * sizeof(BPoint) < MAX_ATTACHMENT_SIZE) + { + owner->fLink->StartMessage( AS_FILL_POLYGON ); + owner->fLink->Attach( aPolygon->fCount ); + owner->fLink->Attach(aPolygon->fPts,aPolygon->fCount * sizeof(BPoint) ); + } + else + { + // TODO: send via an area + } } } @@ -2648,11 +2664,18 @@ void BView::FillRegion(BRegion* a_region, pattern p) int32 rectsNo = a_region->CountRects(); - owner->fLink->StartMessage( AS_FILL_REGION ); - owner->fLink->Attach( rectsNo ); - - for (int32 i = 0; ifLink->Attach( a_region->RectAt(i) ); + if(rectsNo*sizeof(BRect) < MAX_ATTACHMENT_SIZE) + { + owner->fLink->StartMessage( AS_FILL_REGION ); + owner->fLink->Attach( rectsNo ); + + for (int32 i = 0; ifLink->Attach( a_region->RectAt(i) ); + } + else + { + // TODO: send via area + } } } @@ -2820,13 +2843,20 @@ void BView::StrokeShape(BShape* shape, pattern p) if ( _is_new_pattern( fState->patt, p ) ) SetPattern( p ); - - owner->fLink->StartMessage( AS_STROKE_SHAPE ); - owner->fLink->Attach( shape->Bounds() ); - owner->fLink->Attach( sd->opCount ); - owner->fLink->Attach( sd->ptCount ); - owner->fLink->Attach( sd->opList, sd->opCount ); - owner->fLink->Attach( sd->ptList, sd->ptCount ); + + if( (sd->opCount*sizeof(uint32))+(sd->ptCount*sizeof(BPoint)) < MAX_ATTACHMENT_SIZE ) + { + owner->fLink->StartMessage( AS_STROKE_SHAPE ); + owner->fLink->Attach( shape->Bounds() ); + owner->fLink->Attach( sd->opCount ); + owner->fLink->Attach( sd->ptCount ); + owner->fLink->Attach( sd->opList, sd->opCount ); + owner->fLink->Attach( sd->ptList, sd->ptCount ); + } + else + { + // TODO: send via an area + } } } @@ -2848,12 +2878,19 @@ void BView::FillShape(BShape* shape, pattern p) if ( _is_new_pattern( fState->patt, p ) ) SetPattern( p ); - owner->fLink->StartMessage( AS_FILL_SHAPE ); - owner->fLink->Attach( shape->Bounds() ); - owner->fLink->Attach( sd->opCount ); - owner->fLink->Attach( sd->ptCount ); - owner->fLink->Attach( sd->opList, sd->opCount ); - owner->fLink->Attach( sd->ptList, sd->ptCount ); + if( (sd->opCount*sizeof(uint32))+(sd->ptCount*sizeof(BPoint)) < MAX_ATTACHMENT_SIZE ) + { + owner->fLink->StartMessage( AS_FILL_SHAPE ); + owner->fLink->Attach( shape->Bounds() ); + owner->fLink->Attach( sd->opCount ); + owner->fLink->Attach( sd->ptCount ); + owner->fLink->Attach( sd->opList, sd->opCount ); + owner->fLink->Attach( sd->ptList, sd->ptCount ); + } + else + { + // TODO: send via an area + } } }