在 cairo 中根据比例因子缩放 pixbuf 的一部分

Scale part of pixbuf acording scale factor in cairo

我有一个从 pixbuf 创建的表面

gint scale = gtk_widget_get_scale_factor (drawing_area);

cairo_surface_t surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale, gtk_widget_get_window (drawing_area));

我想在绘图区绘制这个表面的一部分,但如果比例改变了,就会缩放

#define DIGIT_WIDTH  20
#define DIGIT_HEIGTH 30

/* same code */

int width = gtk_widget_get_allocated_width (drawing_area);

cairo_set_source_surface (cr, surface, width - DIGIT_WIDTH, 5);
cairo_rectangle (cr, width - DIGIT_WIDTH, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
cairo_fill (cr);

如何将比例因子应用于 DIGIT_WIDTH 和 DIGIT_HEIGTH?

如果我理解正确的话:

int width = gtk_widget_get_allocated_width (drawing_area);

cairo_rectangle (cr, width - DIGIT_WIDTH, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
cairo_scale(cr, scale, scale);
cairo_set_source_surface (cr, pixbuf, width - DIGIT_WIDTH, 5);
cairo_fill (cr);

您可能需要将缩放“取消应用”到源。我现在不确定也懒得测试:

cairo_set_source_surface (cr, pixbuf, (width - DIGIT_WIDTH) / (double) scale, 5. / scale);