Manual of Lua-OOCairo: surface
lua-oocairo-surface - Cairo surface objects
Introduction
All Cairo drawing operations are targeted at a surface, which represents a backend writing drawing instructions out to a vector graphics file (SVG, PDF, etc.) or drawing to a bitmap image. Surfaces are created with one of the top-level constructor functions listed in lua-oocairo(3).
Surface objects can be compared with the ==
operator. This will compare
the identity of the objects, so different Lua objects which refer to the
same cairo_surface_t
will compare as equal.
Methods
The following methods are available on surface objects.
- surf:copy_page ()
Same as
surf:show_page()
, but keeps whatever has been drawn on the current page for additional drawing on the next page.- surf:finish ()
Finish any drawing to the surface and disconnect from any external resources it uses, such as closing a file handle if it's writing output to a file. No more drawing can be done with this surface after calling this method.
- surf:flush ()
Finish any drawing work currently in progress.
- surf:get_content ()
Returns a string indicating what kind of content the surface has (colours and/or transparency). The return value will be one of the strings accepted by the
surface_create_similar
function (see lua-oocairo(3)).- surf:get_data ()
Returns the raw data for an image surface as a string, so that you can pass it to some other library or get the exact colours of each pixel. Returns nothing for surfaces which aren't image surfaces.
See the example program get-data.lua included with the distribution for some code to extract the colour values from pixels in the image data.
There are actually two values returned from this method, the data itself and the stride for it. The stride is the number of bytes of the string used for each line of the image. This is at least the width of the image multiplied by the number of bytes needed for each pixel, although it might be larger (in which case the extra bytes at the end of each line of pixels should be ignored). The length of the data will always be equal to the stride multipled by the image's height.
The data string will contain rows of pixels starting with the top row. Each row contains the pixels one after another, with no padding in between, starting from the left hand side.
The way individual pixels are stored depends on the image format, which can be queried with the
surf:get_format()
method. For colour images, that is ones with a format ofrgb24
orargb32
, each pixel will be four bytes in size. The alpha, red, green, and blue components will be in the order given by the stringCairo.BYTE_ORDER
. Onrgb24
images the alpha value should be ignored, although it will still be present (that is, the pixels will still be stored in 32 bits each, not 24 bits).If the format is
a8
then each pixel will be one byte. Thea1
format stores each pixel as one bit, in groups of 32 bits ordered according to the endianness of the platform (so if the last value returned from the method isargb
then the first pixel will be the most significant bit of the 32 bits, otherwise the reverse).- surf:get_device_offset ()
Returns two numbers, whichever ones were set with
surf:set_device_offset()
.- surf:get_eps ()
Returns a boolean value matching whatever was last set with
surf:set_eps()
, or throws an exception if surf is not a PostScript surface.- surf:get_fallback_resolution ()
Returns two numbers, the values set by
surf:set_fallback_resolution()
. Only available with Cairo 1.8 or better.- surf:get_font_options ()
Returns a new font options object containing the preferred options for rendering text on this surface. These options are used automatically when rendering text, so can usually be ignored, but might be useful if you want to render some text to an image internally and then present it on a surface on screen, in a widget of some sort.
See lua-oocairo-fontopt(3) for more about font options objects.
- surf:get_format ()
Return the pixel format for an image surface. Throws an exception for other surface types. The return value will be one of the strings accepted by the
image_surface_create
function (see lua-oocairo(3)).- surf:get_gdk_pixbuf ()
Creates a GdkPixbuf object containing the image currently held on an image surface. The return value is suitable for use with the Lua-Gnome library, for example as an icon. See the example program gtk-drawing.lua for an example showing that use.
Must be called on an image surface, otherwise it throws an exception. Also, it currently only supports the
rgb24
andargb32
formats.Requires the Lua-Gnome package to have been installed and the
gtk
module to be loaded.- surf:get_height ()
Returns the height in pixels of an image surface, or throws an exception for other types.
- surf:get_type ()
Returns a string indicating what type of surface object surf is. The value will be one of the following:
- image
A bitmap image stored in a memory buffer.
Vector drawing into a Adobe™ PDF file.
- ps
Vector drawing into a PostScript file.
- svg
Vector drawing into an SVG file.
- xlib
An X window in a graphical user interface such as Gtk+.
Other values are theoretically possible, but there isn't yet any way to create them with this binding of Cairo.
- surf:get_width ()
Returns the width in pixels of an image surface, or throws an exception for other types.
- surf:has_show_text_glyphs ()
Returns true if this surface can use text cluster information to improve the quality of text information in the output. If true then it may be beneficial to use the
show_text_glyphs
method on a context object instead of theshow_glyphs
method, otherwise that will make no difference.Only available with Cairo 1.8 or better.
- surf:set_device_offset (x, y)
Set two numbers which are added to the x and y coordinates used for drawing after the current transformation matrix has been applied.
- surf:set_eps (eps)
On a PostScript surface this sets whether the output should be encapsulated PostScript or not. The value of eps is interpreted as boolean. Throws an exception if surf is not a PostScript surface.
- surf:set_fallback_resolution (x, y)
Set the resolution at which vector graphics are rendered to bitmaps when drawing something on a vector-based surface type which can't be directly represented. Has no effect on surfaces where the output is bitmapped anyway. The values of x and y must be numbers.
- surf:set_size (width, height)
Set the size in points of the next page of PostScript or PDF output. This should be called before any drawing has been done on the new page (probably just after creating the surface or just after the last
surf:show_page()
call). The values of width and height should be numbers. Throws an exception if surf isn't a PostScript or PDF surface.- surf:show_page ()
Starts a new page on surfaces which support that (such as PDF and PostScript).
- surf:write_to_png (file/filename)
Write the bitmap data from a surface out to the specified file in PNG format. The argument can be a filename or file handle.