From 3368f550600c9cf9058fc5b17980ece4fd20f4ea Mon Sep 17 00:00:00 2001 From: shadow303 Date: Mon, 23 Jun 2003 02:53:55 +0000 Subject: [PATCH] Add partial handling of graphics messages git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3618 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/ServerWindow.cpp | 476 +++++++++++++++++++++++- 1 file changed, 475 insertions(+), 1 deletion(-) diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index 71a019e411..5b6201dad7 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -571,7 +571,481 @@ printf("ServerWindow %s: Message Move_By unimplemented\n",_title->String()); */ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer) { + int msgPos; + LayerData *layerdata; + int32 code; + + if ( !msgsize || !msgbuffer ) + return; + msgPos = 0; + layerdata = _workspace->GetRoot()->GetLayerData(); + while (msgPos < msgsize) + { + code = *((int32 *)(msgbuffer+msgPos)); + switch (code) + { + case AS_SET_HIGH_COLOR: + { + // TODO: Implement + break; + } + case AS_SET_LOW_COLOR: + { + // TODO: Implement + break; + } + case AS_SET_VIEW_COLOR: + { + // TODO: Implement + break; + } + case AS_STROKE_ARC: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_STROKE_ARC_MSG_SIZE ) + { + float left, top, right, bottom, angle, span; + msgPos+=4; + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + angle = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + span = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->StrokeArc(rect,angle,span,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_STROKE_BEZIER: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_STROKE_BEZIER_MSG_SIZE ) + { + BPoint *pts; + int i; + pts = new BPoint[4]; + msgPos+=4; + for (i=0; i<4; i++) + { + pts[i].x = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + pts[i].y = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + } + _app->_driver->StrokeBezier(pts,layerdata,&msgbuffer[msgPos]); + delete[] pts; + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_STROKE_ELLIPSE: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_STROKE_ELLIPSE_MSG_SIZE ) + { + float left, top, right, bottom; + msgPos+=4; + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->StrokeEllipse(rect,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_STROKE_LINE: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_STROKE_LINE_MSG_SIZE ) + { + float x1, y1, x2, y2; + msgPos+=4; + x1 = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + y1 = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + x2 = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + y2 = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BPoint p1(x1,y1); + BPoint p2(x2,y2); + _app->_driver->StrokeLine(p1,p2,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_STROKE_LINEARRAY: + { + // TODO: Implement + break; + } + case AS_STROKE_POLYGON: + { + // TODO: Implement + break; + } + case AS_STROKE_RECT: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_STROKE_RECT_MSG_SIZE ) + { + float left, top, right, bottom; + msgPos+=4; + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->StrokeRect(rect,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_STROKE_ROUNDRECT: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_STROKE_ROUNDRECT_MSG_SIZE ) + { + float left, top, right, bottom, xrad, yrad; + msgPos+=4; + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + xrad = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + yrad = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->StrokeRoundRect(rect,xrad,yrad,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_STROKE_SHAPE: + { + // TODO: Implement + break; + } + case AS_STROKE_TRIANGLE: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_STROKE_TRIANGLE_MSG_SIZE ) + { + BPoint *pts; + float left, top, right, bottom; + int i; + pts = new BPoint[3]; + msgPos+=4; + for (i=0; i<3; i++) + { + pts[i].x = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + pts[i].y = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + } + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->StrokeTriangle(pts,rect,layerdata,&msgbuffer[msgPos]); + delete[] pts; + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_FILL_ARC: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_FILL_ARC_MSG_SIZE ) + { + float left, top, right, bottom, angle, span; + msgPos+=4; + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + angle = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + span = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->FillArc(rect,angle,span,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_FILL_BEZIER: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_FILL_BEZIER_MSG_SIZE ) + { + BPoint *pts; + int i; + pts = new BPoint[4]; + msgPos+=4; + for (i=0; i<4; i++) + { + pts[i].x = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + pts[i].y = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + } + _app->_driver->FillBezier(pts,layerdata,&msgbuffer[msgPos]); + delete[] pts; + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_FILL_ELLIPSE: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_FILL_ELLIPSE_MSG_SIZE ) + { + float left, top, right, bottom; + msgPos+=4; + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->FillEllipse(rect,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_FILL_POLYGON: + { + // TODO: Implement + break; + } + case AS_FILL_RECT: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_FILL_RECT_MSG_SIZE ) + { + float left, top, right, bottom; + msgPos+=4; + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->FillRect(rect,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_FILL_REGION: + { + // TODO: Implement + break; + } + case AS_FILL_ROUNDRECT: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_FILL_ROUNDRECT_MSG_SIZE ) + { + float left, top, right, bottom, xrad, yrad; + msgPos+=4; + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + xrad = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + yrad = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->FillRoundRect(rect,xrad,yrad,layerdata,&msgbuffer[msgPos]); + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_FILL_SHAPE: + { + // TODO: Implement + break; + } + case AS_FILL_TRIANGLE: + { + // TODO:: Add clipping + if ( msgsize-msgPos >= AS_FILL_TRIANGLE_MSG_SIZE ) + { + BPoint *pts; + float left, top, right, bottom; + int i; + pts = new BPoint[3]; + msgPos+=4; + for (i=0; i<3; i++) + { + pts[i].x = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + pts[i].y = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + } + left = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + top = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + right = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + bottom = *((float *)&msgbuffer[msgPos]); + msgPos += sizeof(float); + BRect rect(left,top,right,bottom); + _app->_driver->FillTriangle(pts,rect,layerdata,&msgbuffer[msgPos]); + delete[] pts; + msgPos += AS_PATTERN_SIZE; + } + else + { + printf("ServerWindow %s received truncated graphics code %lx",_title->String(),code); + msgPos = msgsize; + } + break; + } + case AS_MOVEPENBY: + { + // TODO: Implement + break; + } + case AS_MOVEPENTO: + { + // TODO: Implement + break; + } + case AS_SETPENSIZE: + { + // TODO: Implement + break; + } + case AS_DRAW_STRING: + { + // TODO: Implement + break; + } + case AS_SET_FONT: + { + // TODO: Implement + break; + } + case AS_SET_FONT_SIZE: + { + // TODO: Implement + break; + } + default: + { + printf("ServerWindow %s received unexpected graphics code %lx",_title->String(),code); + break; + } + } + } } /*! @@ -630,7 +1104,7 @@ printf("ServerWindow %s received Quit request\n",win->Title()); } if(buffersize>0) - delete msgbuffer; + delete[] msgbuffer; if(msgcode==B_QUIT_REQUESTED) break;