From 67387a90b7deefbc676ea50a5939613717f66fea Mon Sep 17 00:00:00 2001 From: DarkWyrm Date: Sun, 15 Feb 2004 20:27:26 +0000 Subject: [PATCH] Removed the crash in ViewDriver when moving the cursor off the bottom edge of the screen Replaced LayerData component of Decorator with DrawData Fixed unfocused draw bug in DefaultDecorator::DrawBlendedRect Added some copying methods to FBBitmap and ServerBitmap Removed a lot of disabled code from ViewDriver file Implemented and fixed font functions in DisplayDriver Updates to the BitmapDriver to the reflect changes in DisplayDriver git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6602 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/BitmapDriver.cpp | 663 ++++++++------------ src/servers/app/server/BitmapDriver.h | 13 +- src/servers/app/server/Decorator.cpp | 6 +- src/servers/app/server/DefaultDecorator.cpp | 59 +- src/servers/app/server/DisplayDriver.cpp | 194 +++++- src/servers/app/server/ViewDriver.cpp | 616 ++---------------- src/servers/app/server/ViewDriver.h | 8 +- 7 files changed, 516 insertions(+), 1043 deletions(-) diff --git a/src/servers/app/server/BitmapDriver.cpp b/src/servers/app/server/BitmapDriver.cpp index 3b4293cdb2..db6fc8df4a 100644 --- a/src/servers/app/server/BitmapDriver.cpp +++ b/src/servers/app/server/BitmapDriver.cpp @@ -118,212 +118,6 @@ void BitmapDriver::SetMode(const display_mode &mode) // No need to reset a bitmap's color space } -// This function is intended to eventually take care of most of the heavy lifting for -// DrawBitmap in 32-bit mode, with others coming later. Right now, it is *just* used for -// the -void BitmapDriver::BlitBitmap(ServerBitmap *sourcebmp,BRect sourcerect, BRect destrect, drawing_mode mode) -{ - // Another internal function called from other functions. - - if(!sourcebmp) - return; - - if(sourcebmp->BitsPerPixel() != _target->BitsPerPixel()) - return; - - uint8 colorspace_size=sourcebmp->BitsPerPixel()/8; - // First, clip source rect to destination - if(sourcerect.Width() > destrect.Width()) - sourcerect.right=sourcerect.left+destrect.Width(); - - - if(sourcerect.Height() > destrect.Height()) - sourcerect.bottom=sourcerect.top+destrect.Height(); - - - // Second, check rectangle bounds against their own bitmaps - BRect work_rect; - - work_rect=sourcebmp->Bounds(); - - if( !(work_rect.Contains(sourcerect)) ) - { // something in selection must be clipped - if(sourcerect.left < 0) - sourcerect.left = 0; - if(sourcerect.right > work_rect.right) - sourcerect.right = work_rect.right; - if(sourcerect.top < 0) - sourcerect.top = 0; - if(sourcerect.bottom > work_rect.bottom) - sourcerect.bottom = work_rect.bottom; - } - - work_rect.Set(0,0,_target->Width()-1,_target->Height()-1); - - // Check to see if we actually need to copy anything - if( (destrect.rightwork_rect.right) || - (destrect.bottomwork_rect.bottom) ) - return; - - // 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; - - // Set pointers to the actual data - uint8 *src_bits = (uint8*) sourcebmp->Bits(); - uint8 *dest_bits = (uint8*) _target->Bits(); - - // Get row widths for offset looping - uint32 src_width = uint32 (sourcebmp->BytesPerRow()); - uint32 dest_width = uint32 (_target->BytesPerRow()); - - // Offset bitmap pointers to proper spot in each bitmap - src_bits += uint32 ( (sourcerect.top * src_width) + (sourcerect.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 (destrect.bottom-destrect.top+1); - - switch(mode) - { - case B_OP_OVER: - { -// uint32 srow_pixels=src_width>>2; - uint32 srow_pixels=((destrect.IntegerWidth()>=sourcerect.IntegerWidth())?src_width:destrect.IntegerWidth()+1)>>2; - uint8 *srow_index, *drow_index; - - - // This could later be optimized to use uint32's for faster copying - for (uint32 pos_y=0; pos_y!=lines; pos_y++) - { - - srow_index=src_bits; - drow_index=dest_bits; - - for(uint32 pos_x=0; pos_x!=srow_pixels;pos_x++) - { - // 32-bit RGBA32 mode byte order is BGRA - if(srow_index[3]>127) - { - *drow_index=*srow_index; drow_index++; srow_index++; - *drow_index=*srow_index; drow_index++; srow_index++; - *drow_index=*srow_index; drow_index++; srow_index++; - // we don't copy the alpha channel - drow_index++; srow_index++; - } - else - { - srow_index+=4; - drow_index+=4; - } - } - - // Increment offsets - src_bits += src_width; - dest_bits += dest_width; - } - break; - } - default: // B_OP_COPY - { - for (uint32 pos_y = 0; pos_y != lines; pos_y++) - { - memcpy(dest_bits,src_bits,line_length); - - // Increment offsets - src_bits += src_width; - dest_bits += dest_width; - } - break; - } - } -} - -void BitmapDriver::ExtractToBitmap(ServerBitmap *destbmp,BRect destrect, BRect sourcerect) -{ - // Another internal function called from other functions. Extracts data from - // the framebuffer to a target ServerBitmap - - if(!destbmp) - return; - - if(destbmp->BitsPerPixel() != _target->BitsPerPixel()) - return; - - uint8 colorspace_size=destbmp->BitsPerPixel()/8; - // First, clip source rect to destination - if(sourcerect.Width() > destrect.Width()) - sourcerect.right=sourcerect.left+destrect.Width(); - - - if(sourcerect.Height() > destrect.Height()) - sourcerect.bottom=sourcerect.top+destrect.Height(); - - - // Second, check rectangle bounds against their own bitmaps - BRect work_rect; - - work_rect.Set( destbmp->Bounds().left, - destbmp->Bounds().top, - destbmp->Bounds().right, - destbmp->Bounds().bottom ); - 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,_target->Width()-1,_target->Height()-1); - - if( !(work_rect.Contains(sourcerect)) ) - { // something in selection must be clipped - if(sourcerect.left < 0) - sourcerect.left = 0; - if(sourcerect.right > work_rect.right) - sourcerect.right = work_rect.right; - if(sourcerect.top < 0) - sourcerect.top = 0; - if(sourcerect.bottom > work_rect.bottom) - sourcerect.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 ( (sourcerect.top * src_width) + (sourcerect.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 (destrect.bottom-destrect.top+1); - - for (uint32 pos_y = 0; pos_y != lines; pos_y++) - { - memcpy(dest_bits,src_bits,line_length); - - // Increment offsets - src_bits += src_width; - dest_bits += dest_width; - } -} - void BitmapDriver::InvertRect(const BRect &r) { Lock(); @@ -374,207 +168,6 @@ void BitmapDriver::InvertRect(const BRect &r) Unlock(); } -/* -void BitmapDriver::BlitMono2RGB32(FT_Bitmap *src, BPoint pt, LayerData *d) -{ - rgb_color color=d->highcolor.GetColor32(); - - // pointers to the top left corner of the area to be copied in each bitmap - uint8 *srcbuffer, *destbuffer; - - // index pointers which are incremented during the course of the blit - uint8 *srcindex, *destindex, *rowptr, value; - - // increment values for the index pointers - int32 srcinc=src->pitch, destinc=_target->BytesPerRow(); - - int16 i,j,k, srcwidth=src->pitch, srcheight=src->rows; - int32 x=(int32)pt.x,y=(int32)pt.y; - - // starting point in source bitmap - srcbuffer=(uint8*)src->buffer; - - if(y<0) - { - if(y_target->Height()) - { - if(y>pt.y) - y--; - srcheight-=(y+srcheight-1)-_target->Height(); - } - - if(x+srcwidth>_target->Width()) - { - if(x>pt.x) - x--; - srcwidth-=(x+srcwidth-1)-_target->Width(); - } - - if(x<0) - { - if(x>3; - srcwidth-=0-x; - destbuffer+=(0-x)*4; - } - - // starting point in destination bitmap - destbuffer=(uint8*)_target->Bits()+int32( (pt.y*_target->BytesPerRow())+(pt.x*4) ); - - srcindex=srcbuffer; - destindex=destbuffer; - - for(i=0; ihighcolor.GetColor32(), lowcolor=d->lowcolor.GetColor32(); float rstep,gstep,bstep,astep; - - rstep=float(highcolor.red-lowcolor.red)/255.0; - gstep=float(highcolor.green-lowcolor.green)/255.0; - bstep=float(highcolor.blue-lowcolor.blue)/255.0; - astep=float(highcolor.alpha-lowcolor.alpha)/255.0; - - // increment values for the index pointers - int32 x=(int32)pt.x, - y=(int32)pt.y, - srcinc=src->pitch, -// destinc=dest->BytesPerRow(), - destinc=_target->BytesPerRow(), - srcwidth=src->width, - srcheight=src->rows, - incval=0; - - int16 i,j; - - // starting point in source bitmap - srcbuffer=(uint8*)src->buffer; - - // starting point in destination bitmap -// destbuffer=(uint8*)dest->Bits()+(y*dest->BytesPerRow()+(x*4)); - destbuffer=(uint8*)_target->Bits()+(y*_target->BytesPerRow()+(x*4)); - - - if(y<0) - { - if(y_target->Height()) - { - if(y>pt.y) - y--; - srcheight-=(y+srcheight-1)-_target->Height(); - } - - if(x+srcwidth>_target->Width()) - { - if(x>pt.x) - x--; - srcwidth-=(x+srcwidth-1)-_target->Width(); - } - - if(x<0) - { - if(xdraw_mode==B_OP_COPY) - { - rowptr[0]=uint8(highcolor.blue-(value*bstep)); - rowptr[1]=uint8(highcolor.green-(value*gstep)); - rowptr[2]=uint8(highcolor.red-(value*rstep)); - rowptr[3]=255; - } - else - if(d->draw_mode==B_OP_OVER) - { - if(highcolor.alpha>127) - { - rowptr[0]=uint8(highcolor.blue-(value*(float(highcolor.blue-rowptr[0])/255.0))); - rowptr[1]=uint8(highcolor.green-(value*(float(highcolor.green-rowptr[1])/255.0))); - rowptr[2]=uint8(highcolor.red-(value*(float(highcolor.red-rowptr[2])/255.0))); - rowptr[3]=255; - } - } - } - rowptr+=4; - - } - - srcindex+=srcinc; - destindex+=destinc; - } -} -*/ - rgb_color BitmapDriver::GetBlitColor(rgb_color src, rgb_color dest, DrawData *d, bool use_high) { rgb_color returncolor={0,0,0,0}; @@ -1010,7 +603,261 @@ void BitmapDriver::FillPatternRect(int32 left, int32 top, int32 right, int32 bot } */ -void BitmapDriver::DrawBitmap(ServerBitmap *bmp, const BRect &src, const BRect &dest, DrawData *d) +void BitmapDriver::DrawBitmap(ServerBitmap *sourcebmp, const BRect &source, + const BRect &dest, DrawData *d) +{ + // Another internal function called from other functions. + + if(!sourcebmp | !d) + return; + + if(sourcebmp->BitsPerPixel() != _target->BitsPerPixel()) + return; + + uint8 colorspace_size=sourcebmp->BitsPerPixel()/8; + + BRect sourcerect(source),destrect(dest); + + // First, clip source rect to destination + if(sourcerect.Width() > destrect.Width()) + sourcerect.right=sourcerect.left+destrect.Width(); + + + if(sourcerect.Height() > destrect.Height()) + sourcerect.bottom=sourcerect.top+destrect.Height(); + + + // Second, check rectangle bounds against their own bitmaps + BRect work_rect; + + work_rect=sourcebmp->Bounds(); + + if( !(work_rect.Contains(sourcerect)) ) + { // something in selection must be clipped + if(sourcerect.left < 0) + sourcerect.left = 0; + if(sourcerect.right > work_rect.right) + sourcerect.right = work_rect.right; + if(sourcerect.top < 0) + sourcerect.top = 0; + if(sourcerect.bottom > work_rect.bottom) + sourcerect.bottom = work_rect.bottom; + } + + work_rect.Set(0,0,_target->Width()-1,_target->Height()-1); + + // Check to see if we actually need to copy anything + if( (destrect.rightwork_rect.right) || + (destrect.bottomwork_rect.bottom) ) + return; + + // 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; + + // Set pointers to the actual data + uint8 *src_bits = (uint8*) sourcebmp->Bits(); + uint8 *dest_bits = (uint8*) _target->Bits(); + + // Get row widths for offset looping + uint32 src_width = uint32 (sourcebmp->BytesPerRow()); + uint32 dest_width = uint32 (_target->BytesPerRow()); + + // Offset bitmap pointers to proper spot in each bitmap + src_bits += uint32 ( (sourcerect.top * src_width) + (sourcerect.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 (destrect.bottom-destrect.top+1); + + switch(d->draw_mode) + { + case B_OP_OVER: + { +// uint32 srow_pixels=src_width>>2; + uint32 srow_pixels=((destrect.IntegerWidth()>=sourcerect.IntegerWidth())?src_width:destrect.IntegerWidth()+1)>>2; + uint8 *srow_index, *drow_index; + + + // This could later be optimized to use uint32's for faster copying + for (uint32 pos_y=0; pos_y!=lines; pos_y++) + { + + srow_index=src_bits; + drow_index=dest_bits; + + for(uint32 pos_x=0; pos_x!=srow_pixels;pos_x++) + { + // 32-bit RGBA32 mode byte order is BGRA + if(srow_index[3]>127) + { + *drow_index=*srow_index; drow_index++; srow_index++; + *drow_index=*srow_index; drow_index++; srow_index++; + *drow_index=*srow_index; drow_index++; srow_index++; + // we don't copy the alpha channel + drow_index++; srow_index++; + } + else + { + srow_index+=4; + drow_index+=4; + } + } + + // Increment offsets + src_bits += src_width; + dest_bits += dest_width; + } + break; + } + default: // B_OP_COPY + { + for (uint32 pos_y = 0; pos_y != lines; pos_y++) + { + memcpy(dest_bits,src_bits,line_length); + + // Increment offsets + src_bits += src_width; + dest_bits += dest_width; + } + break; + } + } +} + + +bool BitmapDriver::AcquireBuffer(FBBitmap *fbmp) +{ + if(!fbmp) + return false; + + fbmp->ServerBitmap::ShallowCopy(_target); + + return true; +} + +void BitmapDriver::ReleaseBuffer(void) { } +void BitmapDriver::Blit(const BRect &src, const BRect &dest, const DrawData *d) +{ +} + +void BitmapDriver::FillSolidRect(const BRect &rect, RGBColor &color) +{ +} + +void BitmapDriver::FillPatternRect(const BRect &rect, const DrawData *d) +{ +} + +void BitmapDriver::StrokeSolidLine(const BPoint &start, const BPoint &end, RGBColor &color) +{ +} + +void BitmapDriver::StrokePatternLine(const BPoint &start, const BPoint &end, const DrawData *d) +{ +} + +void BitmapDriver::StrokeSolidRect(const BRect &rect, RGBColor &color) +{ +} + +void BitmapDriver::CopyBitmap(ServerBitmap *bitmap, const BRect &source, const BRect &dest, const DrawData *d) +{ +} + +void BitmapDriver::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_yCountChars(); - float pixwidth=_driver->StringWidth(_title_string->String(),strlength,&_layerdata); + float pixwidth=_driver->StringWidth(_title_string->String(),strlength,&_drawdata); while(strlength>=0) { @@ -315,7 +315,7 @@ int32 Decorator::_ClipTitle(float width) return strlength; strlength--; - pixwidth=_driver->StringWidth(_title_string->String(),strlength,&_layerdata); + pixwidth=_driver->StringWidth(_title_string->String(),strlength,&_drawdata); } } return 0; diff --git a/src/servers/app/server/DefaultDecorator.cpp b/src/servers/app/server/DefaultDecorator.cpp index c86ce990a3..524570116f 100644 --- a/src/servers/app/server/DefaultDecorator.cpp +++ b/src/servers/app/server/DefaultDecorator.cpp @@ -208,7 +208,7 @@ STRACE(("DefaultDecorator: Do Layout\n")); if(strlen(GetTitle())>1) { if(_driver) - titlepixelwidth=_driver->StringWidth(GetTitle(),_TitleWidth(), &_layerdata); + titlepixelwidth=_driver->StringWidth(GetTitle(),_TitleWidth(), &_drawdata); else titlepixelwidth=10; @@ -329,8 +329,8 @@ void DefaultDecorator::_DrawTitle(BRect r) STRACE(("_DrawTitle(%f,%f,%f,%f)\n", r.left, r.top, r.right, r.bottom)); // Designed simply to redraw the title when it has changed on // the client side. - _layerdata.highcolor=_colors->window_tab_text; - _layerdata.lowcolor=(GetFocus())?_colors->window_tab:_colors->inactive_window_tab; + _drawdata.highcolor=_colors->window_tab_text; + _drawdata.lowcolor=(GetFocus())?_colors->window_tab:_colors->inactive_window_tab; int32 titlecount=_ClipTitle((_zoomrect.left-textoffset)-(_closerect.right+textoffset)); BString titlestr( GetTitle() ); @@ -346,10 +346,10 @@ void DefaultDecorator::_DrawTitle(BRect r) // is a little different. If it isn't moved, title placement looks really funky if(_look==B_FLOATING_WINDOW_LOOK) _driver->DrawString(titlestr.String(),titlecount, - BPoint(_closerect.right+textoffset,_closerect.bottom+1),&_layerdata); + BPoint(_closerect.right+textoffset,_closerect.bottom+1),&_drawdata); else _driver->DrawString(titlestr.String(),titlecount, - BPoint(_closerect.right+textoffset,_closerect.bottom),&_layerdata); + BPoint(_closerect.right+textoffset,_closerect.bottom),&_drawdata); } void DefaultDecorator::_SetFocus(void) @@ -452,34 +452,13 @@ void DefaultDecorator::DrawBlendedRect(BRect r, bool down) { // This bad boy is used to draw a rectangle with a gradient. // Note that it is not part of the Decorator API - it's specific - // to just the DefaultDecorator. Called by DrawZoom and DrawClose + // to just the BeDecorator. Called by DrawZoom and DrawClose - RGBColor temprgbcol(175,123,0); - _driver->StrokeLine( r.LeftTop(), - BPoint( r.left, r.bottom - 1 ), - temprgbcol); - _driver->StrokeLine( r.LeftTop(), - BPoint( r.right - 1, r.top ), - temprgbcol); - _driver->StrokeLine( BPoint( r.right - 1, r.top + 2), - BPoint( r.right - 1, r.bottom - 1), - temprgbcol); - _driver->StrokeLine( BPoint( r.left + 2, r.bottom -1), - BPoint( r.right - 2, r.bottom - 1), - temprgbcol); - - temprgbcol.SetColor(255,255,0); - _driver->StrokeRect( BRect( r.left + 1, r.top + 1, - r.right, r.bottom), - temprgbcol); - - r.InsetBy( 2, 2 ); - - + // Actually just draws a blended square int32 w=r.IntegerWidth(), h=r.IntegerHeight(); - + + RGBColor temprgbcol; rgb_color halfcol, startcol, endcol; -// rgb_color tmpcol; float rstep,gstep,bstep,i; int steps=(wStrokeLine(BPoint(r.left,r.top+i), BPoint(r.left+i,r.top),temprgbcol); -/* SetRGBColor(&tmpcol, uint8(halfcol.red-(i*rstep)), - uint8(halfcol.green-(i*gstep)), - uint8(halfcol.blue-(i*bstep))); - _layerdata.highcolor=tmpcol; -*/ temprgbcol.SetColor(uint8(halfcol.red-(i*rstep)), uint8(halfcol.green-(i*gstep)), uint8(halfcol.blue-(i*bstep))); @@ -527,6 +496,10 @@ void DefaultDecorator::DrawBlendedRect(BRect r, bool down) _driver->StrokeLine(BPoint(r.left+steps,r.top+i), BPoint(r.left+i,r.top+steps),temprgbcol); } + +// _layerdata.highcolor=startcol; +// _driver->FillRect(r,&_layerdata,pat_solidhigh); + _driver->StrokeRect(r,framecolors[3]); } void DefaultDecorator::_DrawFrame(BRect invalid) @@ -537,8 +510,8 @@ STRACE(("_DrawFrame(%f,%f,%f,%f)\n", invalid.left, invalid.top, // we must clip the lines drawn by this function to the invalid rectangle we are given #ifdef USE_VIEW_FILL_HACK - _layerdata.highcolor = RGBColor( 192, 192, 192 ); - _driver->FillRect(_frame,_layerdata.highcolor); + _drawdata.highcolor = RGBColor( 192, 192, 192 ); + _driver->FillRect(_frame,_drawdata.highcolor); #endif if(_look == B_NO_BORDER_WINDOW_LOOK) @@ -810,7 +783,7 @@ STRACE(("_DrawFrame(%f,%f,%f,%f)\n", invalid.left, invalid.top, //do(draw) nothing! } else{ - _driver->StrokeLineArray(points,numlines,&_layerdata,colors); + _driver->StrokeLineArray(points,numlines,&_drawdata,colors); } delete rightindices; diff --git a/src/servers/app/server/DisplayDriver.cpp b/src/servers/app/server/DisplayDriver.cpp index 1f54efdbc8..8b17eabec8 100644 --- a/src/servers/app/server/DisplayDriver.cpp +++ b/src/servers/app/server/DisplayDriver.cpp @@ -31,6 +31,7 @@ #include "FontFamily.h" #include #include "DisplayDriver.h" +#include "RectUtils.h" #include "ServerCursor.h" // TODO: Major cleanup is left. Public functions should be repsonsible for locking. @@ -315,6 +316,16 @@ void DisplayDriver::DrawBitmap(ServerBitmap *bmp, const BRect &src, const BRect { } +void DisplayDriver::DrawString(const char *string, const int32 &length, const BPoint &pt, RGBColor &color, escapement_delta *delta) +{ + DrawData d; + d.highcolor=color; + + if(delta) + d.edelta=*delta; + DrawString(string,length,pt,&d); +} + /*! \brief Utilizes the font engine to draw a string to the frame buffer \param string String to be drawn. Always non-NULL. @@ -482,16 +493,23 @@ void DisplayDriver::DrawString(const char *string, const int32 &length, const BP void DisplayDriver::BlitMono2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawData *d) { -/* rgb_color color=d->highcolor.GetColor32(); + rgb_color color=d->highcolor.GetColor32(); // pointers to the top left corner of the area to be copied in each bitmap uint8 *srcbuffer, *destbuffer; + FBBitmap framebuffer; + + if(!AcquireBuffer(&framebuffer)) + { + printf("ERROR: Couldn't acquire framebuffer in BlitMono2RGB32\n"); + return; + } // index pointers which are incremented during the course of the blit uint8 *srcindex, *destindex, *rowptr, value; // increment values for the index pointers - int32 srcinc=src->pitch, destinc=framebuffer->BytesPerRow(); + int32 srcinc=src->pitch, destinc=framebuffer.BytesPerRow(); int16 i,j,k, srcwidth=src->pitch, srcheight=src->rows; int32 x=(int32)pt.x,y=(int32)pt.y; @@ -508,18 +526,18 @@ void DisplayDriver::BlitMono2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD destbuffer+=destinc * (0-y); } - if(y+srcheight>framebuffer->Bounds().IntegerHeight()) + if(y+srcheight>framebuffer.Bounds().IntegerHeight()) { if(y>pt.y) y--; - srcheight-=(y+srcheight-1)-framebuffer->Bounds().IntegerHeight(); + srcheight-=(y+srcheight-1)-framebuffer.Bounds().IntegerHeight(); } - if(x+srcwidth>framebuffer->Bounds().IntegerWidth()) + if(x+srcwidth>framebuffer.Bounds().IntegerWidth()) { if(x>pt.x) x--; - srcwidth-=(x+srcwidth-1)-framebuffer->Bounds().IntegerWidth(); + srcwidth-=(x+srcwidth-1)-framebuffer.Bounds().IntegerWidth(); } if(x<0) @@ -532,7 +550,7 @@ void DisplayDriver::BlitMono2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD } // starting point in destination bitmap - destbuffer=(uint8*)framebuffer->Bits()+int32( (pt.y*framebuffer->BytesPerRow())+(pt.x*4) ); + destbuffer=(uint8*)framebuffer.Bits()+int32( (pt.y*framebuffer.BytesPerRow())+(pt.x*4) ); srcindex=srcbuffer; destindex=destbuffer; @@ -562,13 +580,21 @@ void DisplayDriver::BlitMono2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD srcindex+=srcinc; destindex+=destinc; } -*/ + Invalidate(BRect(0,0,srcwidth,srcheight)); + ReleaseBuffer(); } void DisplayDriver::BlitGray2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawData *d) { -/* // pointers to the top left corner of the area to be copied in each bitmap + // pointers to the top left corner of the area to be copied in each bitmap uint8 *srcbuffer=NULL, *destbuffer=NULL; + FBBitmap framebuffer; + + if(!AcquireBuffer(&framebuffer)) + { + printf("Couldn't acquire framebuffer in DisplayDriver::BlitGray2RGB32"); + return; + } // index pointers which are incremented during the course of the blit uint8 *srcindex=NULL, *destindex=NULL, *rowptr=NULL; @@ -585,7 +611,7 @@ void DisplayDriver::BlitGray2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD y=(int32)pt.y, srcinc=src->pitch, // destinc=dest->BytesPerRow(), - destinc=framebuffer->BytesPerRow(), + destinc=framebuffer.BytesPerRow(), srcwidth=src->width, srcheight=src->rows, incval=0; @@ -596,8 +622,7 @@ void DisplayDriver::BlitGray2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD srcbuffer=(uint8*)src->buffer; // starting point in destination bitmap -// destbuffer=(uint8*)dest->Bits()+(y*dest->BytesPerRow()+(x*4)); - destbuffer=(uint8*)framebuffer->Bits()+(y*framebuffer->BytesPerRow()+(x*4)); + destbuffer=(uint8*)framebuffer.Bits()+(y*framebuffer.BytesPerRow()+(x*4)); if(y<0) @@ -612,18 +637,18 @@ void DisplayDriver::BlitGray2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD destbuffer+=incval * destinc; } - if(y+srcheight>framebuffer->Bounds().IntegerHeight()) + if(y+srcheight>framebuffer.Bounds().IntegerHeight()) { if(y>pt.y) y--; - srcheight-=(y+srcheight-1)-framebuffer->Bounds().IntegerHeight(); + srcheight-=(y+srcheight-1)-framebuffer.Bounds().IntegerHeight(); } - if(x+srcwidth>framebuffer->Bounds().IntegerWidth()) + if(x+srcwidth>framebuffer.Bounds().IntegerWidth()) { if(x>pt.x) x--; - srcwidth-=(x+srcwidth-1)-framebuffer->Bounds().IntegerWidth(); + srcwidth-=(x+srcwidth-1)-framebuffer.Bounds().IntegerWidth(); } if(x<0) @@ -677,7 +702,8 @@ void DisplayDriver::BlitGray2RGB32(FT_Bitmap *src, const BPoint &pt, const DrawD srcindex+=srcinc; destindex+=destinc; } -*/ + Invalidate(BRect(0,0,srcwidth,srcheight)); + ReleaseBuffer(); } bool DisplayDriver::AcquireBuffer(FBBitmap *bmp) @@ -689,6 +715,10 @@ void DisplayDriver::ReleaseBuffer(void) { } +void DisplayDriver::Invalidate(const BRect &r) +{ +} + void DisplayDriver::FillArc(const BRect &r, const float &angle, const float &span, RGBColor &color) { } @@ -1679,6 +1709,12 @@ void DisplayDriver::InvertRect(const BRect &r) */ void DisplayDriver::ShowCursor(void) { + if(!_cursor) + { + printf("ERROR: Call to ShowCursor and driver has no defined cursor\n"); + return; + } + Lock(); _is_cursor_hidden=false; @@ -2359,7 +2395,72 @@ ServerBitmap *DisplayDriver::DumpToBitmap(void) */ float DisplayDriver::StringWidth(const char *string, int32 length, const DrawData *d) { - return 0.0; + if(!string || !d) + return 0.0; + Lock(); + + const ServerFont *font=&(d->font); + FontStyle *style=font->Style(); + + if(!style) + return 0.0; + + FT_Face face; + FT_GlyphSlot slot; + FT_UInt glyph_index=0, previous=0; + FT_Vector pen,delta; + int16 error=0; + int32 strlength,i; + float returnval; + + error=FT_New_Face(ftlib, style->GetPath(), 0, &face); + if(error) + { + Unlock(); + return 0.0; + } + + slot=face->glyph; + + bool use_kerning=FT_HAS_KERNING(face) && font->Spacing()==B_STRING_SPACING; + + error=FT_Set_Char_Size(face, 0,int32(font->Size())*64,72,72); + if(error) + { + Unlock(); + return 0.0; + } + + // set the pen position in 26.6 cartesian space coordinates + pen.x=0; + + slot=face->glyph; + + strlength=strlen(string); + if(lengthadvance.x; + previous=glyph_index; + } + + FT_Done_Face(face); + Unlock(); + + returnval=pen.x>>6; + return returnval; } /*! @@ -2376,7 +2477,61 @@ float DisplayDriver::StringWidth(const char *string, int32 length, const DrawDat */ float DisplayDriver::StringHeight(const char *string, int32 length, const DrawData *d) { - return 0.0; + if(!string || !d) + return 0.0; + Lock(); + + const ServerFont *font=&(d->font); + FontStyle *style=font->Style(); + + if(!style) + { + Unlock(); + return 0.0; + } + + FT_Face face; + FT_GlyphSlot slot; + int16 error=0; + int32 strlength,i; + float returnval=0.0,ascent=0.0,descent=0.0; + + error=FT_New_Face(ftlib, style->GetPath(), 0, &face); + if(error) + { + Unlock(); + return 0.0; + } + + slot=face->glyph; + + error=FT_Set_Char_Size(face, 0,int32(font->Size())*64,72,72); + if(error) + { + Unlock(); + return 0.0; + } + + slot=face->glyph; + + strlength=strlen(string); + if(lengthmetrics.horiBearingYmetrics.height) + descent=MAX((slot->metrics.height-slot->metrics.horiBearingY)>>6,descent); + else + ascent=MAX(slot->bitmap.rows,ascent); + } + + FT_Done_Face(face); + + Unlock(); + returnval=ascent+descent; + return returnval; } /*! @@ -2710,6 +2865,7 @@ void DisplayDriver::HLinePatternThick(int32 x1, int32 x2, int32 y) void DisplayDriver::VLinePatternThick(int32 x1, int32 x2, int32 y) { } + /* void DisplayDriver::FillSolidRect(int32 left, int32 top, int32 right, int32 bottom) { diff --git a/src/servers/app/server/ViewDriver.cpp b/src/servers/app/server/ViewDriver.cpp index 9e94a0106a..e2f1978a3d 100644 --- a/src/servers/app/server/ViewDriver.cpp +++ b/src/servers/app/server/ViewDriver.cpp @@ -416,78 +416,7 @@ void VDWindow::MessageReceived(BMessage *msg) view->serverlink->Flush(); break; } -/* case VDWIN_SHOWCURSOR: - { - if(view->hide_cursor>0) - view->hide_cursor--; - - if(view->hide_cursor==0) - view->Invalidate(view->cursorframe); - - break; - } - case VDWIN_HIDECURSOR: - { - view->hide_cursor++; - if(view->hide_cursor==1) - view->Invalidate(view->cursorframe); - break; - } - case VDWIN_OBSCURECURSOR: - { - view->obscure_cursor=true; - view->Invalidate(view->cursorframe); - break; - } - case VDWIN_MOVECURSOR: - { - float x,y; - msg->FindFloat("x",&x); - msg->FindFloat("y",&y); - - // this was changed because an extra message was - // sent even though the mouse was never moved - if(view->cursorframe.left!=x || view->cursorframe.top!=y) - { - if(view->obscure_cursor) - view->obscure_cursor=false; - - view->oldcursorframe=view->cursorframe; - view->cursorframe.OffsetTo(x,y); - } - - if(view->hide_cursor==0) - view->Invalidate(view->oldcursorframe); - break; - } - case VDWIN_SETCURSOR: - { - ServerBitmap *cdata; - msg->FindPointer("SCursor",(void**)&cdata); - - if(cdata!=NULL) - { - BBitmap *bmp=new BBitmap(cdata->Bounds(), B_RGBA32); - - // Copy the server bitmap in the cursor to a BBitmap - uint8 *sbmppos=(uint8*)cdata->Bits(), - *bbmppos=(uint8*)bmp->Bits(); - - int32 bytes=cdata->BytesPerRow(), - bbytes=bmp->BytesPerRow(); - - for(int i=0;iBounds().IntegerHeight();i++) - memcpy(bbmppos+(i*bbytes), sbmppos+(i*bytes), bytes); - - // Replace the bitmap - delete view->cursor; - view->cursor=bmp; - view->Invalidate(view->cursorframe); - break; - } - break; - } -*/ default: + default: BWindow::MessageReceived(msg); break; } @@ -940,487 +869,6 @@ void ViewDriver::SetDrawData(const DrawData *d, bool set_font_data) framebuffer->Unlock(); } -/* -float ViewDriver::StringWidth(const char *string, int32 length, DrawData *d) -{ - if(!string || !d || !is_initialized) - return 0.0; - screenwin->Lock(); - - ServerFont *font=&(d->font); - FontStyle *style=font->Style(); - - if(!style) - return 0.0; - - FT_Face face; - FT_GlyphSlot slot; - FT_UInt glyph_index=0, previous=0; - FT_Vector pen,delta; - int16 error=0; - int32 strlength,i; - float returnval; - - error=FT_New_Face(ftlib, style->GetPath(), 0, &face); - if(error) - { - screenwin->Unlock(); - return 0.0; - } - - slot=face->glyph; - - bool use_kerning=FT_HAS_KERNING(face) && font->Spacing()==B_STRING_SPACING; - - error=FT_Set_Char_Size(face, 0,int32(font->Size())*64,72,72); - if(error) - { - screenwin->Unlock(); - return 0.0; - } - - // set the pen position in 26.6 cartesian space coordinates - pen.x=0; - - slot=face->glyph; - - strlength=strlen(string); - if(lengthadvance.x; - previous=glyph_index; - } - screenwin->Unlock(); - - FT_Done_Face(face); - - returnval=pen.x>>6; - return returnval; -} - -float ViewDriver::StringHeight(const char *string, int32 length, DrawData *d) -{ - if(!string || !d || !is_initialized) - return 0.0; - screenwin->Lock(); - - ServerFont *font=&(d->font); - FontStyle *style=font->Style(); - - if(!style) - { - screenwin->Unlock(); - return 0.0; - } - - FT_Face face; - FT_GlyphSlot slot; - int16 error=0; - int32 strlength,i; - float returnval=0.0,ascent=0.0,descent=0.0; - - error=FT_New_Face(ftlib, style->GetPath(), 0, &face); - if(error) - return 0.0; - - slot=face->glyph; - - error=FT_Set_Char_Size(face, 0,int32(font->Size())*64,72,72); - if(error) - { - screenwin->Unlock(); - return 0.0; - } - - slot=face->glyph; - - strlength=strlen(string); - if(lengthmetrics.horiBearingYmetrics.height) - descent=MAX((slot->metrics.height-slot->metrics.horiBearingY)>>6,descent); - else - ascent=MAX(slot->bitmap.rows,ascent); - } - screenwin->Unlock(); - - FT_Done_Face(face); - - returnval=ascent+descent; - return returnval; -} -*/ -/* -void ViewDriver::DrawString(const char *string, int32 length, BPoint pt, DrawData *d, escapement_delta *edelta) -{ - if(!is_initialized) - return; - - if(!string || !d ) - return; - screenwin->Lock(); - - pt.y--; // because of Be's backward compatibility hack - - ServerFont *font=&(d->font); - FontStyle *style=font->Style(); - - if(!style) - return; - - FT_Face face; - FT_GlyphSlot slot; - FT_Matrix rmatrix,smatrix; - FT_UInt glyph_index=0, previous=0; - FT_Vector pen,delta,space,nonspace; - int16 error=0; - int32 strlength,i; - Angle rotation(font->Rotation()), shear(font->Shear()); - -// bool antialias=( (font->Size()<18 && font->Flags()& B_DISABLE_ANTIALIASING==0) -// || font->Flags()& B_FORCE_ANTIALIASING)?true:false; - - bool antialias=(font->Flags()& B_DISABLE_ANTIALIASING==1)?false:true; - - // Originally, I thought to do this shear checking here, but it really should be - // done in BFont::SetShear() - float shearangle=shear.Value(); - if(shearangle>135) - shearangle=135; - if(shearangle<45) - shearangle=45; - - if(shearangle>90) - shear=90+((180-shearangle)*2); - else - shear=90-(90-shearangle)*2; - - error=FT_New_Face(ftlib, style->GetPath(), 0, &face); - if(error) - return; - - slot=face->glyph; - - bool use_kerning=FT_HAS_KERNING(face) && font->Spacing()==B_STRING_SPACING; - - error=FT_Set_Char_Size(face, 0,int32(font->Size())*64,72,72); - if(error) - return; - - // if we do any transformation, we do a call to FT_Set_Transform() here - - // First, rotate - rmatrix.xx = (FT_Fixed)( rotation.Cosine()*0x10000); - rmatrix.xy = (FT_Fixed)(-rotation.Sine()*0x10000); - rmatrix.yx = (FT_Fixed)( rotation.Sine()*0x10000); - rmatrix.yy = (FT_Fixed)( rotation.Cosine()*0x10000); - - // Next, shear - smatrix.xx = (FT_Fixed)(0x10000); - smatrix.xy = (FT_Fixed)(-shear.Cosine()*0x10000); - smatrix.yx = (FT_Fixed)(0); - smatrix.yy = (FT_Fixed)(0x10000); - - FT_Matrix_Multiply(&rmatrix,&smatrix); - - // Set up the increment value for escapement padding - space.x=int32(d->edelta.space * rotation.Cosine()*64); - space.y=int32(d->edelta.space * rotation.Sine()*64); - nonspace.x=int32(d->edelta.nonspace * rotation.Cosine()*64); - nonspace.y=int32(d->edelta.nonspace * rotation.Sine()*64); - - // set the pen position in 26.6 cartesian space coordinates - pen.x=(int32)pt.x * 64; - pen.y=(int32)pt.y * 64; - - slot=face->glyph; - - - strlength=strlen(string); - if(lengthbitmap, - BPoint(slot->bitmap_left,pt.y-(slot->bitmap_top-pt.y)), d); - else - BlitMono2RGB32(&slot->bitmap, - BPoint(slot->bitmap_left,pt.y-(slot->bitmap_top-pt.y)), d); - } - - // increment pen position - pen.x+=slot->advance.x; - pen.y+=slot->advance.y; - previous=glyph_index; - } - - // TODO: implement properly - // calculate the invalid rectangle - BRect r; - r.left=MIN(pt.x,pen.x>>6); - r.right=MAX(pt.x,pen.x>>6); - r.top=pt.y-face->height; - r.bottom=pt.y+face->height; - - screenwin->view->Invalidate(r); - screenwin->Unlock(); - - FT_Done_Face(face); -} -*/ - -void ViewDriver::BlitMono2RGB32(FT_Bitmap *src, BPoint pt, DrawData *d) -{ - if(!is_initialized) - return; - - rgb_color color=d->highcolor.GetColor32(); - - // pointers to the top left corner of the area to be copied in each bitmap - uint8 *srcbuffer, *destbuffer; - - // index pointers which are incremented during the course of the blit - uint8 *srcindex, *destindex, *rowptr, value; - - // increment values for the index pointers - int32 srcinc=src->pitch, destinc=framebuffer->BytesPerRow(); - - int16 i,j,k, srcwidth=src->pitch, srcheight=src->rows; - int32 x=(int32)pt.x,y=(int32)pt.y; - - // starting point in source bitmap - srcbuffer=(uint8*)src->buffer; - - if(y<0) - { - if(yframebuffer->Bounds().IntegerHeight()) - { - if(y>pt.y) - y--; - srcheight-=(y+srcheight-1)-framebuffer->Bounds().IntegerHeight(); - } - - if(x+srcwidth>framebuffer->Bounds().IntegerWidth()) - { - if(x>pt.x) - x--; - srcwidth-=(x+srcwidth-1)-framebuffer->Bounds().IntegerWidth(); - } - - if(x<0) - { - if(x>3; - srcwidth-=0-x; - destbuffer+=(0-x)*4; - } - - // starting point in destination bitmap - destbuffer=(uint8*)framebuffer->Bits()+int32( (pt.y*framebuffer->BytesPerRow())+(pt.x*4) ); - - srcindex=srcbuffer; - destindex=destbuffer; - - for(i=0; ihighcolor.GetColor32(), lowcolor=d->lowcolor.GetColor32(); float rstep,gstep,bstep,astep; - - rstep=float(highcolor.red-lowcolor.red)/255.0; - gstep=float(highcolor.green-lowcolor.green)/255.0; - bstep=float(highcolor.blue-lowcolor.blue)/255.0; - astep=float(highcolor.alpha-lowcolor.alpha)/255.0; - - // increment values for the index pointers - int32 x=(int32)pt.x, - y=(int32)pt.y, - srcinc=src->pitch, -// destinc=dest->BytesPerRow(), - destinc=framebuffer->BytesPerRow(), - srcwidth=src->width, - srcheight=src->rows, - incval=0; - - int16 i,j; - - // starting point in source bitmap - srcbuffer=(uint8*)src->buffer; - - // starting point in destination bitmap -// destbuffer=(uint8*)dest->Bits()+(y*dest->BytesPerRow()+(x*4)); - destbuffer=(uint8*)framebuffer->Bits()+(y*framebuffer->BytesPerRow()+(x*4)); - - - if(y<0) - { - if(yframebuffer->Bounds().IntegerHeight()) - { - if(y>pt.y) - y--; - srcheight-=(y+srcheight-1)-framebuffer->Bounds().IntegerHeight(); - } - - if(x+srcwidth>framebuffer->Bounds().IntegerWidth()) - { - if(x>pt.x) - x--; - srcwidth-=(x+srcwidth-1)-framebuffer->Bounds().IntegerWidth(); - } - - if(x<0) - { - if(xdraw_mode==B_OP_COPY) - { - rowptr[0]=uint8(highcolor.blue-(value*bstep)); - rowptr[1]=uint8(highcolor.green-(value*gstep)); - rowptr[2]=uint8(highcolor.red-(value*rstep)); - rowptr[3]=255; - } - else - if(d->draw_mode==B_OP_OVER) - { - if(highcolor.alpha>127) - { - rowptr[0]=uint8(highcolor.blue-(value*(float(highcolor.blue-rowptr[0])/255.0))); - rowptr[1]=uint8(highcolor.green-(value*(float(highcolor.green-rowptr[1])/255.0))); - rowptr[2]=uint8(highcolor.red-(value*(float(highcolor.red-rowptr[2])/255.0))); - rowptr[3]=255; - } - } - } - rowptr+=4; - - } - - srcindex+=srcinc; - destindex+=destinc; - } -} - rgb_color ViewDriver::GetBlitColor(rgb_color src, rgb_color dest, DrawData *d, bool use_high) { rgb_color returncolor={0,0,0,0}; @@ -1701,9 +1149,6 @@ void ViewDriver::CopyBitmap(ServerBitmap *bitmap, const BRect &source, const BRe void ViewDriver::CopyToBitmap(ServerBitmap *destbmp, const BRect &sourcerect) { - // TODO: BUG: CRASH: There is a crash on memcpy whenever the cursor is saved and it - // is clipped to the bottom edge of the screen. - if(!is_initialized || !destbmp) { printf("CopyToBitmap returned - not init or NULL bitmap\n"); @@ -1729,14 +1174,11 @@ void ViewDriver::CopyToBitmap(ServerBitmap *destbmp, const BRect &sourcerect) // Second, check rectangle bounds against their own bitmaps - BRect work_rect; - - work_rect.Set( destbmp->Bounds().left, - destbmp->Bounds().top, - destbmp->Bounds().right, - destbmp->Bounds().bottom ); + BRect work_rect(destbmp->Bounds()); + if( !(work_rect.Contains(destrect)) ) - { // something in selection must be clipped + { + // something in selection must be clipped if(destrect.left < 0) destrect.left = 0; if(destrect.right > work_rect.right) @@ -1749,8 +1191,12 @@ void ViewDriver::CopyToBitmap(ServerBitmap *destbmp, const BRect &sourcerect) 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 + { + // something in selection must be clipped if(source.left < 0) source.left = 0; if(source.right > work_rect.right) @@ -1772,10 +1218,11 @@ void ViewDriver::CopyToBitmap(ServerBitmap *destbmp, const BRect &sourcerect) // 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 (destrect.bottom-destrect.top+1); + + 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_yLock(); + framebuffer->Lock(); + + fbmp->SetBytesPerRow(framebuffer->BytesPerRow()); + fbmp->SetSpace(framebuffer->ColorSpace()); + fbmp->SetSize(framebuffer->Bounds().IntegerWidth(), framebuffer->Bounds().IntegerHeight()); + fbmp->SetBuffer(framebuffer->Bits()); + fbmp->SetBitsPerPixel(framebuffer->ColorSpace(),framebuffer->BytesPerRow()); + + return true; +} + +void ViewDriver::ReleaseBuffer(void) +{ + if(!is_initialized) + return; + framebuffer->Unlock(); + screenwin->Unlock(); +} + +void ViewDriver::Invalidate(const BRect &r) +{ + if(!is_initialized) + return; + + screenwin->Lock(); + screenwin->view->Invalidate(); + screenwin->Unlock(); +} diff --git a/src/servers/app/server/ViewDriver.h b/src/servers/app/server/ViewDriver.h index 68b5a136b5..8eaef5b01f 100644 --- a/src/servers/app/server/ViewDriver.h +++ b/src/servers/app/server/ViewDriver.h @@ -138,8 +138,12 @@ protected: void CopyBitmap(ServerBitmap *bitmap, const BRect &source, const BRect &dest, const DrawData *d); void CopyToBitmap(ServerBitmap *target, const BRect &source); - void BlitMono2RGB32(FT_Bitmap *src, BPoint pt, DrawData *d); - void BlitGray2RGB32(FT_Bitmap *src, BPoint pt, DrawData *d); + bool AcquireBuffer(FBBitmap *fbmp); + void ReleaseBuffer(void); + void Invalidate(const BRect &r); + +// void BlitMono2RGB32(FT_Bitmap *src, BPoint pt, DrawData *d); +// void BlitGray2RGB32(FT_Bitmap *src, BPoint pt, DrawData *d); rgb_color GetBlitColor(rgb_color src, rgb_color dest, DrawData *d, bool use_high=true); int hide_cursor; bool obscure_cursor;