2014-06-19 17 views
9

Rendering to an SDL_Surface là có thể với Cairo, nhưng ứng dụng của tôi sử dụng SDL_Renderer và SDL_Texture để tận dụng lợi thế của hiển thị 2D tăng tốc.Có thể cairo sử dụng SDL_Texture làm mục tiêu hiển thị không?

Tôi hiện đang tạo một SDL_Surface và sao chép nó vào kết cấu với SDL_CreateTextureFromSurface(), nhưng quá trình này cồng kềnh và có thể chậm (mặc dù đây không phải là nút cổ chai.) Có cách trực tiếp để vẽ tới SDL_Texture không?

Trả lời

17

Tôi đã tìm ra. Streaming SDL_Textures có thể phơi bày các pixel thô ở định dạng ARGB8888, định dạng mà bề mặt Cairo cũng có thể xử lý. API của Cairo đủ thấp để chỉ yêu cầu bộ đệm pixel và độ cao.

SDL_Texture *texture = SDL_CreateTexture(renderer, 
    SDL_PIXELFORMAT_ARGB8888, 
    SDL_TEXTUREACCESS_STREAMING, 
    width, height); 

void *pixels; 
int pitch; 
SDL_LockTexture(texture, NULL, &pixels, &pitch); 
cairo_surface_t *cairo_surface = cairo_image_surface_create_for_data(
    pixels, 
    CAIRO_FORMAT_ARGB32, 
    width, height, pitch); 

paint(cairo_create(cairo_surface)); 

SDL_UnlockTexture(texture); 

Cách thuận tiện.

Các vấn đề liên quan