Add handling for view specific data in graphics messages.

Add viewcolor to LayerData.
gcc 3 fixes


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3847 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
shadow303
2003-07-04 21:13:48 +00:00
parent ac3bb782a8
commit 92db32b4b1
4 changed files with 258 additions and 197 deletions
+2 -1
View File
@@ -23,6 +23,7 @@ public:
overlay=NULL; overlay=NULL;
highcolor.SetColor(0,0,0,255); highcolor.SetColor(0,0,0,255);
lowcolor.SetColor(255,255,255,255); lowcolor.SetColor(255,255,255,255);
viewcolor.SetColor(255,255,255,255);
font=fontserver->GetSystemPlain(); font=fontserver->GetSystemPlain();
scale=1.0; scale=1.0;
edelta.space=0; edelta.space=0;
@@ -44,7 +45,7 @@ public:
alpha_function blending_mode; alpha_function blending_mode;
ServerBitmap *background; ServerBitmap *background;
ServerBitmap *overlay; ServerBitmap *overlay;
RGBColor highcolor, lowcolor; RGBColor highcolor, lowcolor, viewcolor;
ServerFont *font; ServerFont *font;
float scale; float scale;
escapement_delta edelta; escapement_delta edelta;
+4 -2
View File
@@ -26,7 +26,7 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#include <stdio.h> #include <stdio.h>
#include <iostream.h> #include <iostream>
#include <Message.h> #include <Message.h>
#include <Region.h> #include <Region.h>
#include <Bitmap.h> #include <Bitmap.h>
@@ -879,7 +879,9 @@ void ScreenDriver::SetLayerData(LayerData *d, bool set_font_data)
if(!family) if(!family)
return; return;
font.SetFamilyAndStyle((font_family)family->Name(),style->Name()); font_family fontfamily;
strcpy(fontfamily,family->Name());
font.SetFamilyAndStyle(fontfamily,style->Name());
font.SetFlags(sf->Flags()); font.SetFlags(sf->Flags());
font.SetEncoding(sf->Encoding()); font.SetEncoding(sf->Encoding());
font.SetSize(sf->Size()); font.SetSize(sf->Size());
+249 -193
View File
@@ -55,6 +55,38 @@ TokenHandler win_token_handler;
//! Active winborder - used for tracking windows during moves, resizes, and tab slides //! Active winborder - used for tracking windows during moves, resizes, and tab slides
WinBorder *active_winborder=NULL; WinBorder *active_winborder=NULL;
template<class Type> Type
read_from_buffer(int8 **_buffer)
{
Type *typedBuffer = (Type *)(*_buffer);
Type value = *typedBuffer;
typedBuffer++;
*_buffer = (int8 *)(typedBuffer);
return value;
}
static int8 *read_pattern_from_buffer(int8 **_buffer)
{
int8 *pattern = *_buffer;
*_buffer += AS_PATTERN_SIZE;
return pattern;
}
template<class Type> void
write_to_buffer(int8 **_buffer, Type value)
{
Type *typedBuffer = (Type *)(*_buffer);
*typedBuffer = value;
typedBuffer++;
*_buffer = (int8 *)(typedBuffer);
}
/*! /*!
\brief Contructor \brief Contructor
@@ -597,142 +629,191 @@ printf("ServerWindow %s: Message Move_By unimplemented\n",_title->String());
*/ */
void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer) void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
{ {
int32 msgPos; Layer *layer;
LayerData *layerdata; LayerData *layerdata;
int32 code; int32 code;
int32 view_token;
uint32 sizeRemaining = (uint32)msgsize;
if ( !msgsize || !msgbuffer ) if ( !msgsize || !msgbuffer )
return; return;
msgPos = 0; // We need to decide whether coordinates are specified in view or root coordinates.
layerdata = _workspace->GetRoot()->GetLayerData(); // For now, we assume root level coordinates.
while (msgPos < msgsize) while (sizeRemaining > 2*sizeof(int32))
{ {
code = *((int32 *)(msgbuffer+msgPos)); code = read_from_buffer<int32>(&msgbuffer);
view_token = read_from_buffer<int32>(&msgbuffer);
layer = _workspace->GetRoot()->FindLayer(view_token);
if ( layer )
layerdata = layer->GetLayerData();
else
{
layerdata = NULL;
printf("ServerWindow %s received invalid view token %lx",_title->String(),view_token);
}
switch (code) switch (code)
{ {
case AS_SET_HIGH_COLOR: case AS_SET_HIGH_COLOR:
{ {
// TODO: Implement if ( sizeRemaining >= AS_SET_COLOR_MSG_SIZE )
{
uint8 r, g, b, a;
r = read_from_buffer<uint8>(&msgbuffer);
g = read_from_buffer<uint8>(&msgbuffer);
b = read_from_buffer<uint8>(&msgbuffer);
a = read_from_buffer<uint8>(&msgbuffer);
if ( layerdata )
layerdata->highcolor.SetColor(r,g,b,a);
sizeRemaining -= AS_SET_COLOR_MSG_SIZE;
}
else
{
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
sizeRemaining = 0;
}
break; break;
} }
case AS_SET_LOW_COLOR: case AS_SET_LOW_COLOR:
{ {
// TODO: Implement if ( sizeRemaining >= AS_SET_COLOR_MSG_SIZE )
{
uint8 r, g, b, a;
r = read_from_buffer<uint8>(&msgbuffer);
g = read_from_buffer<uint8>(&msgbuffer);
b = read_from_buffer<uint8>(&msgbuffer);
a = read_from_buffer<uint8>(&msgbuffer);
if ( layerdata )
layerdata->lowcolor.SetColor(r,g,b,a);
sizeRemaining -= AS_SET_COLOR_MSG_SIZE;
}
else
{
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
sizeRemaining = 0;
}
break; break;
} }
case AS_SET_VIEW_COLOR: case AS_SET_VIEW_COLOR:
{ {
// TODO: Implement if ( sizeRemaining >= AS_SET_COLOR_MSG_SIZE )
{
uint8 r, g, b, a;
r = read_from_buffer<uint8>(&msgbuffer);
g = read_from_buffer<uint8>(&msgbuffer);
b = read_from_buffer<uint8>(&msgbuffer);
a = read_from_buffer<uint8>(&msgbuffer);
if ( layerdata )
layerdata->viewcolor.SetColor(r,g,b,a);
sizeRemaining -= AS_SET_COLOR_MSG_SIZE;
}
else
{
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
sizeRemaining = 0;
}
break; break;
} }
case AS_STROKE_ARC: case AS_STROKE_ARC:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_STROKE_ARC_MSG_SIZE ) if ( sizeRemaining >= AS_STROKE_ARC_MSG_SIZE )
{ {
float left, top, right, bottom, angle, span; float left, top, right, bottom, angle, span;
msgPos+=4; int8 *pattern;
left = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float); left = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); top = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); right = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); bottom = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); angle = read_from_buffer<float>(&msgbuffer);
bottom = *((float *)&msgbuffer[msgPos]); span = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); pattern = read_pattern_from_buffer(&msgbuffer);
angle = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
span = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->StrokeArc(rect,angle,span,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->StrokeArc(rect,angle,span,layerdata,pattern);
sizeRemaining -= AS_STROKE_ARC_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
case AS_STROKE_BEZIER: case AS_STROKE_BEZIER:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_STROKE_BEZIER_MSG_SIZE ) if ( sizeRemaining >= AS_STROKE_BEZIER_MSG_SIZE )
{ {
BPoint *pts; BPoint *pts;
int8 *pattern;
int i; int i;
pts = new BPoint[4]; pts = new BPoint[4];
msgPos+=4;
for (i=0; i<4; i++) for (i=0; i<4; i++)
{ {
pts[i].x = *((float *)&msgbuffer[msgPos]); pts[i].x = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); pts[i].y = read_from_buffer<float>(&msgbuffer);
pts[i].y = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
} }
_app->_driver->StrokeBezier(pts,layerdata,&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
if ( layerdata )
_app->_driver->StrokeBezier(pts,layerdata,pattern);
delete[] pts; delete[] pts;
msgPos += AS_PATTERN_SIZE; sizeRemaining -= AS_STROKE_BEZIER_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
case AS_STROKE_ELLIPSE: case AS_STROKE_ELLIPSE:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_STROKE_ELLIPSE_MSG_SIZE ) if ( sizeRemaining >= AS_STROKE_ELLIPSE_MSG_SIZE )
{ {
float left, top, right, bottom; float left, top, right, bottom;
msgPos+=4; int8 *pattern;
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
bottom = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->StrokeEllipse(rect,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->StrokeEllipse(rect,layerdata,pattern);
sizeRemaining -= AS_STROKE_ELLIPSE_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
case AS_STROKE_LINE: case AS_STROKE_LINE:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_STROKE_LINE_MSG_SIZE ) if ( sizeRemaining >= AS_STROKE_LINE_MSG_SIZE )
{ {
float x1, y1, x2, y2; float x1, y1, x2, y2;
msgPos+=4; int8 *pattern;
x1 = *((float *)&msgbuffer[msgPos]); x1 = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); y1 = read_from_buffer<float>(&msgbuffer);
y1 = *((float *)&msgbuffer[msgPos]); x2 = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); y2 = read_from_buffer<float>(&msgbuffer);
x2 = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
y2 = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BPoint p1(x1,y1); BPoint p1(x1,y1);
BPoint p2(x2,y2); BPoint p2(x2,y2);
_app->_driver->StrokeLine(p1,p2,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->StrokeLine(p1,p2,layerdata,pattern);
sizeRemaining -= AS_STROKE_LINE_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
@@ -749,56 +830,50 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
case AS_STROKE_RECT: case AS_STROKE_RECT:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_STROKE_RECT_MSG_SIZE ) if ( sizeRemaining >= AS_STROKE_RECT_MSG_SIZE )
{ {
float left, top, right, bottom; float left, top, right, bottom;
msgPos+=4; int8 *pattern;
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
bottom = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->StrokeRect(rect,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->StrokeRect(rect,layerdata,pattern);
sizeRemaining -= AS_STROKE_RECT_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
case AS_STROKE_ROUNDRECT: case AS_STROKE_ROUNDRECT:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_STROKE_ROUNDRECT_MSG_SIZE ) if ( sizeRemaining >= AS_STROKE_ROUNDRECT_MSG_SIZE )
{ {
float left, top, right, bottom, xrad, yrad; float left, top, right, bottom, xrad, yrad;
msgPos+=4; int8 *pattern;
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); xrad = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); yrad = read_from_buffer<float>(&msgbuffer);
bottom = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
xrad = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
yrad = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->StrokeRoundRect(rect,xrad,yrad,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->StrokeRoundRect(rect,xrad,yrad,layerdata,pattern);
sizeRemaining -= AS_STROKE_ROUNDRECT_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
@@ -810,120 +885,110 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
case AS_STROKE_TRIANGLE: case AS_STROKE_TRIANGLE:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_STROKE_TRIANGLE_MSG_SIZE ) if ( sizeRemaining >= AS_STROKE_TRIANGLE_MSG_SIZE )
{ {
BPoint *pts; BPoint *pts;
int8 *pattern;
float left, top, right, bottom; float left, top, right, bottom;
int i; int i;
pts = new BPoint[3]; pts = new BPoint[3];
msgPos+=4;
for (i=0; i<3; i++) for (i=0; i<3; i++)
{ {
pts[i].x = *((float *)&msgbuffer[msgPos]); pts[i].x = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); pts[i].y = read_from_buffer<float>(&msgbuffer);
pts[i].y = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
} }
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
bottom = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->StrokeTriangle(pts,rect,layerdata,&msgbuffer[msgPos]); if ( layerdata )
_app->_driver->StrokeTriangle(pts,rect,layerdata,pattern);
delete[] pts; delete[] pts;
msgPos += AS_PATTERN_SIZE; sizeRemaining -= AS_STROKE_TRIANGLE_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
case AS_FILL_ARC: case AS_FILL_ARC:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_FILL_ARC_MSG_SIZE ) if ( sizeRemaining >= AS_FILL_ARC_MSG_SIZE )
{ {
float left, top, right, bottom, angle, span; float left, top, right, bottom, angle, span;
msgPos+=4; int8 *pattern;
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); angle = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); span = read_from_buffer<float>(&msgbuffer);
bottom = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
angle = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
span = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->FillArc(rect,angle,span,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->FillArc(rect,angle,span,layerdata,pattern);
sizeRemaining -= AS_FILL_ARC_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
case AS_FILL_BEZIER: case AS_FILL_BEZIER:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_FILL_BEZIER_MSG_SIZE ) if ( sizeRemaining >= AS_FILL_BEZIER_MSG_SIZE )
{ {
BPoint *pts; BPoint *pts;
int8 *pattern;
int i; int i;
pts = new BPoint[4]; pts = new BPoint[4];
msgPos+=4;
for (i=0; i<4; i++) for (i=0; i<4; i++)
{ {
pts[i].x = *((float *)&msgbuffer[msgPos]); pts[i].x = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); pts[i].y = read_from_buffer<float>(&msgbuffer);
pts[i].y = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
} }
_app->_driver->FillBezier(pts,layerdata,&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
if ( layerdata )
_app->_driver->FillBezier(pts,layerdata,pattern);
delete[] pts; delete[] pts;
msgPos += AS_PATTERN_SIZE; sizeRemaining -= AS_FILL_BEZIER_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
case AS_FILL_ELLIPSE: case AS_FILL_ELLIPSE:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_FILL_ELLIPSE_MSG_SIZE ) if ( sizeRemaining >= AS_FILL_ELLIPSE_MSG_SIZE )
{ {
float left, top, right, bottom; float left, top, right, bottom;
msgPos+=4; int8 *pattern;
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
bottom = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->FillEllipse(rect,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->FillEllipse(rect,layerdata,pattern);
sizeRemaining -= AS_FILL_ELLIPSE_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
@@ -935,26 +1000,24 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
case AS_FILL_RECT: case AS_FILL_RECT:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_FILL_RECT_MSG_SIZE ) if ( sizeRemaining >= AS_FILL_RECT_MSG_SIZE )
{ {
float left, top, right, bottom; float left, top, right, bottom;
msgPos+=4; int8 *pattern;
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
bottom = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->FillRect(rect,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->FillRect(rect,layerdata,pattern);
sizeRemaining -= AS_FILL_RECT_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
@@ -966,30 +1029,26 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
case AS_FILL_ROUNDRECT: case AS_FILL_ROUNDRECT:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_FILL_ROUNDRECT_MSG_SIZE ) if ( sizeRemaining >= AS_FILL_ROUNDRECT_MSG_SIZE )
{ {
float left, top, right, bottom, xrad, yrad; float left, top, right, bottom, xrad, yrad;
msgPos+=4; int8 *pattern;
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); xrad = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); yrad = read_from_buffer<float>(&msgbuffer);
bottom = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
xrad = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
yrad = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->FillRoundRect(rect,xrad,yrad,layerdata,&msgbuffer[msgPos]); if ( layerdata )
msgPos += AS_PATTERN_SIZE; _app->_driver->FillRoundRect(rect,xrad,yrad,layerdata,pattern);
sizeRemaining -= AS_FILL_ROUNDRECT_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
@@ -1001,37 +1060,33 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
case AS_FILL_TRIANGLE: case AS_FILL_TRIANGLE:
{ {
// TODO:: Add clipping // TODO:: Add clipping
if ( uint32(msgsize-msgPos) >= AS_FILL_TRIANGLE_MSG_SIZE ) if ( sizeRemaining >= AS_FILL_TRIANGLE_MSG_SIZE )
{ {
BPoint *pts; BPoint *pts;
int8 *pattern;
float left, top, right, bottom; float left, top, right, bottom;
int i; int i;
pts = new BPoint[3]; pts = new BPoint[3];
msgPos+=4;
for (i=0; i<3; i++) for (i=0; i<3; i++)
{ {
pts[i].x = *((float *)&msgbuffer[msgPos]); pts[i].x = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); pts[i].y = read_from_buffer<float>(&msgbuffer);
pts[i].y = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
} }
left = *((float *)&msgbuffer[msgPos]); left = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); top = read_from_buffer<float>(&msgbuffer);
top = *((float *)&msgbuffer[msgPos]); right = read_from_buffer<float>(&msgbuffer);
msgPos += sizeof(float); bottom = read_from_buffer<float>(&msgbuffer);
right = *((float *)&msgbuffer[msgPos]); pattern = read_pattern_from_buffer(&msgbuffer);
msgPos += sizeof(float);
bottom = *((float *)&msgbuffer[msgPos]);
msgPos += sizeof(float);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
_app->_driver->FillTriangle(pts,rect,layerdata,&msgbuffer[msgPos]); if ( layerdata )
_app->_driver->FillTriangle(pts,rect,layerdata,pattern);
delete[] pts; delete[] pts;
msgPos += AS_PATTERN_SIZE; sizeRemaining -= AS_FILL_TRIANGLE_MSG_SIZE;
} }
else else
{ {
printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code);
msgPos = msgsize; sizeRemaining = 0;
} }
break; break;
} }
@@ -1067,6 +1122,7 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
} }
default: default:
{ {
sizeRemaining -= sizeof(int32);
printf("ServerWindow %s received unexpected graphics code %lx",_title->String(),code); printf("ServerWindow %s received unexpected graphics code %lx",_title->String(),code);
break; break;
} }
+3 -1
View File
@@ -1149,7 +1149,9 @@ void ViewDriver::SetLayerData(LayerData *d, bool set_font_data)
if(!family) if(!family)
return; return;
font.SetFamilyAndStyle((font_family)family->Name(),style->Name()); font_family fontfamily;
strcpy(fontfamily,family->Name());
font.SetFamilyAndStyle(fontfamily,style->Name());
font.SetFlags(sf->Flags()); font.SetFlags(sf->Flags());
font.SetEncoding(sf->Encoding()); font.SetEncoding(sf->Encoding());
font.SetSize(sf->Size()); font.SetSize(sf->Size());