mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -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;
|
_shared_mmap_size = 0;
|
||||||
_swbuffer = NULL;
|
_swbuffer = NULL;
|
||||||
_reversed_buffer = 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
|
// We have to start with _mouse_active true; firefox doesn't send
|
||||||
// activate events.
|
// activate events.
|
||||||
_mouse_active = true;
|
_mouse_active = true;
|
||||||
@ -305,16 +310,7 @@ P3DInstance::
|
|||||||
CFRelease(_frame_timer);
|
CFRelease(_frame_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_swbuffer != NULL) {
|
free_swbuffer();
|
||||||
SubprocessWindowBuffer::destroy_buffer(_shared_fd, _shared_mmap_size,
|
|
||||||
_shared_filename, _swbuffer);
|
|
||||||
_swbuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_reversed_buffer != NULL) {
|
|
||||||
delete[] _reversed_buffer;
|
|
||||||
_reversed_buffer = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DESTROY_LOCK(_request_lock);
|
DESTROY_LOCK(_request_lock);
|
||||||
@ -481,21 +477,7 @@ set_wparams(const P3DWindowParams &wparams) {
|
|||||||
if (_swbuffer == NULL || _swbuffer->get_x_size() != x_size ||
|
if (_swbuffer == NULL || _swbuffer->get_x_size() != x_size ||
|
||||||
_swbuffer->get_y_size() != y_size) {
|
_swbuffer->get_y_size() != y_size) {
|
||||||
// We need to open a new shared buffer.
|
// We need to open a new shared buffer.
|
||||||
if (_swbuffer != NULL) {
|
alloc_swbuffer();
|
||||||
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()];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_swbuffer == NULL) {
|
if (_swbuffer == NULL) {
|
||||||
@ -3022,7 +3004,8 @@ get_framebuffer() {
|
|||||||
// conventions between Panda and Mac).
|
// conventions between Panda and Mac).
|
||||||
for (int yi = 0; yi < y_size; ++yi) {
|
for (int yi = 0; yi < y_size; ++yi) {
|
||||||
#ifndef __BIG_ENDIAN__
|
#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,
|
memcpy(_reversed_buffer + (y_size - 1 - yi) * rowsize,
|
||||||
(char *)framebuffer + yi * rowsize,
|
(char *)framebuffer + yi * rowsize,
|
||||||
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 x_size = min(_wparams.get_win_width(), _swbuffer->get_x_size());
|
||||||
int y_size = min(_wparams.get_win_height(), _swbuffer->get_y_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);
|
CGContextTranslateCTM(context, 0, y_size);
|
||||||
CGContextScaleCTM(context, 1.0, -1.0);
|
CGContextScaleCTM(context, 1.0, -1.0);
|
||||||
|
|
||||||
CFDataRef data =
|
if (_buffer_image != NULL) {
|
||||||
CFDataCreateWithBytesNoCopy(NULL, (const UInt8 *)_reversed_buffer,
|
CGRect region = { { 0, 0 }, { x_size, y_size } };
|
||||||
y_size * rowsize, kCFAllocatorNull);
|
CGContextDrawImage(context, region, _buffer_image);
|
||||||
|
}
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
#endif // __APPLE__
|
#endif // __APPLE__
|
||||||
|
|
||||||
@ -3504,6 +3469,76 @@ parse_hexdigit(int &result, char digit) {
|
|||||||
|
|
||||||
#ifdef __APPLE__
|
#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
|
// Function: P3DInstance::timer_callback
|
||||||
// Access: Private, Static
|
// Access: Private, Static
|
||||||
// Description: OSX only: this callback is associated with a
|
// Description: OSX only: this callback is associated with a
|
||||||
|
@ -218,6 +218,8 @@ private:
|
|||||||
static bool parse_hexdigit(int &result, char digit);
|
static bool parse_hexdigit(int &result, char digit);
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
void alloc_swbuffer();
|
||||||
|
void free_swbuffer();
|
||||||
static void timer_callback(CFRunLoopTimerRef timer, void *info);
|
static void timer_callback(CFRunLoopTimerRef timer, void *info);
|
||||||
#endif // __APPLE__
|
#endif // __APPLE__
|
||||||
|
|
||||||
@ -295,6 +297,11 @@ private:
|
|||||||
string _shared_filename;
|
string _shared_filename;
|
||||||
SubprocessWindowBuffer *_swbuffer;
|
SubprocessWindowBuffer *_swbuffer;
|
||||||
char *_reversed_buffer;
|
char *_reversed_buffer;
|
||||||
|
CFDataRef _buffer_data;
|
||||||
|
CGDataProviderRef _data_provider;
|
||||||
|
CGColorSpaceRef _buffer_color_space;
|
||||||
|
CGImageRef _buffer_image;
|
||||||
|
|
||||||
bool _mouse_active;
|
bool _mouse_active;
|
||||||
unsigned int _modifiers;
|
unsigned int _modifiers;
|
||||||
|
|
||||||
|
@ -537,7 +537,7 @@ load_image(OsxImageData &image, const string &image_filename) {
|
|||||||
CFDataCreateWithBytesNoCopy(NULL, (const UInt8 *)image._raw_data,
|
CFDataCreateWithBytesNoCopy(NULL, (const UInt8 *)image._raw_data,
|
||||||
image._height * new_row_stride, kCFAllocatorNull);
|
image._height * new_row_stride, kCFAllocatorNull);
|
||||||
image._provider = CGDataProviderCreateWithCFData(image._data);
|
image._provider = CGDataProviderCreateWithCFData(image._data);
|
||||||
image._color_space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
|
image._color_space = CGColorSpaceCreateDeviceRGB();
|
||||||
|
|
||||||
image._image =
|
image._image =
|
||||||
CGImageCreate(image._width, image._height, 8, 32,
|
CGImageCreate(image._width, image._height, 8, 32,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user