OffscreenBitmap::OffscreenBitmap(BRect frame, color_space colorSpace) : fFrame(frame) , fColorSpace(colorSpace) , fStatus(B_ERROR) , fBitmap(NULL) , fView(NULL) { BBitmap *bitmap = new BBitmap(frame, fColorSpace, true); AutoDelete<BBitmap> _bitmap(bitmap); if (bitmap == NULL || bitmap->IsValid() == false || bitmap->InitCheck() != B_OK) return; BView *view = new BView(frame, "offscreen", B_FOLLOW_ALL, B_WILL_DRAW); AutoDelete<BView> _view(view); if (view == NULL) return; bitmap->Lock(); bitmap->AddChild(view); // bitmap is locked during the life time of this object fBitmap = _bitmap.Release(); fView = _view.Release(); fStatus = B_OK; }
_bitmap _mainFrame::getIcon( _programHandle handle ) { _program* prog = handle.get(); if( prog && prog->getHeader().windowIcon ) return prog->getHeader().windowIcon; return _bitmap(); }
_bitmap _imageFile::readBitmap( _optValue<_u32> page ) { // Check if not-existing if( !this->isExisting() ) return _bitmap(); _mimeType mimeType = this->getRealMime(); if( mimeType == _mime::image_png ) { if( this->bufferedImage ) return *bufferedImage; _bitmap result; YsRawPngDecoder* pngDecoder = new YsRawPngDecoder; pngDecoder->Decode( this->filename.c_str() ); if( pngDecoder->wid > 0 && pngDecoder->hei > 0 && pngDecoder->rgba != NULL ) { // Allocate bitmap result = _bitmap( pngDecoder->wid , pngDecoder->hei ); // Get size of Data (in bytes)(every pixel consists of u8 red, u8 green, u8 blue, u8 alpha) _u32 size = pngDecoder->wid * pngDecoder->hei; _pixelArray base = result.getBitmap(); _u8* source = pngDecoder->rgba; do { _u8 r = *source++; _u8 g = *source++; _u8 b = *source++; bool a = *source++ > 127; *base++ = _color::fromRGB8(r,g,b,a); } while( --size > 0 ); } // Delete the decoder delete pngDecoder; if( this->buffer ) { this->bufferedImage = new _bitmap( move(result) ); return *this->bufferedImage; } return move(result); } else if( mimeType == _mime::image_jpeg ) { if( this->bufferedImage ) return *bufferedImage; _bitmap result; _u32 size = this->getSize(); _byte* data = new _byte[size]; this->read( data , size ); Jpeg::Decoder* jpgDecoder = new Jpeg::Decoder( data , size ); if ( jpgDecoder->GetResult() == Jpeg::Decoder::OK ) { result = _bitmap( jpgDecoder->GetWidth() , jpgDecoder->GetHeight() ); if( jpgDecoder->IsColor() ) { _u32 size = jpgDecoder->GetImageSize(); _u8* rgb = jpgDecoder->GetImage(); _pixelArray dest = result.getBitmap(); do { _u8 r = *rgb++; _u8 g = *rgb++; _u8 b = *rgb++; *dest++ = _color::fromRGB8(r,g,b); size -= 3; } while( size > 0 ); } else { _u32 size = jpgDecoder->GetImageSize(); _u8* rgb = jpgDecoder->GetImage(); _pixelArray dest = result.getBitmap(); do { *dest++ = _color::fromBW8( *rgb++ ); } while( --size > 0 ); } } delete[] data; delete jpgDecoder; if( this->buffer ) { this->bufferedImage = new _bitmap( move(result) ); return *this->bufferedImage; } return move(result); } else if( mimeType == _mime::image_bmp ) { if( this->bufferedImage ) return *bufferedImage; _bitmap result; _u32 size = this->getSize(); _byte* data = new _byte[size]; this->read( data , size ); _u32 width; _u32 height; _pixelArray pixeldata = GenericBMPDecoder::decode( data , size , width , height ); if ( pixeldata != nullptr ) { result = _bitmap( width , height ); memcpy16( result.getBitmap() , pixeldata , width * height ); delete[] pixeldata; } delete[] data; if( this->buffer ) { this->bufferedImage = new _bitmap( move(result) ); return *this->bufferedImage; } return move(result); } else if( mimeType == _mime::image_ico ) { _byte* data; if( this->bufferedData ) data = this->bufferedData; else { _u32 size = this->getSize(); data = new _byte[size]; this->read( data , size ); } _u32 width; _u32 height; _bitmap result; _u8* pixeldata = GenericIcoDecoder::decode( data , width , height , page ); if ( pixeldata != nullptr ) { // Allocate bitmap result = _bitmap( width , height ); // Get size of Data (in bytes)(every pixel consists of u8 red, u8 green, u8 blue, u8 alpha) _u32 size = width * height; _pixelArray base = result.getBitmap(); _u8* source = pixeldata; do { _u8 r = *source++; _u8 g = *source++; _u8 b = *source++; bool a = *source++ > 127; *base++ = _color::fromRGB8(r,g,b,a); } while( --size > 0 ); delete[] pixeldata; } if( !this->buffer ) delete[] data; else this->bufferedData = data; return result; } else if( mimeType == _mime::image_gif ) { gif_animation* gifAnim; gif_result statusCode = GIF_OK; // Allocate Decoder if( this->bufferedGif ) gifAnim = this->bufferedGif; else { // Read file content to buffer _u32 size = this->getSize(); _byte* data = new _byte[size]; this->read( data , size ); // Allocate Decoder gifAnim = new gif_animation; // Initialize Decoder gif_create( gifAnim ); // Partly Decode the gif do { statusCode = gif_initialise( gifAnim , size , data ); if (statusCode != GIF_OK && statusCode != GIF_WORKING) { _imageFile::outputGifWarning( "gif_initialise" , statusCode); break; } } while( statusCode != GIF_OK ); } if( !this->bufferedGifBitmap ) this->bufferedGifBitmap = new _bitmap( gifAnim->width , gifAnim->height , _color::transparent ); // Limit Page Number if( gifAnim->frame_count <= page ) page = gifAnim->frame_count -1; // Decode... statusCode = gif_decode_frame(gifAnim, page); // ... and Check if everything went ok if (statusCode != GIF_OK) _imageFile::outputGifWarning( "gif_decode_frame" , statusCode ); // Get destination bitmap _pixelArray dest = this->bufferedGifBitmap->getBitmap(); // Get Source bitmap _u8* source = (_u8*)gifAnim->frame_image; // Copy source bitmap to destination _length numPixels = gifAnim->height * gifAnim->width; do { *dest++ = _color::fromRGB8( source[0] , source[1] , source[2] , source[3] ); source += 4; } while( --numPixels > 0 ); // Clean temps if( this->buffer ) this->bufferedGif = gifAnim; else { delete[] gifAnim->gif_data; delete gifAnim; } return *this->bufferedGifBitmap; } return _bitmap(); }