1 #include "BitmapDrawingEngine.h" 2 #include "BitmapHWInterface.h" 3 #include "ServerBitmap.h" 4 #include <new> 5 6 7 BitmapDrawingEngine::BitmapDrawingEngine(color_space colorSpace) 8 : DrawingEngine(), 9 fColorSpace(colorSpace), 10 fHWInterface(NULL), 11 fBitmap(NULL) 12 { 13 } 14 15 16 BitmapDrawingEngine::~BitmapDrawingEngine() 17 { 18 SetSize(0, 0); 19 } 20 21 22 #if DEBUG 23 bool 24 BitmapDrawingEngine::IsParallelAccessLocked() const 25 { 26 // We don't share the HWInterface instance that the Painter is 27 // attached to, so we never need to be locked. 28 return true; 29 } 30 #endif 31 32 33 bool 34 BitmapDrawingEngine::IsExclusiveAccessLocked() const 35 { 36 // See IsParallelAccessLocked(). 37 return true; 38 } 39 40 41 status_t 42 BitmapDrawingEngine::SetSize(int32 newWidth, int32 newHeight) 43 { 44 if (fBitmap != NULL && newWidth > 0 && newHeight > 0 45 && fBitmap->Bounds().IntegerWidth() >= newWidth 46 && fBitmap->Bounds().IntegerHeight() >= newHeight) { 47 return B_OK; 48 } 49 50 SetHWInterface(NULL); 51 if (fHWInterface) { 52 fHWInterface->LockExclusiveAccess(); 53 fHWInterface->Shutdown(); 54 fHWInterface->UnlockExclusiveAccess(); 55 delete fHWInterface; 56 fHWInterface = NULL; 57 } 58 59 fBitmap->ReleaseReference(); 60 61 if (newWidth <= 0 || newHeight <= 0) 62 return B_OK; 63 64 fBitmap = new(std::nothrow) UtilityBitmap(BRect(0, 0, newWidth - 1, 65 newHeight - 1), fColorSpace, 0); 66 if (fBitmap == NULL) 67 return B_NO_MEMORY; 68 69 fHWInterface = new(std::nothrow) BitmapHWInterface(fBitmap); 70 if (fHWInterface == NULL) 71 return B_NO_MEMORY; 72 73 status_t result = fHWInterface->Initialize(); 74 if (result != B_OK) 75 return result; 76 77 // we have to set a valid clipping first 78 fClipping.Set(fBitmap->Bounds()); 79 ConstrainClippingRegion(&fClipping); 80 SetHWInterface(fHWInterface); 81 return B_OK; 82 } 83 84 85 UtilityBitmap* 86 BitmapDrawingEngine::ExportToBitmap(int32 width, int32 height, 87 color_space space) 88 { 89 if (width <= 0 || height <= 0) 90 return NULL; 91 92 UtilityBitmap *result = new(std::nothrow) UtilityBitmap(BRect(0, 0, 93 width - 1, height - 1), space, 0); 94 if (result == NULL) 95 return NULL; 96 97 if (result->ImportBits(fBitmap->Bits(), fBitmap->BitsLength(), 98 fBitmap->BytesPerRow(), fBitmap->ColorSpace()) != B_OK) { 99 delete result; 100 return NULL; 101 } 102 103 return result; 104 } 105