optimize handling of high-res native images
This commit is contained in:
committed by
Vadim Zeitlin
parent
7254515c54
commit
f29faa0217
@@ -41,7 +41,7 @@ WX_NSImage WXDLLIMPEXP_CORE wxOSXGetNSImageFromCGImage( CGImageRef image, double
|
|||||||
WX_NSImage WXDLLIMPEXP_CORE wxOSXGetNSImageFromIconRef( WXHICON iconref );
|
WX_NSImage WXDLLIMPEXP_CORE wxOSXGetNSImageFromIconRef( WXHICON iconref );
|
||||||
WX_NSImage WXDLLIMPEXP_CORE wxOSXGetIconForType(OSType type );
|
WX_NSImage WXDLLIMPEXP_CORE wxOSXGetIconForType(OSType type );
|
||||||
void WXDLLIMPEXP_CORE wxOSXSetImageSize(WX_NSImage image, CGFloat width, CGFloat height);
|
void WXDLLIMPEXP_CORE wxOSXSetImageSize(WX_NSImage image, CGFloat width, CGFloat height);
|
||||||
|
double WXDLLIMPEXP_CORE wxOSXGetImageScaleFactor(WXImage image);
|
||||||
wxBitmap WXDLLIMPEXP_CORE wxOSXCreateSystemBitmap(const wxString& id, const wxString &client, const wxSize& size);
|
wxBitmap WXDLLIMPEXP_CORE wxOSXCreateSystemBitmap(const wxString& id, const wxString &client, const wxSize& size);
|
||||||
WXWindow WXDLLIMPEXP_CORE wxOSXGetMainWindow();
|
WXWindow WXDLLIMPEXP_CORE wxOSXGetMainWindow();
|
||||||
WXWindow WXDLLIMPEXP_CORE wxOSXGetKeyWindow();
|
WXWindow WXDLLIMPEXP_CORE wxOSXGetKeyWindow();
|
||||||
|
@@ -104,8 +104,6 @@ protected :
|
|||||||
|
|
||||||
// Quartz
|
// Quartz
|
||||||
|
|
||||||
WXDLLIMPEXP_CORE CGImageRef wxMacCreateCGImageFromBitmap( const wxBitmap& bitmap );
|
|
||||||
|
|
||||||
WXDLLIMPEXP_CORE CGDataProviderRef wxMacCGDataProviderCreateWithCFData( CFDataRef data );
|
WXDLLIMPEXP_CORE CGDataProviderRef wxMacCGDataProviderCreateWithCFData( CFDataRef data );
|
||||||
WXDLLIMPEXP_CORE CGDataConsumerRef wxMacCGDataConsumerCreateWithCFData( CFMutableDataRef data );
|
WXDLLIMPEXP_CORE CGDataConsumerRef wxMacCGDataConsumerCreateWithCFData( CFMutableDataRef data );
|
||||||
WXDLLIMPEXP_CORE CGDataProviderRef wxMacCGDataProviderCreateWithMemoryBuffer( const wxMemoryBuffer& buf );
|
WXDLLIMPEXP_CORE CGDataProviderRef wxMacCGDataProviderCreateWithMemoryBuffer( const wxMemoryBuffer& buf );
|
||||||
|
@@ -248,11 +248,7 @@ CGContextRef WXDLLIMPEXP_CORE wxOSXCreateBitmapContextFromImage( WXImage nsimage
|
|||||||
{
|
{
|
||||||
double scale = wxOSXGetMainScreenContentScaleFactor();
|
double scale = wxOSXGetMainScreenContentScaleFactor();
|
||||||
|
|
||||||
#if wxOSX_USE_COCOA
|
CGSize imageSize = wxOSXGetImageSize(nsimage);
|
||||||
NSSize imageSize = [nsimage size];
|
|
||||||
#else
|
|
||||||
CGSize imageSize = [nsimage size];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hbitmap = CGBitmapContextCreate(NULL, imageSize.width*scale, imageSize.height*scale, 8, 0, wxMacGetGenericRGBColorSpace(), kCGImageAlphaPremultipliedFirst);
|
hbitmap = CGBitmapContextCreate(NULL, imageSize.width*scale, imageSize.height*scale, 8, 0, wxMacGetGenericRGBColorSpace(), kCGImageAlphaPremultipliedFirst);
|
||||||
CGContextScaleCTM( hbitmap, scale, scale );
|
CGContextScaleCTM( hbitmap, scale, scale );
|
||||||
@@ -329,6 +325,20 @@ void wxOSXSetImageSize(WXImage image, CGFloat width, CGFloat height)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double wxOSXGetImageScaleFactor(WXImage image)
|
||||||
|
{
|
||||||
|
#if wxOSX_USE_COCOA
|
||||||
|
NSSize imagesize = [image size];
|
||||||
|
int width = [[image bestRepresentationForRect:NSMakeRect(0, 0, imagesize.width, imagesize.height) context:nil hints:nil] pixelsWide];
|
||||||
|
if ( width == 0 ) // there are multi-res representations which return 0 for the pixel dimensions
|
||||||
|
return wxOSXGetMainScreenContentScaleFactor();
|
||||||
|
|
||||||
|
return width / [image size].width;
|
||||||
|
#else
|
||||||
|
return [image scale];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
CGSize wxOSXGetImageSize(WXImage image)
|
CGSize wxOSXGetImageSize(WXImage image)
|
||||||
{
|
{
|
||||||
#if wxOSX_USE_COCOA
|
#if wxOSX_USE_COCOA
|
||||||
|
@@ -138,20 +138,6 @@ static size_t GetBestBytesPerRow( size_t rawBytes )
|
|||||||
return (((rawBytes)+kBestByteAlignement-1) & ~(kBestByteAlignement-1) );
|
return (((rawBytes)+kBestByteAlignement-1) & ~(kBestByteAlignement-1) );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if wxUSE_GUI && !defined(__WXOSX_IPHONE__)
|
|
||||||
|
|
||||||
// this is used for more controls than just the wxBitmap button, also for notebooks etc
|
|
||||||
|
|
||||||
CGImageRef wxMacCreateCGImageFromBitmap( const wxBitmap& bitmap )
|
|
||||||
{
|
|
||||||
const wxBitmapRefData * bmap = bitmap.GetBitmapData() ;
|
|
||||||
if ( bmap == NULL )
|
|
||||||
return NULL ;
|
|
||||||
return (CGImageRef) bmap->CreateCGImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //wxUSE_BMPBUTTON
|
|
||||||
|
|
||||||
void wxBitmapRefData::Init()
|
void wxBitmapRefData::Init()
|
||||||
{
|
{
|
||||||
m_nsImage = NULL;
|
m_nsImage = NULL;
|
||||||
@@ -230,6 +216,8 @@ bool wxBitmapRefData::Create( WXImage image )
|
|||||||
|
|
||||||
wxMacCocoaRetain(image);
|
wxMacCocoaRetain(image);
|
||||||
|
|
||||||
|
m_scaleFactor = wxOSXGetImageScaleFactor(image);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +277,7 @@ bool wxBitmapRefData::Create(int w, int h, int d, double logicalscale)
|
|||||||
size_t m_width = wxMax(1, w);
|
size_t m_width = wxMax(1, w);
|
||||||
size_t m_height = wxMax(1, h);
|
size_t m_height = wxMax(1, h);
|
||||||
|
|
||||||
int m_scaleFactor = logicalscale;
|
m_scaleFactor = logicalscale;
|
||||||
m_hBitmap = NULL;
|
m_hBitmap = NULL;
|
||||||
|
|
||||||
size_t m_bytesPerRow = GetBestBytesPerRow(m_width * 4);
|
size_t m_bytesPerRow = GetBestBytesPerRow(m_width * 4);
|
||||||
@@ -314,7 +302,7 @@ int wxBitmapRefData::GetWidth() const
|
|||||||
if ( m_hBitmap )
|
if ( m_hBitmap )
|
||||||
return (int) CGBitmapContextGetWidth(m_hBitmap);
|
return (int) CGBitmapContextGetWidth(m_hBitmap);
|
||||||
else
|
else
|
||||||
return (int) wxOSXGetImageSize(m_nsImage).width;
|
return (int) wxOSXGetImageSize(m_nsImage).width * m_scaleFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBitmapRefData::GetHeight() const
|
int wxBitmapRefData::GetHeight() const
|
||||||
@@ -324,7 +312,7 @@ int wxBitmapRefData::GetHeight() const
|
|||||||
if ( m_hBitmap )
|
if ( m_hBitmap )
|
||||||
return (int) CGBitmapContextGetHeight(m_hBitmap);
|
return (int) CGBitmapContextGetHeight(m_hBitmap);
|
||||||
else
|
else
|
||||||
return (int) wxOSXGetImageSize(m_nsImage).height;
|
return (int) wxOSXGetImageSize(m_nsImage).height * m_scaleFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBitmapRefData::GetDepth() const
|
int wxBitmapRefData::GetDepth() const
|
||||||
@@ -1274,6 +1262,11 @@ wxImage wxBitmap::ConvertToImage() const
|
|||||||
|
|
||||||
wxCHECK_MSG( IsOk(), wxNullImage, wxT("invalid bitmap") );
|
wxCHECK_MSG( IsOk(), wxNullImage, wxT("invalid bitmap") );
|
||||||
|
|
||||||
|
// this call may trigger a conversion from platform image to bitmap, issue it
|
||||||
|
// before any measurements are taken, multi-resolution platform images may be
|
||||||
|
// rendered incorrectly otherwise
|
||||||
|
unsigned char* sourcestart = (unsigned char*) GetBitmapData()->GetRawAccess() ;
|
||||||
|
|
||||||
// create an wxImage object
|
// create an wxImage object
|
||||||
int width = GetWidth();
|
int width = GetWidth();
|
||||||
int height = GetHeight();
|
int height = GetHeight();
|
||||||
@@ -1282,8 +1275,6 @@ wxImage wxBitmap::ConvertToImage() const
|
|||||||
unsigned char *data = image.GetData();
|
unsigned char *data = image.GetData();
|
||||||
wxCHECK_MSG( data, wxNullImage, wxT("Could not allocate data for image") );
|
wxCHECK_MSG( data, wxNullImage, wxT("Could not allocate data for image") );
|
||||||
|
|
||||||
unsigned char* sourcestart = (unsigned char*) GetBitmapData()->GetRawAccess() ;
|
|
||||||
|
|
||||||
bool hasAlpha = false ;
|
bool hasAlpha = false ;
|
||||||
bool hasMask = false ;
|
bool hasMask = false ;
|
||||||
int maskBytesPerRow = 0 ;
|
int maskBytesPerRow = 0 ;
|
||||||
|
Reference in New Issue
Block a user