From b9717a71508ce96f363b44182b1b2bfca3229020 Mon Sep 17 00:00:00 2001 From: shadow303 Date: Sat, 29 Jan 2005 00:19:38 +0000 Subject: [PATCH] Long overdue fixes for internal API change, now if I could just unbork my system enough to test them... git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11115 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/AccelerantDriver.cpp | 867 ++++++++------------ src/servers/app/server/AccelerantDriver.h | 10 - 2 files changed, 331 insertions(+), 546 deletions(-) diff --git a/src/servers/app/server/AccelerantDriver.cpp b/src/servers/app/server/AccelerantDriver.cpp index b925753319..b371e0a2db 100644 --- a/src/servers/app/server/AccelerantDriver.cpp +++ b/src/servers/app/server/AccelerantDriver.cpp @@ -211,53 +211,27 @@ void AccelerantDriver::Shutdown(void) \brief Draws a series of lines - optimized for speed \param pts Array of BPoints pairs \param numlines Number of lines to be drawn - \param pensize The thickness of the lines - \param colors Array of colors for each respective line + \param d the other 10 billion drawing options */ void AccelerantDriver::StrokeLineArray(const int32 &numlines, const LineArrayData *linedata,const DrawData *d) { if(!d || !linedata) return; - int x1, y1, x2, y2, dx, dy; - int steps, k; - double xInc, yInc; - double x,y; int i; + int x1, y1, x2, y2; const LineArrayData *data; Lock(); - fLineThickness = (int)d->pensize; - fDrawPattern.SetPattern((int8*)&B_SOLID_HIGH); for (i=0; icolor,data->color); - x1 = ROUND(data->pt1.x); y1 = ROUND(data->pt1.y); x2 = ROUND(data->pt2.x); y2 = ROUND(data->pt2.y); - dx = x2-x1; - dy = y2-y1; - x = x1; - y = y1; - if ( abs(dx) > abs(dy) ) - steps = abs(dx); - else - steps = abs(dy); - xInc = dx / (double) steps; - yInc = dy / (double) steps; - - SetThickPatternPixel(ROUND(x),ROUND(y)); - for (k=0; k x2 ) - { - x = x2; - x2 = x1; - x1 = x; - } - switch (mDisplayMode.space) - { - case B_CMAP8: - case B_GRAY8: - { - uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer + y*mFrameBufferConfig.bytes_per_row; - for (x=x1; x<=x2; x++) - fb[x] = pat->ColorAt(x,y).GetColor8(); - } break; - case B_RGB15_BIG: - case B_RGBA15_BIG: - case B_RGB15_LITTLE: - case B_RGBA15_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + y*mFrameBufferConfig.bytes_per_row); - for (x=x1; x<=x2; x++) - fb[x] = pat->ColorAt(x,y).GetColor15(); - } break; - case B_RGB16_BIG: - case B_RGB16_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + y*mFrameBufferConfig.bytes_per_row); - for (x=x1; x<=x2; x++) - fb[x] = pat->ColorAt(x,y).GetColor16(); - } break; - case B_RGB32_BIG: - case B_RGBA32_BIG: - case B_RGB32_LITTLE: - case B_RGBA32_LITTLE: - { - uint32 *fb = (uint32 *)((uint8 *)mFrameBufferConfig.frame_buffer + y*mFrameBufferConfig.bytes_per_row); - rgb_color color; - for (x=x1; x<=x2; x++) - { - color = pat->ColorAt(x,y).GetColor32(); - fb[x] = (color.alpha << 24) | (color.red << 16) | (color.green << 8) | (color.blue); - } - } break; - default: - printf("Error: Unknown color space\n"); - } -} -*/ - -/*! - \brief Draws a horizontal line using the display driver's line thickness and pattern - \param x1 The first x coordinate (not guaranteed to be in bounds) - \param x2 The second x coordinate (not guaranteed to be in bounds) - \param y The y coordinate (not guaranteed to be in bounds) -*/ -void AccelerantDriver::HLinePatternThick(int32 x1, int32 x2, int32 y) -{ - int x, y1, y2; - - if ( x1 > x2 ) - { - x = x2; - x2 = x1; - x1 = x; - } - y1 = y - fLineThickness/2; - y2 = y + fLineThickness/2; - switch (mDisplayMode.space) - { - case B_CMAP8: - case B_GRAY8: - { - uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer + y1*mFrameBufferConfig.bytes_per_row; - for (y=y1; y<=y2; y++) - { - for (x=x1; x<=x2; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor8(); - fb += mFrameBufferConfig.bytes_per_row; - } - } break; - case B_RGB15_BIG: - case B_RGBA15_BIG: - case B_RGB15_LITTLE: - case B_RGBA15_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + y1*mFrameBufferConfig.bytes_per_row); - for (y=y1; y<=y2; y++) - { - for (x=x1; x<=x2; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor15(); - fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - case B_RGB16_BIG: - case B_RGB16_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + y1*mFrameBufferConfig.bytes_per_row); - for (y=y1; y<=y2; y++) - { - for (x=x1; x<=x2; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor16(); - fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - case B_RGB32_BIG: - case B_RGBA32_BIG: - case B_RGB32_LITTLE: - case B_RGBA32_LITTLE: - { - uint32 *fb = (uint32 *)((uint8 *)mFrameBufferConfig.frame_buffer + y1*mFrameBufferConfig.bytes_per_row); - rgb_color color; - for (y=y1; y<=y2; y++) - { - for (x=x1; x<=x2; x++) - { - color = fDrawPattern.ColorAt(x,y).GetColor32(); - fb[x] = (color.alpha << 24) | (color.red << 16) | (color.green << 8) | (color.blue); - } - fb = (uint32 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - default: - printf("Error: Unknown color space\n"); - } -} - -/*! - \brief Draws a vertical line using the display driver's line thickness and pattern - \param x The x coordinate - \param y1 The first y coordinate - \param y2 The second y coordinate -*/ -void AccelerantDriver::VLinePatternThick(int32 x, int32 y1, int32 y2) -{ - int y, x1, x2; - - if ( y1 > y2 ) - { - y = y2; - y2 = y1; - y1 = y; - } - x1 = x - fLineThickness/2; - x2 = x + fLineThickness/2; - switch (mDisplayMode.space) - { - case B_CMAP8: - case B_GRAY8: - { - uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer + y1*mFrameBufferConfig.bytes_per_row; - for (y=y1; y<=y2; y++) - { - for (x=x1; x<=x2; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor8(); - fb += mFrameBufferConfig.bytes_per_row; - } - } break; - case B_RGB15_BIG: - case B_RGBA15_BIG: - case B_RGB15_LITTLE: - case B_RGBA15_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + y1*mFrameBufferConfig.bytes_per_row); - for (y=y1; y<=y2; y++) - { - for (x=x1; x<=x2; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor15(); - fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - case B_RGB16_BIG: - case B_RGB16_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + y1*mFrameBufferConfig.bytes_per_row); - for (y=y1; y<=y2; y++) - { - for (x=x1; x<=x2; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor16(); - fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - case B_RGB32_BIG: - case B_RGBA32_BIG: - case B_RGB32_LITTLE: - case B_RGBA32_LITTLE: - { - uint32 *fb = (uint32 *)((uint8 *)mFrameBufferConfig.frame_buffer + y1*mFrameBufferConfig.bytes_per_row); - rgb_color color; - for (y=y1; y<=y2; y++) - { - for (x=x1; x<=x2; x++) - { - color = fDrawPattern.ColorAt(x,y).GetColor32(); - fb[x] = (color.alpha << 24) | (color.red << 16) | (color.green << 8) | (color.blue); - } - fb = (uint32 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - default: - printf("Error: Unknown color space\n"); - } -} - -void AccelerantDriver::FillSolidRect(int32 left, int32 top, int32 right, int32 bottom) -{ -#ifndef DISABLE_HARDWARE_ACCELERATION - if ( accFillRect && AcquireEngine ) - { - if ( AcquireEngine(0,0,NULL,&mEngineToken) == B_OK ) - { - fill_rect_params fillParams; - uint32 fill_color=0; - fillParams.right = (uint16)right; - fillParams.left = (uint16)left; - fillParams.top = (uint16)top; - fillParams.bottom = (uint16)bottom; - switch (mDisplayMode.space) - { - case B_CMAP8: - case B_GRAY8: - fill_color = fDrawColor.GetColor8(); - break; - case B_RGB15_BIG: - case B_RGBA15_BIG: - case B_RGB15_LITTLE: - case B_RGBA15_LITTLE: - fill_color = fDrawColor.GetColor15(); - break; - case B_RGB16_BIG: - case B_RGB16_LITTLE: - fill_color = fDrawColor.GetColor16(); - break; - case B_RGB32_BIG: - case B_RGBA32_BIG: - case B_RGB32_LITTLE: - case B_RGBA32_LITTLE: - { - rgb_color rgbcolor = fDrawColor.GetColor32(); - fill_color = (rgbcolor.alpha << 24) | (rgbcolor.red << 16) | (rgbcolor.green << 8) | (rgbcolor.blue); - } - break; - } - accFillRect(mEngineToken, fill_color, &fillParams, 1); - if ( ReleaseEngine ) - ReleaseEngine(mEngineToken,NULL); - Unlock(); - return; - } - } -#endif - - switch (mDisplayMode.space) - { - case B_CMAP8: - case B_GRAY8: - { - uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row; - uint8 color8 = fDrawColor.GetColor8(); - int x,y; - for (y=top; y<=bottom; y++) - { - for (x=left; x<=right; x++) - fb[x] = color8; - fb += mFrameBufferConfig.bytes_per_row; - } - } break; - case B_RGB15_BIG: - case B_RGBA15_BIG: - case B_RGB15_LITTLE: - case B_RGBA15_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); - uint16 color15 = fDrawColor.GetColor15(); - int x,y; - for (y=top; y<=bottom; y++) - { - for (x=left; x<=right; x++) - fb[x] = color15; - fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - case B_RGB16_BIG: - case B_RGB16_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); - uint16 color16 = fDrawColor.GetColor16(); - int x,y; - for (y=top; y<=bottom; y++) - { - for (x=left; x<=right; x++) - fb[x] = color16; - fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - case B_RGB32_BIG: - case B_RGBA32_BIG: - case B_RGB32_LITTLE: - case B_RGBA32_LITTLE: - { - uint32 *fb = (uint32 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); - rgb_color fill_color = fDrawColor.GetColor32(); - uint32 color32 = (fill_color.alpha << 24) | (fill_color.red << 16) | (fill_color.green << 8) | (fill_color.blue); - int x,y; - for (y=top; y<=bottom; y++) - { - for (x=left; x<=right; x++) - fb[x] = color32; - fb = (uint32 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - default: - printf("Error: Unknown color space\n"); - } -} - -void AccelerantDriver::FillPatternRect(int32 left, int32 top, int32 right, int32 bottom) -{ - switch (mDisplayMode.space) - { - case B_CMAP8: - case B_GRAY8: - { - uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row; - int x,y; - for (y=top; y<=bottom; y++) - { - for (x=left; x<=right; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor8(); - fb += mFrameBufferConfig.bytes_per_row; - } - } break; - case B_RGB15_BIG: - case B_RGBA15_BIG: - case B_RGB15_LITTLE: - case B_RGBA15_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); - int x,y; - for (y=top; y<=bottom; y++) - { - for (x=left; x<=right; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor15(); - fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - case B_RGB16_BIG: - case B_RGB16_LITTLE: - { - uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); - int x,y; - for (y=top; y<=bottom; y++) - { - for (x=left; x<=right; x++) - fb[x] = fDrawPattern.ColorAt(x,y).GetColor16(); - fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - case B_RGB32_BIG: - case B_RGBA32_BIG: - case B_RGB32_LITTLE: - case B_RGBA32_LITTLE: - { - uint32 *fb = (uint32 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); - int x,y; - rgb_color color; - for (y=top; y<=bottom; y++) - { - for (x=left; x<=right; x++) - { - color = fDrawPattern.ColorAt(x,y).GetColor32(); - fb[x] = (color.alpha << 24) | (color.red << 16) | (color.green << 8) | (color.blue); - } - fb = (uint32 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); - } - } break; - default: - printf("Error: Unknown color space\n"); - } -} /*! \brief Copies a bitmap to the screen @@ -1525,14 +997,273 @@ void AccelerantDriver::Blit(const BRect &src, const BRect &dest, const DrawData void AccelerantDriver::FillSolidRect(const BRect &rect, RGBColor &color) { + int32 left = (int32)rect.left; + int32 right = (int32)rect.right; + int32 top = (int32)rect.top; + int32 bottom = (int32)rect.bottom; +#ifndef DISABLE_HARDWARE_ACCELERATION + if ( accFillRect && AcquireEngine ) + { + if ( AcquireEngine(0,0,NULL,&mEngineToken) == B_OK ) + { + fill_rect_params fillParams; + uint32 fill_color=0; + fillParams.right = (uint16)right; + fillParams.left = (uint16)left; + fillParams.top = (uint16)top; + fillParams.bottom = (uint16)bottom; + switch (mDisplayMode.space) + { + case B_CMAP8: + case B_GRAY8: + fill_color = color.GetColor8(); + break; + case B_RGB15_BIG: + case B_RGBA15_BIG: + case B_RGB15_LITTLE: + case B_RGBA15_LITTLE: + fill_color = color.GetColor15(); + break; + case B_RGB16_BIG: + case B_RGB16_LITTLE: + fill_color = color.GetColor16(); + break; + case B_RGB32_BIG: + case B_RGBA32_BIG: + case B_RGB32_LITTLE: + case B_RGBA32_LITTLE: + { + rgb_color rgbcolor = color.GetColor32(); + fill_color = (rgbcolor.alpha << 24) | (rgbcolor.red << 16) | (rgbcolor.green << 8) | (rgbcolor.blue); + } + break; + } + accFillRect(mEngineToken, fill_color, &fillParams, 1); + if ( ReleaseEngine ) + ReleaseEngine(mEngineToken,NULL); + Unlock(); + return; + } + } +#endif + + switch (mDisplayMode.space) + { + case B_CMAP8: + case B_GRAY8: + { + uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row; + uint8 color8 = color.GetColor8(); + int x,y; + for (y=top; y<=bottom; y++) + { + for (x=left; x<=right; x++) + fb[x] = color8; + fb += mFrameBufferConfig.bytes_per_row; + } + } break; + case B_RGB15_BIG: + case B_RGBA15_BIG: + case B_RGB15_LITTLE: + case B_RGBA15_LITTLE: + { + uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); + uint16 color15 = color.GetColor15(); + int x,y; + for (y=top; y<=bottom; y++) + { + for (x=left; x<=right; x++) + fb[x] = color15; + fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); + } + } break; + case B_RGB16_BIG: + case B_RGB16_LITTLE: + { + uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); + uint16 color16 = color.GetColor16(); + int x,y; + for (y=top; y<=bottom; y++) + { + for (x=left; x<=right; x++) + fb[x] = color16; + fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); + } + } break; + case B_RGB32_BIG: + case B_RGBA32_BIG: + case B_RGB32_LITTLE: + case B_RGBA32_LITTLE: + { + uint32 *fb = (uint32 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); + rgb_color fill_color = color.GetColor32(); + uint32 color32 = (fill_color.alpha << 24) | (fill_color.red << 16) | (fill_color.green << 8) | (fill_color.blue); + int x,y; + for (y=top; y<=bottom; y++) + { + for (x=left; x<=right; x++) + fb[x] = color32; + fb = (uint32 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); + } + } break; + default: + printf("Error: Unknown color space\n"); + } } void AccelerantDriver::FillPatternRect(const BRect &rect, const DrawData *d) { + int32 left = (int32)rect.left; + int32 right = (int32)rect.right; + int32 top = (int32)rect.top; + int32 bottom = (int32)rect.bottom; + PatternHandler drawPattern(d->patt); + switch (mDisplayMode.space) + { + case B_CMAP8: + case B_GRAY8: + { + uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row; + int x,y; + for (y=top; y<=bottom; y++) + { + for (x=left; x<=right; x++) + fb[x] = drawPattern.ColorAt(x,y).GetColor8(); + fb += mFrameBufferConfig.bytes_per_row; + } + } break; + case B_RGB15_BIG: + case B_RGBA15_BIG: + case B_RGB15_LITTLE: + case B_RGBA15_LITTLE: + { + uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); + int x,y; + for (y=top; y<=bottom; y++) + { + for (x=left; x<=right; x++) + fb[x] = drawPattern.ColorAt(x,y).GetColor15(); + fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); + } + } break; + case B_RGB16_BIG: + case B_RGB16_LITTLE: + { + uint16 *fb = (uint16 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); + int x,y; + for (y=top; y<=bottom; y++) + { + for (x=left; x<=right; x++) + fb[x] = drawPattern.ColorAt(x,y).GetColor16(); + fb = (uint16 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); + } + } break; + case B_RGB32_BIG: + case B_RGBA32_BIG: + case B_RGB32_LITTLE: + case B_RGBA32_LITTLE: + { + uint32 *fb = (uint32 *)((uint8 *)mFrameBufferConfig.frame_buffer + top*mFrameBufferConfig.bytes_per_row); + int x,y; + rgb_color color; + for (y=top; y<=bottom; y++) + { + for (x=left; x<=right; x++) + { + color = drawPattern.ColorAt(x,y).GetColor32(); + fb[x] = (color.alpha << 24) | (color.red << 16) | (color.green << 8) | (color.blue); + } + fb = (uint32 *)((uint8 *)fb + mFrameBufferConfig.bytes_per_row); + } + } break; + default: + printf("Error: Unknown color space\n"); + } } void AccelerantDriver::StrokeSolidLine(const BPoint &start, const BPoint &end, RGBColor &color) { + int32 x1 = ROUND(start.x); + int32 y1 = ROUND(start.y); + int32 x2 = ROUND(end.x); + int32 y2 = ROUND(end.y); + int32 dx = x2 - x1; + int32 dy = y2 - y1; + int32 steps, k; + double xInc, yInc; + double x = x1; + double y = y1; + + // TODO : Convert to Bresenham algorithm + if ( abs(dx) > abs(dy) ) + steps = abs(dx); + else + steps = abs(dy); + xInc = dx / (double) steps; + yInc = dy / (double) steps; + + switch (mDisplayMode.space) + { + case B_CMAP8: + case B_GRAY8: + { + uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer; + uint8 draw_color = color.GetColor8(); + fb[ROUND(y)*mFrameBufferConfig.bytes_per_row + ROUND(x)] = draw_color; + for (k=0; kpatt); + // TODO : Convert to Bresenham algorithm if ( abs(dx) > abs(dy) ) steps = abs(dx); else @@ -1551,17 +1284,79 @@ void AccelerantDriver::StrokePatternLine(int32 x1, int32 y1, int32 x2, int32 y2, xInc = dx / (double) steps; yInc = dy / (double) steps; - //(driver->*setPixel)(ROUND(x),ROUND(y)); - for (k=0; k*setPixel)(ROUND(x),ROUND(y)); + case B_CMAP8: + case B_GRAY8: + { + uint8 *fb = (uint8 *)mFrameBufferConfig.frame_buffer; + fb[ROUND(y)*mFrameBufferConfig.bytes_per_row + ROUND(x)] = drawPattern.ColorAt((float)x,(float)y).GetColor8(); + for (k=0; k