-
- GetForeColor(&p_data->oldForeColor);
- GetBackColor(&p_data->oldBackColor);
- GetPenState(&p_data->oldState);
- ForeColor(blackColor);
- BackColor(whiteColor);
-
- assert(CGSNewConnection(NULL, &p_data->gConnection) == kCGErrorSuccess);
- p_data->gMainDevice = GetMainDevice();
- p_data->gDeviceState = HGetState((Handle)p_data->gMainDevice);
- HLock((Handle)p_data->gMainDevice);
- p_data->gDevicePix = (**p_data->gMainDevice).gdPMap;
-
- CopyBits(( BitMap*)*p_data->gDevicePix, (BitMap*)*p_data->LocalBufferPix,
- &(**p_data->gDevicePix).bounds, &(**p_data->gDevicePix).bounds,
- srcCopy, NULL );
-
- HSetState( (Handle)p_data->gMainDevice, p_data->gDeviceState );
- SetPenState( &p_data->oldState );
- RGBForeColor( &p_data->oldForeColor );
- RGBBackColor( &p_data->oldBackColor );
-
- assert(CGSReleaseConnection(p_data->gConnection) == kCGErrorSuccess);
- memcpy( p_block->p_buffer, (**p_data->LocalBufferPix).baseAddr, i_size );
-
+
+ CGPoint cursor_pos;
+ CGError cursor_result;
+
+ cursor_pos.x = 0;
+ cursor_pos.y = 0;
+
+ cursor_result
+ = CGSGetCurrentCursorLocation( p_data->connection, &cursor_pos );
+
+ if( p_sys->b_follow_mouse
+ && cursor_result == kCGErrorSuccess )
+ {
+ FollowMouse( p_sys, cursor_pos.x, cursor_pos.y );
+ p_data->left = p_sys->i_left;
+ p_data->top = p_sys->i_top;
+ }
+
+ CGLSetCurrentContext( p_data->screen );
+ glReadPixels( p_data->left,
+ p_data->screen_height - p_data->top - p_data->src_height,
+ p_data->src_width,
+ p_data->src_height,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ p_data->texture_image );
+
+ CGLSetCurrentContext( p_data->scaled );
+ glEnable( GL_TEXTURE_2D );
+ glBindTexture( GL_TEXTURE_2D, p_data->texture );
+ glTexImage2D( GL_TEXTURE_2D, 0,
+ GL_RGBA8, p_data->src_width, p_data->src_height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, p_data->texture_image );
+
+ glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
+ glClear( GL_COLOR_BUFFER_BIT );
+ glColor3f( 1.0f, 1.0f, 1.0f );
+ glEnable( GL_TEXTURE_2D );
+ glBindTexture( GL_TEXTURE_2D, p_data->texture );
+ glBegin( GL_POLYGON );
+ glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, -1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, -1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, 1.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, 1.0 );
+ glEnd();
+ glDisable( GL_TEXTURE_2D );
+
+ int size;
+ int tmp1, tmp2, tmp3, tmp4;
+ unsigned char *cursor_image;
+ CGRect cursor_rect;
+ CGPoint cursor_hot;
+
+ if( cursor_result == kCGErrorSuccess
+ && CGSGetGlobalCursorDataSize( p_data->connection, &size )
+ == kCGErrorSuccess )
+ {
+ cursor_image = ( unsigned char* )malloc( size );
+ if( CGSGetGlobalCursorData( p_data->connection,
+ cursor_image, &size,
+ &tmp1,
+ &cursor_rect, &cursor_hot,
+ &tmp2, &tmp3, &tmp4 )
+ == kCGErrorSuccess )
+ {
+ glEnable( GL_TEXTURE_2D );
+ glBindTexture( GL_TEXTURE_2D, p_data->cursor_texture );
+ glTexImage2D( GL_TEXTURE_2D, 0,
+ GL_RGBA8,
+ ( int )( cursor_rect.size.width ),
+ ( int )( cursor_rect.size.height ), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ ( char * )cursor_image );
+
+ cursor_rect.origin.x = cursor_pos.x - p_data->left - cursor_hot.x;
+ cursor_rect.origin.y = cursor_pos.y - p_data->top - cursor_hot.y;
+
+ cursor_rect.origin.x
+ = 2.0 * cursor_rect.origin.x / p_data->src_width - 1.0;
+ cursor_rect.origin.y
+ = 2.0 * cursor_rect.origin.y / p_data->src_height - 1.0;
+ cursor_rect.size.width
+ = 2.0 * cursor_rect.size.width / p_data->src_width;
+ cursor_rect.size.height
+ = 2.0 * cursor_rect.size.height / p_data->src_height;
+
+ glColor3f( 1.0f, 1.0f, 1.0f );
+ glEnable( GL_TEXTURE_2D );
+ glEnable( GL_BLEND );
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ glBindTexture( GL_TEXTURE_2D, p_data->cursor_texture );
+ glBegin( GL_POLYGON );
+ glTexCoord2f( 0.0, 0.0 ); glVertex2f( cursor_rect.origin.x,
+ cursor_rect.origin.y );
+ glTexCoord2f( 1.0, 0.0 ); glVertex2f( cursor_rect.origin.x
+ + cursor_rect.size.width,
+ cursor_rect.origin.y );
+ glTexCoord2f( 1.0, 1.0 ); glVertex2f( cursor_rect.origin.x
+ + cursor_rect.size.width,
+ cursor_rect.origin.y
+ + cursor_rect.size.height );
+ glTexCoord2f( 0.0, 1.0 ); glVertex2f( cursor_rect.origin.x,
+ cursor_rect.origin.y
+ + cursor_rect.size.height );
+ glEnd();
+ glDisable( GL_BLEND );
+ glDisable( GL_TEXTURE_2D );
+ }
+ free( cursor_image );
+ }
+
+ glReadPixels( 0, 0,
+ p_data->dest_width,
+ p_data->dest_height,
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ p_block->p_buffer );
+