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 delete fBitmap; 60 fBitmap = NULL; 61 62 if (newWidth <= 0 || newHeight <= 0) 63 return B_OK; 64 65 fBitmap = new(std::nothrow) UtilityBitmap(BRect(0, 0, newWidth - 1, 66 newHeight - 1), fColorSpace, 0); 67 if (fBitmap == NULL) 68 return B_NO_MEMORY; 69 70 fHWInterface = new(std::nothrow) BitmapHWInterface(fBitmap); 71 if (fHWInterface == NULL) 72 return B_NO_MEMORY; 73 74 status_t result = fHWInterface->Initialize(); 75 if (result != B_OK) 76 return result; 77 78 // we have to set a valid clipping first 79 fClipping.Set(fBitmap->Bounds()); 80 ConstrainClippingRegion(&fClipping); 81 SetHWInterface(fHWInterface); 82 return B_OK; 83 } 84 85 86 UtilityBitmap* 87 BitmapDrawingEngine::ExportToBitmap(int32 width, int32 height, 88 color_space space) 89 { 90 if (width <= 0 || height <= 0) 91 return NULL; 92 93 UtilityBitmap *result = new(std::nothrow) UtilityBitmap(BRect(0, 0, 94 width - 1, height - 1), space, 0); 95 if (result == NULL) 96 return NULL; 97 98 if (result->ImportBits(fBitmap->Bits(), fBitmap->BitsLength(), 99 fBitmap->BytesPerRow(), fBitmap->ColorSpace()) != B_OK) { 100 delete result; 101 return NULL; 102 } 103 104 return result; 105 } 106