如何在SDL2窗口上使用Cairo绘制一条白色直线
How would I draw a straight white line using Cairo on an SDL2 window?
这是代码,但我在使SDL_Rect工作或cairo移动到/行到时遇到了问题。它会产生一个空白的黑色窗口。我发现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处开始绘制,因此整个区域都是黑色的。此外,更新纹理时的pitch
不正确——它是源数据行的字节长度;cairo图像的宽度为1200,其格式要求每个像素4个字节;忽略填充,它是1200*4,而不是400(注意-如果格式不同,例如每个像素3个字节,则填充可能很重要-如果要使用该格式,请参阅cairo文档检查它是否填充了行(。因此有两种解决方案:
-
使用cairo生成所需的完整图像,例如,不要使用
move_to
的(100100(偏移,或者将整个图像复制到SDL纹理。那么,只要修正音高就足够了。 -
将cairo数据的一部分复制到纹理,
例如
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 );
相关文章:
- QuadTree只在窗口的右上角绘制
- 绘制旋转的三角形
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- SFML 文本未绘制在窗口上
- 如何在快板的屏幕中显示子位图的绘制?
- 如何绘制自定义形状的元素?
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 绘制文本问题
- 在 QT C++中绘制/操作多边形
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 在现代OpenGL中,绘制GL_TRIANGLE奇怪的z轴行为的填充圆
- 如何在SDL2窗口上使用Cairo绘制一条白色直线
- 是否可以将Windows位图绘制到cairo表面