Protocols
The following protocols are available globally.
-
Modules supporting animations must derive a type from
GdkPixbufAnimation
, providing suitable implementations of the virtual functions.The
See morePixbufAnimationClassProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufAnimationClass
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufAnimationClass
. Alternatively, usePixbufAnimationClassRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufAnimationClassProtocol
-
Modules supporting animations must derive a type from
GdkPixbufAnimationIter
, providing suitable implementations of the virtual functions.The
See morePixbufAnimationIterClassProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufAnimationIterClass
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufAnimationIterClass
. Alternatively, usePixbufAnimationIterClassRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufAnimationIterClassProtocol
-
A
GdkPixbufFormat
contains information about the image format accepted by a module.Only modules should access the fields directly, applications should use the
gdk_pixbuf_format_*
family of functions.The
See morePixbufFormatProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufFormat
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufFormat
. Alternatively, usePixbufFormatRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufFormatProtocol
-
The
See morePixbufLoaderClassProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufLoaderClass
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufLoaderClass
. Alternatively, usePixbufLoaderClassRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufLoaderClassProtocol
-
A
GdkPixbufModule
contains the necessary functions to load and save images in a certain file format.If
GdkPixbuf
has been compiled withGModule
support, it can be extended by modules which can load (and perhaps also save) new image and animation formats.Implementing modules
The
GdkPixbuf
interfaces needed for implementing modules are contained ingdk-pixbuf-io.h
(andgdk-pixbuf-animation.h
if the module supports animations). They are not covered by the same stability guarantees as the regular GdkPixbuf API. To underline this fact, they are protected by theGDK_PIXBUF_ENABLE_BACKEND
pre-processor symbol.Each loadable module must contain a
GdkPixbufModuleFillVtableFunc
function namedfill_vtable
, which will get called when the module is loaded and must set the function pointers of theGdkPixbufModule
.In order to make format-checking work before actually loading the modules (which may require calling
dlopen
to load image libraries), modules export their signatures (and other information) via thefill_info
function. An external utility,gdk-pixbuf-query-loaders
, uses this to create a text file containing a list of all available loaders and their signatures. This file is then read at runtime byGdkPixbuf
to obtain the list of available loaders and their signatures.Modules may only implement a subset of the functionality available via
GdkPixbufModule
. If a particular functionality is not implemented, thefill_vtable
function will simply not set the corresponding function pointers of theGdkPixbufModule
structure. If a module supports incremental loading (i.e. providesbegin_load
,stop_load
andload_increment
), it doesn’t have to implementload
, sinceGdkPixbuf
can supply a genericload
implementation wrapping the incremental loading.Installing modules
Installing a module is a two-step process:
- copy the module
file(s)
to the loader directory (normally$libdir/gdk-pixbuf-2.0/$version/loaders
, unless overridden by the environment variableGDK_PIXBUF_MODULEDIR
) - call
gdk-pixbuf-query-loaders
to update the module file (normally$libdir/gdk-pixbuf-2.0/$version/loaders.cache
, unless overridden by the environment variableGDK_PIXBUF_MODULE_FILE
)
The
See morePixbufModuleProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufModule
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufModule
. Alternatively, usePixbufModuleRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufModuleProtocol
- copy the module
-
The signature prefix for a module.
The signature of a module is a set of prefixes. Prefixes are encoded as pairs of ordinary strings, where the second string, called the mask, if not
NULL
, must be of the same length as the first one and may contain ‘ ’, ‘!’, ‘x’, ‘z’, and ‘n’ to indicate bytes that must be matched, not matched, “don’t-care”-bytes, zeros and non-zeros, respectively.Each prefix has an associated integer that describes the relevance of the prefix, with 0 meaning a mismatch and 100 a “perfect match”.
Starting with gdk-pixbuf 2.8, the first byte of the mask may be ‘’, indicating an unanchored pattern that matches not only at the beginning, but also in the middle. Versions prior to 2.8 will interpret the ‘’ like an ‘x’.
The signature of a module is stored as an array of
GdkPixbufModulePatterns
. The array is terminated by a pattern where theprefix
isNULL
.GdkPixbufModulePattern *signature[] = { { "abcdx", " !x z", 100 }, { "bla", NULL, 90 }, { NULL, NULL, 0 } };
In the example above, the signature matches e.g. “auud\0” with relevance 100, and “blau” with relevance 90.
The
See morePixbufModulePatternProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufModulePattern
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufModulePattern
. Alternatively, usePixbufModulePatternRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufModulePatternProtocol
-
The
See morePixbufSimpleAnimClassProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufSimpleAnimClass
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufSimpleAnimClass
. Alternatively, usePixbufSimpleAnimClassRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufSimpleAnimClassProtocol
-
A pixel buffer.
GdkPixbuf
contains information about an image’s pixel data, its color space, bits per sample, width and height, and the rowstride (the number of bytes between the start of one row and the start of the next).Creating new
GdkPixbuf
The most basic way to create a pixbuf is to wrap an existing pixel buffer with a [class
GdkPixbuf.Pixbuf
] instance. You can use the [ctor
GdkPixbuf.Pixbuf.new_from_data``] function to do this.Every time you create a new
GdkPixbuf
instance for some data, you will need to specify the destroy notification function that will be called when the data buffer needs to be freed; this will happen when aGdkPixbuf
is finalized by the reference counting functions. If you have a chunk of static data compiled into your application, you can pass inNULL
as the destroy notification function so that the data will not be freed.The [
ctor
GdkPixbuf.Pixbuf.new] constructor function can be used as a convenience to create a pixbuf with an empty buffer; this is equivalent to allocating a data buffer using
malloc()and then wrapping it with
gdk_pixbuf_new_from_data(). The
gdk_pixbuf_new()“ function will compute an optimal rowstride so that rendering can be performed with an efficient algorithm.As a special case, you can use the [
ctor
GdkPixbuf.Pixbuf.new_from_xpm_data”] function to create a pixbuf from inline XPM image data.You can also copy an existing pixbuf with the [method
Pixbuf.copy
] function. This is not the same as just acquiring a reference to the old pixbuf instance: the copy function will actually duplicate the pixel data in memory and create a new [classPixbuf
] instance for it.Reference counting
GdkPixbuf
structures are reference counted. This means that an application can share a single pixbuf among many parts of the code. When a piece of the program needs to use a pixbuf, it should acquire a reference to it by callingg_object_ref()
; when it no longer needs the pixbuf, it should release the reference it acquired by callingg_object_unref()
. The resources associated with aGdkPixbuf
will be freed when its reference count drops to zero. Newly-createdGdkPixbuf
instances start with a reference count of one.Image Data
Image data in a pixbuf is stored in memory in an uncompressed, packed format. Rows in the image are stored top to bottom, and in each row pixels are stored from left to right.
There may be padding at the end of a row.
The “rowstride” value of a pixbuf, as returned by [
method
GdkPixbuf.Pixbuf.get_rowstride``], indicates the number of bytes between rows.NOTE: If you are copying raw pixbuf data with
memcpy()
note that the last row in the pixbuf may not be as wide as the full rowstride, but rather just as wide as the pixel data needs to be; that is: it is unsafe to domemcpy (dest, pixels, rowstride * height)
to copy a whole pixbuf. Use [methodGdkPixbuf.Pixbuf.copy
] instead, or compute the width in bytes of the last row as:last_row = width * ((n_channels * bits_per_sample + 7) / 8);
The same rule applies when iterating over each row of a
GdkPixbuf
pixels array.The following code illustrates a simple
put_pixel()
function for RGB pixbufs with 8 bits per channel with an alpha channel.static void put_pixel (GdkPixbuf *pixbuf, int x, int y, guchar red, guchar green, guchar blue, guchar alpha) { int n_channels = gdk_pixbuf_get_n_channels (pixbuf); // Ensure that the pixbuf is valid g_assert (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB); g_assert (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8); g_assert (gdk_pixbuf_get_has_alpha (pixbuf)); g_assert (n_channels == 4); int width = gdk_pixbuf_get_width (pixbuf); int height = gdk_pixbuf_get_height (pixbuf); // Ensure that the coordinates are in a valid range g_assert (x >= 0 && x < width); g_assert (y >= 0 && y < height); int rowstride = gdk_pixbuf_get_rowstride (pixbuf); // The pixel buffer in the GdkPixbuf instance guchar *pixels = gdk_pixbuf_get_pixels (pixbuf); // The pixel we wish to modify guchar *p = pixels + y * rowstride + x * n_channels; p[0] = red; p[1] = green; p[2] = blue; p[3] = alpha; }
Loading images
The
GdkPixBuf
class provides a simple mechanism for loading an image from a file in synchronous and asynchronous fashion.For GUI applications, it is recommended to use the asynchronous stream API to avoid blocking the control flow of the application.
Additionally,
GdkPixbuf
provides the [classGdkPixbuf.PixbufLoader
`] API for progressive image loading.Saving images
The
GdkPixbuf
class provides methods for saving image data in a number of file formats. The formatted data can be written to a file or to a memory buffer.GdkPixbuf
can also call a user-defined callback on the data, which allows to e.g. write the image to a socket or store it in a database.The
See morePixbufProtocol
protocol exposes the methods and properties of an underlyingGdkPixbuf
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbuf
. Alternatively, usePixbufRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufProtocol : LoadableIconProtocol, ObjectProtocol
-
An opaque object representing an animation.
The GdkPixBuf library provides a simple mechanism to load and represent animations. An animation is conceptually a series of frames to be displayed over time.
The animation may not be represented as a series of frames internally; for example, it may be stored as a sprite and instructions for moving the sprite around a background.
To display an animation you don’t need to understand its representation, however; you just ask
GdkPixbuf
what should be displayed at a given point in time.The
See morePixbufAnimationProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufAnimation
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufAnimation
. Alternatively, usePixbufAnimationRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufAnimationProtocol : ObjectProtocol
-
An opaque object representing an iterator which points to a certain position in an animation.
The
See morePixbufAnimationIterProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufAnimationIter
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufAnimationIter
. Alternatively, usePixbufAnimationIterRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufAnimationIterProtocol : ObjectProtocol
-
Incremental image loader.
GdkPixbufLoader
provides a way for applications to drive the process of loading an image, by letting them send the image data directly to the loader instead of having the loader read the data from a file. Applications can use this functionality instead ofgdk_pixbuf_new_from_file()
orgdk_pixbuf_animation_new_from_file()
when they need to parse image data in small chunks. For example, it should be used when reading an image from a (potentially) slow network connection, or when loading an extremely large file.To use
GdkPixbufLoader
to load an image, create a new instance, and call [methodGdkPixbuf.PixbufLoader.write
] to send the data to it. When done, [methodGdkPixbuf.PixbufLoader.close
] should be called to end the stream and finalize everything.The loader will emit three important signals throughout the process:
- [signal
GdkPixbuf.PixbufLoader::size-prepared
] will be emitted as soon as the image has enough information to determine the size of the image to be used. If you want to scale the image while loading it, you can call [methodGdkPixbuf.PixbufLoader.set_size
] in response to this signal. - [signal
GdkPixbuf.PixbufLoader::area-prepared
] will be emitted as soon as the pixbuf of the desired has been allocated. You can obtain theGdkPixbuf
instance by calling [methodGdkPixbuf.PixbufLoader.get_pixbuf
]. If you want to use it, simply acquire a reference to it. You can also callgdk_pixbuf_loader_get_pixbuf()
later to get the same pixbuf. - [signal
GdkPixbuf.PixbufLoader::area-updated
] will be emitted every time a region is updated. This way you can update a partially completed image. Note that you do not know anything about the completeness of an image from the updated area. For example, in an interlaced image you will need to make several passes before the image is done loading.
Loading an animation
Loading an animation is almost as easy as loading an image. Once the first [signal
GdkPixbuf.PixbufLoader::area-prepared
] signal has been emitted, you can call [methodGdkPixbuf.PixbufLoader.get_animation
] to get the [classGdkPixbuf.PixbufAnimation
] instance, and then call and [methodGdkPixbuf.PixbufAnimation.get_iter
] to get a [classGdkPixbuf.PixbufAnimationIter
] to retrieve the pixbuf for the desired time stamp.The
See morePixbufLoaderProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufLoader
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufLoader
. Alternatively, usePixbufLoaderRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufLoaderProtocol : ObjectProtocol
- [signal
-
The
See morePixbufNonAnimProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufNonAnim
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufNonAnim
. Alternatively, usePixbufNonAnimRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufNonAnimProtocol : PixbufAnimationProtocol
-
An opaque struct representing a simple animation.
The
See morePixbufSimpleAnimProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufSimpleAnim
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufSimpleAnim
. Alternatively, usePixbufSimpleAnimRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufSimpleAnimProtocol : PixbufAnimationProtocol
-
The
See morePixbufSimpleAnimIterProtocol
protocol exposes the methods and properties of an underlyingGdkPixbufSimpleAnimIter
instance. The default implementation of these can be found in the protocol extension below. For a concrete class that implements these methods and properties, seePixbufSimpleAnimIter
. Alternatively, usePixbufSimpleAnimIterRef
as a lighweight,unowned
reference if you already have an instance you just want to use.Declaration
Swift
public protocol PixbufSimpleAnimIterProtocol : PixbufAnimationIterProtocol