Surface8u convertGdiplusBitmap( Gdiplus::Bitmap &bitmap ) { Gdiplus::BitmapData bitmapData; Gdiplus::Rect rect( 0, 0, bitmap.GetWidth(), bitmap.GetHeight() ); Gdiplus::PixelFormat requestedFormat = bitmap.GetPixelFormat(); SurfaceChannelOrder sco; bool premult; gdiplusPixelFormatToSurfaceChannelOrder( requestedFormat, &sco, &premult ); if( sco == SurfaceChannelOrder::UNSPECIFIED ) { UINT flags = bitmap.GetFlags(); sco = ( flags & Gdiplus::ImageFlagsHasAlpha ) ? SurfaceChannelOrder::BGRA : SurfaceChannelOrder::BGR; requestedFormat = ( flags & Gdiplus::ImageFlagsHasAlpha ) ? PixelFormat32bppARGB : PixelFormat24bppRGB; } bitmap.LockBits( &rect, Gdiplus::ImageLockModeRead, requestedFormat, &bitmapData ); Surface8u result( bitmap.GetWidth(), bitmap.GetHeight(), sco.hasAlpha(), sco ); const uint8_t *srcDataBase = (uint8_t*)bitmapData.Scan0; int32_t width = bitmap.GetWidth(); for( uint32_t y = 0; y < bitmap.GetHeight(); ++y ) { memcpy( result.getData( Vec2i( 0, y ) ), srcDataBase + y * bitmapData.Stride, width * result.getPixelInc() ); } bitmap.UnlockBits( &bitmapData ); return result; }
SurfaceT<T>::SurfaceT( int32_t aWidth, int32_t aHeight, bool alpha, SurfaceChannelOrder aChannelOrder ) { SurfaceChannelOrder channelOrder = aChannelOrder; if( channelOrder == SurfaceChannelOrder::UNSPECIFIED ) channelOrder = ( alpha ) ? SurfaceChannelOrder::RGBA : SurfaceChannelOrder::RGB; int32_t rowBytes = aWidth * sizeof(T) * channelOrder.getPixelInc(); T *data = new T[aHeight * rowBytes]; mObj = std::shared_ptr<Obj>( new Obj( aWidth, aHeight, channelOrder, data, true, rowBytes ) ); }
void Texture::SurfaceChannelOrderToDataFormatAndType( const SurfaceChannelOrder &sco, GLint *dataFormat, GLenum *type ) { switch( sco.getCode() ) { case SurfaceChannelOrder::RGB: *dataFormat = GL_RGB; *type = GL_UNSIGNED_BYTE; break; case SurfaceChannelOrder::RGBA: case SurfaceChannelOrder::RGBX: *dataFormat = GL_RGBA; *type = GL_UNSIGNED_BYTE; break; case SurfaceChannelOrder::BGRA: case SurfaceChannelOrder::BGRX: *dataFormat = GL_BGRA; *type = GL_UNSIGNED_BYTE; break; #if ! defined( CINDER_GLES ) case SurfaceChannelOrder::BGR: *dataFormat = GL_BGR; *type = GL_UNSIGNED_BYTE; break; case SurfaceChannelOrder::ARGB: *dataFormat = GL_BGRA; *type = GL_UNSIGNED_INT_8_8_8_8; break; #endif // ! defined( CINDER_GLES ) default: throw TextureDataExc( "Invalid channel order" ); // this is an unsupported channel order for a texture break; } }
SurfaceCache( int32_t width, int32_t height, SurfaceChannelOrder sco, int numSurfaces ) : mWidth( width ), mHeight( height ), mSCO( sco ) { for( int i = 0; i < numSurfaces; ++i ) { mSurfaceData.push_back( std::shared_ptr<uint8_t>( new uint8_t[width*height*sco.getPixelInc()], std::default_delete<uint8_t[]>() ) ); mSurfaceUsed.push_back( false ); } }
SurfaceCache( int32_t width, int32_t height, SurfaceChannelOrder sco, int numSurfaces ) : mWidth( width ), mHeight( height ), mSCO( sco ) { for( int i = 0; i < numSurfaces; ++i ) { mSurfaceData.push_back( std::shared_ptr<uint8_t>( new uint8_t[width*height*sco.getPixelInc()], checked_array_deleter<uint8_t>() ) ); mDeallocatorRefcon.push_back( make_pair( this, i ) ); mSurfaceUsed.push_back( false ); } }
Gdiplus::PixelFormat surfaceChannelOrderToGdiplusPixelFormat( const SurfaceChannelOrder &sco, bool premultiplied ) { switch( sco.getCode() ) { case SurfaceChannelOrder::BGR: return PixelFormat24bppRGB; break; case SurfaceChannelOrder::BGRX: // untested code path return PixelFormat32bppRGB; break; case SurfaceChannelOrder::BGRA: return ( premultiplied ) ? PixelFormat32bppPARGB : PixelFormat32bppARGB; break; default: return PixelFormatUndefined; } }
int32_t SurfaceConstraintsCairo::getRowBytes( int requestedWidth, const SurfaceChannelOrder &sco, int elementSize ) const { return cairo_format_stride_for_width( sco.hasAlpha() ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, requestedWidth ); }