C++ 如何在SDL2窗口上使用Cairo绘制一条直线?

C++ 如何在SDL2窗口上使用Cairo绘制一条直线?,c++,sdl,draw,cairo,C++,Sdl,Draw,Cairo,这是原样的代码,但我很难让SDL_Rect工作或cairo移到/line to。它生成一个空白的黑色窗口。我发现cairo可以利用SDL2窗口,但我不知道如何让它工作。我看到的大多数代码都使用GTK+ SDL_Window* mainWindow; SDL_Renderer* mainRenderer; SDL_CreateWindowAndRenderer(1280, 960, SDL_WINDOW_SHOWN, &mainWindow, &mainRenderer); ca

这是原样的代码,但我很难让SDL_Rect工作或cairo移到/line to。它生成一个空白的黑色窗口。我发现cairo可以利用SDL2窗口,但我不知道如何让它工作。我看到的大多数代码都使用GTK+

SDL_Window* mainWindow;
SDL_Renderer* mainRenderer;
SDL_CreateWindowAndRenderer(1280, 960, SDL_WINDOW_SHOWN, &mainWindow, &mainRenderer);

cairo_surface_t* surface;
cairo_t* cr;
surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1200, 900);
cr = cairo_create(surface);
cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
cairo_set_line_width(cr, 25);
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
cairo_move_to(cr, 100.0, 100.0);
cairo_line_to(cr, 500, 500);
cairo_stroke(cr);
unsigned char* data;
data = cairo_image_surface_get_data(surface);

SDL_Texture* texture;
SDL_Rect rect = {0, 0, 100, 100};
texture = SDL_CreateTexture(mainRenderer, SDL_PIXELFORMAT_ABGR8888,
SDL_TEXTUREACCESS_STREAMING, 100, 200);
SDL_UpdateTexture(texture, &rect, data, 400);
// Main program loop
while (1)
{
    SDL_Event event;
    if (SDL_PollEvent(&event))
    {
        if (event.type == SDL_QUIT)
        {
            SDL_DestroyRenderer(mainRenderer);
            SDL_DestroyWindow(mainWindow);
            SDL_Quit();
            break;
        }
    }
    SDL_RenderClear(mainRenderer);
    SDL_RenderCopy(mainRenderer, texture, NULL, NULL);
    SDL_RenderPresent(mainRenderer);
}
// Cleanup and quit
cairo_destroy(cr);
cairo_surface_destroy(surface);

您的纹理是100x200,您仅从cairo图像数据更新其(0,0)(100100)矩形,但使用cairo时,您仅在(100100)处开始绘制,因此整个区域为黑色。此外,当更新纹理时,您的
基音
不正确-它是源数据行的字节长度;开罗图像的宽度为1200,其格式要求每像素4字节;忽略填充,它是1200*4,而不是400(注意-如果格式不同,例如每像素3字节,填充可能很重要-如果要使用该格式,请参阅cairo文档,检查它是否填充行)。因此有两种解决方案:

  • 使用cairo生成所需的完整图像,例如,不要将(100100)偏移与
    移动到
    ,或将整个图像复制到SDL纹理。那么只有纠正音高就足够了

  • 将部分cairo数据复制到纹理

    e、 g

  • const unsigned int bpp = 4;
    const unsigned int pitch = 1200*bpp;
    SDL_UpdateTexture(texture, &rect,
        data           // offset pointer to start at 'first' pixel you want to copy
        + 100*pitch    // skip first 100 rows
        + 100*bpp,     // and first 100 pixels
        pitch          // pitch is the same - it refers to source image, not destination
    );