From f0446088b392d9f8b3309a2b2251682dbfc8c823 Mon Sep 17 00:00:00 2001 From: shadow303 Date: Mon, 1 Mar 2004 02:21:14 +0000 Subject: [PATCH] Begin transfering implementations to the new API functions git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6836 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/AccelerantDriver.cpp | 149 +++++++++- src/servers/app/server/AccelerantDriver.h | 11 + src/servers/app/server/BitmapDriver.cpp | 2 +- src/servers/app/server/BitmapDriver.h | 2 +- src/servers/app/server/DisplayDriver.cpp | 310 ++++++++------------ 5 files changed, 280 insertions(+), 194 deletions(-) diff --git a/src/servers/app/server/AccelerantDriver.cpp b/src/servers/app/server/AccelerantDriver.cpp index 6761087035..c5505807a8 100644 --- a/src/servers/app/server/AccelerantDriver.cpp +++ b/src/servers/app/server/AccelerantDriver.cpp @@ -82,7 +82,7 @@ AccelerantDriver::~AccelerantDriver(void) */ bool AccelerantDriver::Initialize(void) { -/* int i; + int i; char signature[1024]; char path[PATH_MAX]; struct stat accelerant_stat; @@ -154,12 +154,7 @@ bool AccelerantDriver::Initialize(void) return false; if ( GetDisplayMode(&mDisplayMode) != B_OK ) return false; - _SetDepth(GetDepthFromColorspace(mDisplayMode.space)); - _SetWidth(mDisplayMode.virtual_width); - _SetHeight(mDisplayMode.virtual_height); - _SetMode(GetModeFromResolution(mDisplayMode.virtual_width,mDisplayMode.virtual_height, - GetDepthFromColorspace(mDisplayMode.space))); - + SetMode(mDisplayMode); memcpy(&R5DisplayMode,&mDisplayMode,sizeof(display_mode)); #else SetMode(B_8_BIT_640x480); @@ -187,7 +182,6 @@ bool AccelerantDriver::Initialize(void) FillRect(BRect(0,0,1024,768),blue); #endif -*/ return true; } @@ -199,7 +193,6 @@ bool AccelerantDriver::Initialize(void) */ void AccelerantDriver::Shutdown(void) { -/* #ifdef RUN_UNDER_R5 set_display_mode SetDisplayMode = (set_display_mode)accelerant_hook(B_SET_DISPLAY_MODE, NULL); if ( SetDisplayMode ) @@ -212,7 +205,6 @@ void AccelerantDriver::Shutdown(void) unload_add_on(accelerant_image); if (card_fd >= 0) close(card_fd); -*/ } /*! @@ -1522,3 +1514,140 @@ int AccelerantDriver::GetDepthFromColorspace(int space) } return depth; } + +void AccelerantDriver::Blit(const BRect &src, const BRect &dest, const DrawData *d) +{ +} + +void AccelerantDriver::FillSolidRect(const BRect &rect, RGBColor &color) +{ +} + +void AccelerantDriver::FillPatternRect(const BRect &rect, const DrawData *d) +{ +} + +void AccelerantDriver::StrokeSolidLine(const BPoint &start, const BPoint &end, RGBColor &color) +{ +} + +void AccelerantDriver::StrokePatternLine(int32 x1, int32 y1, int32 x2, int32 y2, const DrawData *d) +{ + int32 dx = x2 - x1; + int32 dy = y2 - y1; + int32 steps, k; + double xInc, yInc; + double x = x1; + double y = y1; + + if ( abs(dx) > abs(dy) ) + steps = abs(dx); + else + steps = abs(dy); + xInc = dx / (double) steps; + yInc = dy / (double) steps; + + //(driver->*setPixel)(ROUND(x),ROUND(y)); + for (k=0; k*setPixel)(ROUND(x),ROUND(y)); + } +} + +void AccelerantDriver::StrokeSolidRect(const BRect &rect, RGBColor &color) +{ +} + +void AccelerantDriver::CopyBitmap(ServerBitmap *bitmap, const BRect &source, const BRect &dest, const DrawData *d) +{ +} + +void AccelerantDriver::CopyToBitmap(ServerBitmap *destbmp, const BRect &sourcerect) +{ + /* + if(!destbmp) + { + printf("CopyToBitmap returned - not init or NULL bitmap\n"); + return; + } + + if(((uint32)destbmp->ColorSpace() & 0x000F) != (_displaymode.space & 0x000F)) + { + printf("CopyToBitmap returned - unequal buffer pixel depth\n"); + return; + } + + BRect destrect(destbmp->Bounds()), source(sourcerect); + + uint8 colorspace_size=destbmp->BitsPerPixel()/8; + + // First, clip source rect to destination + if(source.Width() > destrect.Width()) + source.right=source.left+destrect.Width(); + + if(source.Height() > destrect.Height()) + source.bottom=source.top+destrect.Height(); + + + // Second, check rectangle bounds against their own bitmaps + BRect work_rect(destbmp->Bounds()); + + if( !(work_rect.Contains(destrect)) ) + { + // something in selection must be clipped + if(destrect.left < 0) + destrect.left = 0; + if(destrect.right > work_rect.right) + destrect.right = work_rect.right; + if(destrect.top < 0) + destrect.top = 0; + if(destrect.bottom > work_rect.bottom) + destrect.bottom = work_rect.bottom; + } + + work_rect.Set(0,0,_displaymode.virtual_width-1,_displaymode.virtual_height-1); + + if(!work_rect.Contains(sourcerect)) + return; + + if( !(work_rect.Contains(source)) ) + { + // something in selection must be clipped + if(source.left < 0) + source.left = 0; + if(source.right > work_rect.right) + source.right = work_rect.right; + if(source.top < 0) + source.top = 0; + if(source.bottom > work_rect.bottom) + source.bottom = work_rect.bottom; + } + + // Set pointers to the actual data + uint8 *dest_bits = (uint8*) destbmp->Bits(); + uint8 *src_bits = (uint8*) _target->Bits(); + + // Get row widths for offset looping + uint32 dest_width = uint32 (destbmp->BytesPerRow()); + uint32 src_width = uint32 (_target->BytesPerRow()); + + // Offset bitmap pointers to proper spot in each bitmap + src_bits += uint32 ( (source.top * src_width) + (source.left * colorspace_size) ); + dest_bits += uint32 ( (destrect.top * dest_width) + (destrect.left * colorspace_size) ); + + + uint32 line_length = uint32 ((destrect.right - destrect.left+1)*colorspace_size); + uint32 lines = uint32 (source.bottom-source.top+1); + + for (uint32 pos_y=0; pos_y= 360) || (span <= -360) ) { - FillEllipse(r,driver,setLine); + FillEllipse(r,d); return; } @@ -939,27 +931,13 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa } if ( useQuad1 ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); if ( useQuad2 ) - (driver->*setLine)(ROUND(xc),ROUND(xc-x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc-x),ROUND(yc-y),d); if ( useQuad3 ) - (driver->*setLine)(ROUND(xc),ROUND(xc-x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc-x),ROUND(yc+y),d); if ( useQuad4 ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc+y)); - /* - if ( (!shortspan && (((startQuad == 1) && (x <= startx)) || ((endQuad == 1) && (x >= endx)))) || - (shortspan && (startQuad == 1) && (x <= startx) && (x >= endx)) ) - StrokeLine(BPoint(xc+x,yc-y),center,d,pat); - if ( (!shortspan && (((startQuad == 2) && (x >= startx)) || ((endQuad == 2) && (x <= endx)))) || - (shortspan && (startQuad == 2) && (x >= startx) && (x <= endx)) ) - StrokeLine(BPoint(xc-x,yc-y),center,d,pat); - if ( (!shortspan && (((startQuad == 3) && (x <= startx)) || ((endQuad == 3) && (x >= endx)))) || - (shortspan && (startQuad == 3) && (x <= startx) && (x >= endx)) ) - StrokeLine(BPoint(xc-x,yc+y),center,d,pat); - if ( (!shortspan && (((startQuad == 4) && (x >= startx)) || ((endQuad == 4) && (x <= endx)))) || - (shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) ) - StrokeLine(BPoint(xc+x,yc+y),center,d,pat); - */ + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); p = ROUND (Ry2 - (Rx2 * ry) + (.25 * Rx2)); while (px < py) @@ -976,23 +954,23 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa } if ( useQuad1 ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); if ( useQuad2 ) - (driver->*setLine)(ROUND(xc),ROUND(xc-x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc-x),ROUND(yc-y),d); if ( useQuad3 ) - (driver->*setLine)(ROUND(xc),ROUND(xc-x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc-x),ROUND(yc+y),d); if ( useQuad4 ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); if ( !shortspan ) { if ( startQuad == 1 ) { if ( x <= startx ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); else { xclip = ROUND(y*startx/(double)starty); - (driver->*setLine)(ROUND(xc),ROUND(xc+xclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc+xclip),ROUND(yc-y),d); } } else if ( startQuad == 2 ) @@ -1000,17 +978,17 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( x >= startx ) { xclip = ROUND(y*startx/(double)starty); - (driver->*setLine)(ROUND(xc-x),ROUND(xc-xclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc-y),ROUND(xc-xclip),ROUND(yc-y),d); } } else if ( startQuad == 3 ) { if ( x <= startx ) - (driver->*setLine)(ROUND(xc-x),ROUND(xc),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc+y),ROUND(xc),ROUND(yc+y),d); else { xclip = ROUND(y*startx/(double)starty); - (driver->*setLine)(ROUND(xc-xclip),ROUND(xc),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-xclip),ROUND(yc+y),ROUND(xc),ROUND(yc+y),d); } } else if ( startQuad == 4 ) @@ -1018,7 +996,7 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( x >= startx ) { xclip = ROUND(y*startx/(double)starty); - (driver->*setLine)(ROUND(xc+xclip),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc+xclip),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); } } @@ -1027,17 +1005,17 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( x >= endx ) { xclip = ROUND(y*endx/(double)endy); - (driver->*setLine)(ROUND(xc+xclip),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc+xclip),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); } } else if ( endQuad == 2 ) { if ( x <= endx ) - (driver->*setLine)(ROUND(xc-x),ROUND(xc),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc-y),ROUND(xc),ROUND(yc-y),d); else { xclip = ROUND(y*endx/(double)endy); - (driver->*setLine)(ROUND(xc-xclip),ROUND(xc),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-xclip),ROUND(yc-y),ROUND(xc),ROUND(yc-y),d); } } else if ( endQuad == 3 ) @@ -1045,17 +1023,17 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( x >= endx ) { xclip = ROUND(y*endx/(double)endy); - (driver->*setLine)(ROUND(xc-x),ROUND(xc-xclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc+y),ROUND(xc-xclip),ROUND(yc+y),d); } } else if ( endQuad == 4 ) { if ( x <= endx ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); else { xclip = ROUND(y*endx/(double)endy); - (driver->*setLine)(ROUND(xc),ROUND(xc+xclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc+xclip),ROUND(yc+y),d); } } } @@ -1066,30 +1044,30 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( startQuad == 1 ) { if ( (x <= startx) && (x >= endx) ) - (driver->*setLine)(ROUND(xc+endclip),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc+endclip),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); else - (driver->*setLine)(ROUND(xc+endclip),ROUND(xc+startclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc+endclip),ROUND(yc-y),ROUND(xc+startclip),ROUND(yc-y),d); } else if ( startQuad == 2 ) { if ( (x <= startx) && (x >= endx) ) - (driver->*setLine)(ROUND(xc-x),ROUND(xc-startclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc-y),ROUND(xc-startclip),ROUND(yc-y),d); else - (driver->*setLine)(ROUND(xc-endclip),ROUND(xc-startclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-endclip),ROUND(yc-y),ROUND(xc-startclip),ROUND(yc-y),d); } else if ( startQuad == 3 ) { if ( (x <= startx) && (x >= endx) ) - (driver->*setLine)(ROUND(xc-x),ROUND(xc-endclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc+y),ROUND(xc-endclip),ROUND(yc+y),d); else - (driver->*setLine)(ROUND(xc-startclip),ROUND(xc-endclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-startclip),ROUND(yc+y),ROUND(xc-endclip),ROUND(yc+y),d); } else if ( startQuad == 4 ) { if ( (x <= startx) && (x >= endx) ) - (driver->*setLine)(ROUND(xc+startclip),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc+startclip),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); else - (driver->*setLine)(ROUND(xc+startclip),ROUND(xc+endclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc+startclip),ROUND(yc+y),ROUND(xc+endclip),ROUND(yc+y),d); } } } @@ -1109,23 +1087,23 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa } if ( useQuad1 ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); if ( useQuad2 ) - (driver->*setLine)(ROUND(xc),ROUND(xc-x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc-x),ROUND(yc-y),d); if ( useQuad3 ) - (driver->*setLine)(ROUND(xc),ROUND(xc-x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc-x),ROUND(yc+y),d); if ( useQuad4 ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); if ( !shortspan ) { if ( startQuad == 1 ) { if ( x <= startx ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); else { xclip = ROUND(y*startx/(double)starty); - (driver->*setLine)(ROUND(xc),ROUND(xc+xclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc+xclip),ROUND(yc-y),d); } } else if ( startQuad == 2 ) @@ -1133,17 +1111,17 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( x >= startx ) { xclip = ROUND(y*startx/(double)starty); - (driver->*setLine)(ROUND(xc-x),ROUND(xc-xclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc-y),ROUND(xc-xclip),ROUND(yc-y),d); } } else if ( startQuad == 3 ) { if ( x <= startx ) - (driver->*setLine)(ROUND(xc-x),ROUND(xc),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc+y),ROUND(xc),ROUND(yc+y),d); else { xclip = ROUND(y*startx/(double)starty); - (driver->*setLine)(ROUND(xc-xclip),ROUND(xc),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-xclip),ROUND(yc+y),ROUND(xc),ROUND(yc+y),d); } } else if ( startQuad == 4 ) @@ -1151,7 +1129,7 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( x >= startx ) { xclip = ROUND(y*startx/(double)starty); - (driver->*setLine)(ROUND(xc+xclip),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc+xclip),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); } } @@ -1160,17 +1138,17 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( x >= endx ) { xclip = ROUND(y*endx/(double)endy); - (driver->*setLine)(ROUND(xc+xclip),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc+xclip),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); } } else if ( endQuad == 2 ) { if ( x <= endx ) - (driver->*setLine)(ROUND(xc-x),ROUND(xc),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc-y),ROUND(xc),ROUND(yc-y),d); else { xclip = ROUND(y*endx/(double)endy); - (driver->*setLine)(ROUND(xc-xclip),ROUND(xc),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-xclip),ROUND(yc-y),ROUND(xc),ROUND(yc-y),d); } } else if ( endQuad == 3 ) @@ -1178,17 +1156,17 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( x >= endx ) { xclip = ROUND(y*endx/(double)endy); - (driver->*setLine)(ROUND(xc-x),ROUND(xc-xclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc+y),ROUND(xc-xclip),ROUND(yc+y),d); } } else if ( endQuad == 4 ) { if ( x <= endx ) - (driver->*setLine)(ROUND(xc),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); else { xclip = ROUND(y*endx/(double)endy); - (driver->*setLine)(ROUND(xc),ROUND(xc+xclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc+xclip),ROUND(yc+y),d); } } } @@ -1199,34 +1177,35 @@ void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &spa if ( startQuad == 1 ) { if ( (x <= startx) && (x >= endx) ) - (driver->*setLine)(ROUND(xc+endclip),ROUND(xc+x),ROUND(yc-y)); + StrokePatternLine(ROUND(xc+endclip),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); else - (driver->*setLine)(ROUND(xc+endclip),ROUND(xc+startclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc+endclip),ROUND(yc-y),ROUND(xc+startclip),ROUND(yc-y),d); } else if ( startQuad == 2 ) { if ( (x <= startx) && (x >= endx) ) - (driver->*setLine)(ROUND(xc-x),ROUND(xc-startclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc-y),ROUND(xc-startclip),ROUND(yc-y),d); else - (driver->*setLine)(ROUND(xc-endclip),ROUND(xc-startclip),ROUND(yc-y)); + StrokePatternLine(ROUND(xc-endclip),ROUND(yc-y),ROUND(xc-startclip),ROUND(yc-y),d); } else if ( startQuad == 3 ) { if ( (x <= startx) && (x >= endx) ) - (driver->*setLine)(ROUND(xc-x),ROUND(xc-endclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc+y),ROUND(xc-endclip),ROUND(yc+y),d); else - (driver->*setLine)(ROUND(xc-startclip),ROUND(xc-endclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-startclip),ROUND(yc+y),ROUND(xc-endclip),ROUND(yc+y),d); } else if ( startQuad == 4 ) { if ( (x <= startx) && (x >= endx) ) - (driver->*setLine)(ROUND(xc+startclip),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc+startclip),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); else - (driver->*setLine)(ROUND(xc+startclip),ROUND(xc+endclip),ROUND(yc+y)); + StrokePatternLine(ROUND(xc+startclip),ROUND(yc+y),ROUND(xc+endclip),ROUND(yc+y),d); } } } Unlock(); + } void DisplayDriver::FillBezier(BPoint *pts, RGBColor &color) @@ -1321,16 +1300,13 @@ void DisplayDriver::FillEllipse(const BRect &r, RGBColor &color) { } -void DisplayDriver::FillEllipse(const BRect &r, const DrawData *d) -{ -} - /*! \brief Called for all BView::FillEllipse calls \param r BRect enclosing the ellipse to be drawn. - \param setLine Horizontal line drawing routine which handles things like color and pattern. + \param d DrawData containing the endless options */ -void DisplayDriver::FillEllipse(const BRect &r, DisplayDriver* driver, SetHorizontalLineFuncType setLine) + +void DisplayDriver::FillEllipse(const BRect &r, const DrawData *d) { float xc = (r.left+r.right)/2; float yc = (r.top+r.bottom)/2; @@ -1348,10 +1324,8 @@ void DisplayDriver::FillEllipse(const BRect &r, DisplayDriver* driver, SetHorizo Lock(); - //SetPixel(ROUND(xc),ROUND(yc-y),pattern.GetColor(xc,yc-y)); - (driver->*setLine)(ROUND(xc),ROUND(xc),ROUND(yc-y)); - //SetPixel(ROUND(xc),ROUND(yc+y),pattern.GetColor(xc,yc+y)); - (driver->*setLine)(ROUND(xc),ROUND(xc),ROUND(yc+y)); + StrokePatternLine(ROUND(xc),ROUND(yc-y),ROUND(xc),ROUND(yc-y),d); + StrokePatternLine(ROUND(xc),ROUND(yc+y),ROUND(xc),ROUND(yc+y),d); p = ROUND (Ry2 - (Rx2 * ry) + (.25 * Rx2)); while (px < py) @@ -1367,8 +1341,8 @@ void DisplayDriver::FillEllipse(const BRect &r, DisplayDriver* driver, SetHorizo p += Ry2 + px - py; } - (driver->*setLine)(ROUND(xc-x),ROUND(xc+x),ROUND(yc-y)); - (driver->*setLine)(ROUND(xc-x),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); + StrokePatternLine(ROUND(xc-x),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); } p = ROUND(Ry2*(x+.5)*(x+.5) + Rx2*(y-1)*(y-1) - Rx2*Ry2); @@ -1385,8 +1359,8 @@ void DisplayDriver::FillEllipse(const BRect &r, DisplayDriver* driver, SetHorizo p += Rx2 - py +px; } - (driver->*setLine)(ROUND(xc-x),ROUND(xc+x),ROUND(yc-y)); - (driver->*setLine)(ROUND(xc-x),ROUND(xc+x),ROUND(yc+y)); + StrokePatternLine(ROUND(xc-x),ROUND(yc-y),ROUND(xc+x),ROUND(yc-y),d); + StrokePatternLine(ROUND(xc-x),ROUND(yc+y),ROUND(xc+x),ROUND(yc+y),d); } Unlock(); } @@ -1395,20 +1369,13 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, RGBColor &color) { } -void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const DrawData *d) -{ -} - /*! \brief Called for all BView::FillPolygon calls \param ptlist Array of BPoints defining the polygon. \param numpts Number of points in the BPoint array. - \param setLine Horizontal line drawing routine which handles things like color and pattern. - - The points in the array are not guaranteed to be within the framebuffer's - coordinate range. + \param d The 50 bazillion drawing options (inluding clip region) */ -void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, DisplayDriver* driver, SetHorizontalLineFuncType setLine) +void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, const DrawData *d) { /* Here's the plan. Record all line segments in polygon. If a line segments crosses the y-value of a point not in the segment, split the segment into 2 segments. @@ -1508,16 +1475,16 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, DisplayDriver* dri { if ( (segmentArray[i].MinX() < _displaymode.virtual_width) && (segmentArray[i].MaxX() >= 0) ) - (driver->*setLine)(ROUND(segmentArray[i].MinX()), - ROUND(segmentArray[i].MaxX()), y); + StrokePatternLine(ROUND(segmentArray[i].MinX()), y, + ROUND(segmentArray[i].MaxX()), y, d); i++; } else { if ( (segmentArray[i].GetX(y) < _displaymode.virtual_width) && (segmentArray[i+1].GetX(y) >= 0) ) - (driver->*setLine)(ROUND(segmentArray[i].GetX(y)), - ROUND(segmentArray[i+1].GetX(y)), y); + StrokePatternLine(ROUND(segmentArray[i].GetX(y)), y, + ROUND(segmentArray[i+1].GetX(y)), y, d); i+=2; } } @@ -1591,19 +1558,14 @@ void DisplayDriver::FillRoundRect(const BRect &r, const float &xrad, const float { } -void DisplayDriver::FillRoundRect(const BRect &r, const float &xrad, const float &yrad, const DrawData *d) -{ -} - /*! \brief Called for all BView::FillRoundRect calls \param r The rectangle itself \param xrad X radius of the corner arcs \param yrad Y radius of the corner arcs - \param setRect Rectangle filling routine which handles things like color and pattern - \param setLine Horizontal line drawing function which handles things like color and pattern + \param d DrawData containing all other options */ -void DisplayDriver::FillRoundRect(const BRect &r, const float &xrad, const float &yrad, DisplayDriver* driver, SetRectangleFuncType setRect, SetHorizontalLineFuncType setLine) +void DisplayDriver::FillRoundRect(const BRect &r, const float &xrad, const float &yrad, const DrawData *d) { float arc_x; float yrad2 = yrad*yrad; @@ -1612,12 +1574,13 @@ void DisplayDriver::FillRoundRect(const BRect &r, const float &xrad, const float for (i=0; i<=(int)yrad; i++) { arc_x = xrad*sqrt(1-i*i/yrad2); - (driver->*setLine)(ROUND(r.left+xrad-arc_x), ROUND(r.right-xrad+arc_x), - ROUND(r.top+yrad-i)); - (driver->*setLine)(ROUND(r.left+xrad-arc_x), ROUND(r.right-xrad+arc_x), - ROUND(r.bottom-yrad+i)); + StrokePatternLine(ROUND(r.left+xrad-arc_x), ROUND(r.top+yrad-i), + ROUND(r.right-xrad+arc_x), ROUND(r.top+yrad-i),d); + StrokePatternLine(ROUND(r.left+xrad-arc_x), ROUND(r.bottom-yrad+i), + ROUND(r.right-xrad+arc_x), ROUND(r.bottom-yrad+i),d); } - (driver->*setRect)((int)(r.left),(int)(r.top+yrad),(int)(r.right),(int)(r.bottom-yrad)); + FillPatternRect(BRect(r.left,r.top+yrad,r.right,r.bottom-yrad),d); + } //void DisplayDriver::FillShape(SShape *sh, const DrawData *d, const Pattern &pat) @@ -1628,16 +1591,12 @@ void DisplayDriver::FillTriangle(BPoint *pts, RGBColor &color) { } -void DisplayDriver::FillTriangle(BPoint *pts, const DrawData *d) -{ -} - /*! \brief Called for all BView::FillTriangle calls \param pts Array of 3 BPoints. Always non-NULL. \param setLine Horizontal line drawing routine which handles things like color and pattern. */ -void DisplayDriver::FillTriangle(BPoint *pts, DisplayDriver* driver, SetHorizontalLineFuncType setLine) +void DisplayDriver::FillTriangle(BPoint *pts, const DrawData *d) { if ( !pts ) return; @@ -1686,7 +1645,7 @@ void DisplayDriver::FillTriangle(BPoint *pts, DisplayDriver* driver, SetHorizont end.y=first.y; start.x=MIN(first.x,MIN(second.x,third.x)); end.x=MAX(first.x,MAX(second.x,third.x)); - (driver->*setLine)(ROUND(start.x), ROUND(end.x), ROUND(start.y)); + StrokePatternLine(ROUND(start.x), ROUND(start.y), ROUND(end.x), ROUND(start.y), d); return; } @@ -1698,9 +1657,9 @@ void DisplayDriver::FillTriangle(BPoint *pts, DisplayDriver* driver, SetHorizont LineCalc lineA(first, third); LineCalc lineB(second, third); - (driver->*setLine)(ROUND(first.x), ROUND(second.x), ROUND(first.y)); + StrokePatternLine(ROUND(first.x), ROUND(first.y), ROUND(second.x), ROUND(first.y), d); for(i=(int32)first.y+1; i<=third.y; i++) - (driver->*setLine)(ROUND(lineA.GetX(i)), ROUND(lineB.GetX(i)), i); + StrokePatternLine(ROUND(lineA.GetX(i)), i, ROUND(lineB.GetX(i)), i, d); return; } @@ -1710,9 +1669,9 @@ void DisplayDriver::FillTriangle(BPoint *pts, DisplayDriver* driver, SetHorizont LineCalc lineA(first, second); LineCalc lineB(first, third); - (driver->*setLine)(ROUND(second.x), ROUND(third.x), ROUND(second.y)); + StrokePatternLine(ROUND(second.x), ROUND(second.y), ROUND(third.x), ROUND(second.y), d); for(i=(int32)first.y; i*setLine)(ROUND(lineA.GetX(i)), ROUND(lineB.GetX(i)), i); + StrokePatternLine(ROUND(lineA.GetX(i)), i, ROUND(lineB.GetX(i)), i, d); return; } @@ -1722,10 +1681,11 @@ void DisplayDriver::FillTriangle(BPoint *pts, DisplayDriver* driver, SetHorizont LineCalc lineC(second, third); for(i=(int32)first.y; i<(int32)second.y; i++) - (driver->*setLine)(ROUND(lineA.GetX(i)), ROUND(lineB.GetX(i)), i); + StrokePatternLine(ROUND(lineA.GetX(i)), i, ROUND(lineB.GetX(i)), i, d); for(i=(int32)second.y; i<=third.y; i++) - (driver->*setLine)(ROUND(lineC.GetX(i)), ROUND(lineB.GetX(i)), i); + StrokePatternLine(ROUND(lineC.GetX(i)), i, ROUND(lineB.GetX(i)), i, d); + } /*! @@ -2236,7 +2196,8 @@ void DisplayDriver::StrokeEllipse(const BRect &r, DisplayDriver* driver, SetPixe void DisplayDriver::StrokeLine(const BPoint &start, const BPoint &end, RGBColor &color) { Lock(); - StrokeSolidLine(start,end,color); + //Not quite that simple bub + //StrokeSolidLine(start,end,color); Unlock(); } @@ -2289,23 +2250,12 @@ void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, RGBColor &color, return; Lock(); + /* for(int32 i=0; i<(numpts-1); i++) StrokeSolidLine(ptlist[i],ptlist[i+1],color); if(is_closed) StrokeSolidLine(ptlist[numpts-1],ptlist[0],color); - Unlock(); -} - -void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const DrawData *d, bool is_closed) -{ - if(!ptlist) - return; - - Lock(); - for(int32 i=0; i<(numpts-1); i++) - StrokePatternLine(ptlist[i],ptlist[i+1],d); - if(is_closed) - StrokePatternLine(ptlist[numpts-1],ptlist[0],d); + */ Unlock(); } @@ -2313,14 +2263,19 @@ void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const DrawData * \brief Called for all BView::StrokePolygon calls \param ptlist Array of BPoints defining the polygon. \param numpts Number of points in the BPoint array. - \param setPixel Pixel drawing function which handles things like size and pattern. + \param d DrawData containing all of the other options */ -void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, DisplayDriver* driver, SetPixelFuncType setPixel, bool is_closed) +void DisplayDriver::StrokePolygon(BPoint *ptlist, int32 numpts, const DrawData *d, bool is_closed) { + if(!ptlist) + return; + + Lock(); for(int32 i=0; i<(numpts-1); i++) - StrokeLine(ptlist[i],ptlist[i+1],driver,setPixel); + StrokeLine(ptlist[i],ptlist[i+1],d); if(is_closed) - StrokeLine(ptlist[numpts-1],ptlist[0],driver,setPixel); + StrokeLine(ptlist[numpts-1],ptlist[0],d); + Unlock(); } /*! @@ -2339,21 +2294,13 @@ void DisplayDriver::StrokeRect(const BRect &r, RGBColor &color) void DisplayDriver::StrokeRect(const BRect &r, const DrawData *d) { Lock(); - StrokePatternLine(r.LeftTop(),r.RightTop(),d); - StrokePatternLine(r.LeftTop(),r.LeftBottom(),d); - StrokePatternLine(r.RightTop(),r.RightBottom(),d); - StrokePatternLine(r.LeftBottom(),r.RightBottom(),d); + StrokeLine(r.LeftTop(),r.RightTop(),d); + StrokeLine(r.LeftTop(),r.LeftBottom(),d); + StrokeLine(r.RightTop(),r.RightBottom(),d); + StrokeLine(r.LeftBottom(),r.RightBottom(),d); Unlock(); } -void DisplayDriver::StrokeRect(const BRect &r, DisplayDriver* driver, SetHorizontalLineFuncType setHLine, SetVerticalLineFuncType setVLine) -{ - (driver->*setHLine)((int)ROUND(r.left), (int)ROUND(r.right), (int)ROUND(r.top)); - (driver->*setVLine)((int)ROUND(r.right), (int)ROUND(r.top), (int)ROUND(r.bottom)); - (driver->*setHLine)((int)ROUND(r.left), (int)ROUND(r.right), (int)ROUND(r.bottom)); - (driver->*setVLine)((int)ROUND(r.left), (int)ROUND(r.top), (int)ROUND(r.bottom)); -} - /*! \brief Convenience function for server use \param r BRegion to be stroked @@ -2385,20 +2332,14 @@ void DisplayDriver::StrokeRoundRect(const BRect &r, const float &xrad, const flo { } -void DisplayDriver::StrokeRoundRect(const BRect &r, const float &xrad, const float &yrad, const DrawData *d) -{ -} - /*! \brief Called for all BView::StrokeRoundRect calls \param r The rect itself \param xrad X radius of the corner arcs \param yrad Y radius of the corner arcs - \param setHLine Horizontal line drawing function - \param setVLine Vertical line drawing function - \param setPixel Pixel drawing function + \param d DrawData containing all other options */ -void DisplayDriver::StrokeRoundRect(const BRect &r, const float &xrad, const float &yrad, DisplayDriver* driver, SetHorizontalLineFuncType setHLine, SetVerticalLineFuncType setVLine, SetPixelFuncType setPixel) +void DisplayDriver::StrokeRoundRect(const BRect &r, const float &xrad, const float &yrad, const DrawData *d) { int hLeft, hRight; int vTop, vBottom; @@ -2412,17 +2353,20 @@ void DisplayDriver::StrokeRoundRect(const BRect &r, const float &xrad, const flo bRight = hRight -xrad; bTop = vTop + yrad; bBottom = vBottom - yrad; - StrokeArc(BRect(bRight, r.top, r.right, bTop), 0, 90, driver, setPixel); - (driver->*setHLine)(hRight, hLeft, (int)ROUND(r.top)); + + Lock(); + StrokeArc(BRect(bRight, r.top, r.right, bTop), 0, 90, d); + StrokeLine(BPoint(hRight, r.top), BPoint(hLeft, r.top), d); - StrokeArc(BRect(r.left,r.top,bLeft,bTop), 90, 90, driver, setPixel); - (driver->*setVLine)((int)ROUND(r.left),vTop,vBottom); + StrokeArc(BRect(r.left,r.top,bLeft,bTop), 90, 90, d); + StrokeLine(BPoint(r.left, vTop), BPoint(r.left, vBottom), d); - StrokeArc(BRect(r.left,bBottom,bLeft,r.bottom), 180, 90, driver, setPixel); - (driver->*setHLine)(hLeft, hRight, ROUND(r.bottom)); + StrokeArc(BRect(r.left,bBottom,bLeft,r.bottom), 180, 90, d); + StrokeLine(BPoint(hLeft, r.bottom), BPoint(hRight, r.bottom), d); - StrokeArc(BRect(bRight,bBottom,r.right,r.bottom), 270, 90, driver, setPixel); - (driver->*setVLine)((int)ROUND(r.right),vBottom,vTop); + StrokeArc(BRect(bRight,bBottom,r.right,r.bottom), 270, 90, d); + StrokeLine(BPoint(r.right, vBottom), BPoint(r.right, vTop), d); + Unlock(); } //void DisplayDriver::StrokeShape(SShape *sh, const DrawData *d, const Pattern &pat) @@ -2447,9 +2391,9 @@ void DisplayDriver::StrokeTriangle(BPoint *pts, RGBColor &color) void DisplayDriver::StrokeTriangle(BPoint *pts, const DrawData *d) { Lock(); - StrokePatternLine(pts[0],pts[1],d); - StrokePatternLine(pts[1],pts[2],d); - StrokePatternLine(pts[2],pts[0],d); + StrokeLine(pts[0],pts[1],d); + StrokeLine(pts[1],pts[2],d); + StrokeLine(pts[2],pts[0],d); Unlock(); } @@ -3013,11 +2957,13 @@ void DisplayDriver::FillPatternRect(const BRect &rect, const DrawData *d) { } +/* Draws a line with pensize 1. Coordinates are guarenteed to be in bounds */ void DisplayDriver::StrokeSolidLine(const BPoint &start, const BPoint &end, RGBColor &color) { } -void DisplayDriver::StrokePatternLine(const BPoint &start, const BPoint &end, const DrawData *d) +/* Draws a line with pensize 1. Coordinates are guarenteed to be in bounds */ +void DisplayDriver::StrokePatternLine(int32 x1, int32 y1, int32 x2, int32 y2, const DrawData *d) { }