Can cairo use SDL_Texture as a render target?
Asked Answered
C

1

12

Rendering to an SDL_Surface is possible with Cairo, but my application uses SDL_Renderer and SDL_Texture to take advantage of 2D accelerated rendering.

I am currently creating an SDL_Surface and copying it to a texture with SDL_CreateTextureFromSurface(), but this process is cumbersome and possibly slow (although it's not a bottleneck.) Is there a direct way to draw to a SDL_Texture?

Coherent answered 19/6, 2014 at 21:18 Comment(0)
C
28

I've figured it out. Streaming SDL_Textures can expose the raw pixels in the ARGB8888 format, which is a format Cairo surfaces can also handle. The Cairo API is low level enough to only require the pixel buffer and pitch.

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);

How convenient.

Coherent answered 19/6, 2014 at 22:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.