Example #1
0
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();
}
Example #3
0
_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();
}