Create a new image surface that is efficient to draw on the given window.

Initially the surface contents are all 0 (transparent if contents have transparency, black otherwise.)

The width and height of the new surface are not affected by the scaling factor of the window, or by the scale argument; they are the size of the surface in device pixels. If you wish to create an image surface capable of holding the contents of window you can use:

int scale = gdk_window_get_scale_factor (window);
int width = gdk_window_get_width (window) * scale;
int height = gdk_window_get_height (window) * scale;

// format is set elsewhere
cairo_surface_t *surface =
gdk_window_create_similar_image_surface (window,
width, height,

Note that unlike Surface.createSimilarImage, the new surface's device scale is set to scale, or to the scale factor of window if scale is 0.

class Window


format cairo_format_t

the format for the new surface

width int

width of the new surface

height int

height of the new surface

scale int

the scale of the new surface, or 0 to use same as window

Return Value

Type: Surface

a pointer to the newly allocated surface. The caller owns the surface and should call Surface.destroy when done with it.

This function always returns a valid pointer, but it will return a pointer to a “nil” surface if other is already in an error state or any other error occurs.