mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
factor out CGImageRef etc., instead of recreating it every frame
This commit is contained in:
parent
2fecaa6173
commit
d1dd45c29d
@ -157,6 +157,11 @@ P3DInstance(P3D_request_ready_func *func,
|
||||
_shared_mmap_size = 0;
|
||||
_swbuffer = NULL;
|
||||
_reversed_buffer = NULL;
|
||||
_buffer_data = NULL;
|
||||
_data_provider = NULL;
|
||||
_buffer_color_space = NULL;
|
||||
_buffer_image = NULL;
|
||||
|
||||
// We have to start with _mouse_active true; firefox doesn't send
|
||||
// activate events.
|
||||
_mouse_active = true;
|
||||
@ -305,16 +310,7 @@ P3DInstance::
|
||||
CFRelease(_frame_timer);
|
||||
}
|
||||
|
||||
if (_swbuffer != NULL) {
|
||||
SubprocessWindowBuffer::destroy_buffer(_shared_fd, _shared_mmap_size,
|
||||
_shared_filename, _swbuffer);
|
||||
_swbuffer = NULL;
|
||||
}
|
||||
|
||||
if (_reversed_buffer != NULL) {
|
||||
delete[] _reversed_buffer;
|
||||
_reversed_buffer = NULL;
|
||||
}
|
||||
free_swbuffer();
|
||||
#endif
|
||||
|
||||
DESTROY_LOCK(_request_lock);
|
||||
@ -481,21 +477,7 @@ set_wparams(const P3DWindowParams &wparams) {
|
||||
if (_swbuffer == NULL || _swbuffer->get_x_size() != x_size ||
|
||||
_swbuffer->get_y_size() != y_size) {
|
||||
// We need to open a new shared buffer.
|
||||
if (_swbuffer != NULL) {
|
||||
SubprocessWindowBuffer::destroy_buffer(_shared_fd, _shared_mmap_size,
|
||||
_shared_filename, _swbuffer);
|
||||
_swbuffer = NULL;
|
||||
}
|
||||
if (_reversed_buffer != NULL) {
|
||||
delete[] _reversed_buffer;
|
||||
_reversed_buffer = NULL;
|
||||
}
|
||||
|
||||
_swbuffer = SubprocessWindowBuffer::new_buffer
|
||||
(_shared_fd, _shared_mmap_size, _shared_filename, x_size, y_size);
|
||||
if (_swbuffer != NULL) {
|
||||
_reversed_buffer = new char[_swbuffer->get_framebuffer_size()];
|
||||
}
|
||||
alloc_swbuffer();
|
||||
}
|
||||
|
||||
if (_swbuffer == NULL) {
|
||||
@ -3022,7 +3004,8 @@ get_framebuffer() {
|
||||
// conventions between Panda and Mac).
|
||||
for (int yi = 0; yi < y_size; ++yi) {
|
||||
#ifndef __BIG_ENDIAN__
|
||||
// On a little-endian machine, we only have to reverse the order of the rows.
|
||||
// On a little-endian machine, we only have to reverse the order
|
||||
// of the rows.
|
||||
memcpy(_reversed_buffer + (y_size - 1 - yi) * rowsize,
|
||||
(char *)framebuffer + yi * rowsize,
|
||||
rowsize);
|
||||
@ -3137,32 +3120,14 @@ paint_window_osx_cgcontext(CGContextRef context) {
|
||||
|
||||
int x_size = min(_wparams.get_win_width(), _swbuffer->get_x_size());
|
||||
int y_size = min(_wparams.get_win_height(), _swbuffer->get_y_size());
|
||||
size_t rowsize = _swbuffer->get_row_size();
|
||||
|
||||
CGContextTranslateCTM(context, 0, y_size);
|
||||
CGContextScaleCTM(context, 1.0, -1.0);
|
||||
|
||||
CFDataRef data =
|
||||
CFDataCreateWithBytesNoCopy(NULL, (const UInt8 *)_reversed_buffer,
|
||||
y_size * rowsize, kCFAllocatorNull);
|
||||
|
||||
CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
|
||||
//CGColorSpaceRef color_space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
|
||||
CGColorSpaceRef color_space = CGColorSpaceCreateDeviceRGB();
|
||||
|
||||
CGImageRef image =
|
||||
CGImageCreate(x_size, y_size, 8, 32, rowsize, color_space,
|
||||
kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,
|
||||
provider, NULL, false, kCGRenderingIntentDefault);
|
||||
|
||||
CGRect region = { { 0, 0 }, { x_size, y_size } };
|
||||
CGContextDrawImage(context, region, image);
|
||||
|
||||
CGImageRelease(image);
|
||||
CGColorSpaceRelease(color_space);
|
||||
CGDataProviderRelease(provider);
|
||||
|
||||
CFRelease(data);
|
||||
if (_buffer_image != NULL) {
|
||||
CGRect region = { { 0, 0 }, { x_size, y_size } };
|
||||
CGContextDrawImage(context, region, _buffer_image);
|
||||
}
|
||||
}
|
||||
#endif // __APPLE__
|
||||
|
||||
@ -3504,6 +3469,76 @@ parse_hexdigit(int &result, char digit) {
|
||||
|
||||
#ifdef __APPLE__
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: P3DInstance::alloc_swbuffer
|
||||
// Access: Private
|
||||
// Description: OSX only: allocates the _swbuffer and associated
|
||||
// support objects. If it was already allocated,
|
||||
// deallocates the previous one first.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void P3DInstance::
|
||||
alloc_swbuffer() {
|
||||
free_swbuffer();
|
||||
|
||||
int x_size = _wparams.get_win_width();
|
||||
int y_size = _wparams.get_win_height();
|
||||
|
||||
_swbuffer = SubprocessWindowBuffer::new_buffer
|
||||
(_shared_fd, _shared_mmap_size, _shared_filename, x_size, y_size);
|
||||
if (_swbuffer != NULL) {
|
||||
_reversed_buffer = new char[_swbuffer->get_framebuffer_size()];
|
||||
size_t rowsize = _swbuffer->get_row_size();
|
||||
|
||||
_buffer_data = CFDataCreateWithBytesNoCopy(NULL, (const UInt8 *)_reversed_buffer,
|
||||
y_size * rowsize, kCFAllocatorNull);
|
||||
|
||||
_data_provider = CGDataProviderCreateWithCFData(_buffer_data);
|
||||
_buffer_color_space = CGColorSpaceCreateDeviceRGB();
|
||||
|
||||
_buffer_image = CGImageCreate(x_size, y_size, 8, 32, rowsize, _buffer_color_space,
|
||||
kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,
|
||||
_data_provider, NULL, false, kCGRenderingIntentDefault);
|
||||
|
||||
}
|
||||
}
|
||||
#endif // __APPLE__
|
||||
|
||||
#ifdef __APPLE__
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: P3DInstance::free_swbuffer
|
||||
// Access: Private
|
||||
// Description: OSX only: releases the _swbuffer and associated
|
||||
// support objects previously allocated by
|
||||
// alloc_swbuffer().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void P3DInstance::
|
||||
free_swbuffer() {
|
||||
if (_swbuffer != NULL) {
|
||||
SubprocessWindowBuffer::destroy_buffer(_shared_fd, _shared_mmap_size,
|
||||
_shared_filename, _swbuffer);
|
||||
_swbuffer = NULL;
|
||||
}
|
||||
if (_reversed_buffer != NULL) {
|
||||
delete[] _reversed_buffer;
|
||||
_reversed_buffer = NULL;
|
||||
}
|
||||
|
||||
if (_buffer_image != NULL) {
|
||||
CGImageRelease(_buffer_image);
|
||||
CGColorSpaceRelease(_buffer_color_space);
|
||||
CGDataProviderRelease(_data_provider);
|
||||
CFRelease(_buffer_data);
|
||||
|
||||
_buffer_data = NULL;
|
||||
_data_provider = NULL;
|
||||
_buffer_color_space = NULL;
|
||||
_buffer_image = NULL;
|
||||
}
|
||||
}
|
||||
#endif // __APPLE__
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: P3DInstance::timer_callback
|
||||
// Access: Private, Static
|
||||
// Description: OSX only: this callback is associated with a
|
||||
|
@ -218,6 +218,8 @@ private:
|
||||
static bool parse_hexdigit(int &result, char digit);
|
||||
|
||||
#ifdef __APPLE__
|
||||
void alloc_swbuffer();
|
||||
void free_swbuffer();
|
||||
static void timer_callback(CFRunLoopTimerRef timer, void *info);
|
||||
#endif // __APPLE__
|
||||
|
||||
@ -295,6 +297,11 @@ private:
|
||||
string _shared_filename;
|
||||
SubprocessWindowBuffer *_swbuffer;
|
||||
char *_reversed_buffer;
|
||||
CFDataRef _buffer_data;
|
||||
CGDataProviderRef _data_provider;
|
||||
CGColorSpaceRef _buffer_color_space;
|
||||
CGImageRef _buffer_image;
|
||||
|
||||
bool _mouse_active;
|
||||
unsigned int _modifiers;
|
||||
|
||||
|
@ -537,7 +537,7 @@ load_image(OsxImageData &image, const string &image_filename) {
|
||||
CFDataCreateWithBytesNoCopy(NULL, (const UInt8 *)image._raw_data,
|
||||
image._height * new_row_stride, kCFAllocatorNull);
|
||||
image._provider = CGDataProviderCreateWithCFData(image._data);
|
||||
image._color_space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
|
||||
image._color_space = CGColorSpaceCreateDeviceRGB();
|
||||
|
||||
image._image =
|
||||
CGImageCreate(image._width, image._height, 8, 32,
|
||||
|
Loading…
x
Reference in New Issue
Block a user