Peta::FFI::Cairo::Surface#
Cairo::Surface family package plug-in.
One file per the seven-file fan-out plan covers the whole surface family, because every concrete surface (Cairo::ImageSurface, Cairo::PdfSurface, Cairo::PsSurface, Cairo::SvgSurface, Cairo::RecordingSurface) is a Cairo::Surface subclass blessed by the SAME type-dispatch table (cairo_surface_get_type), and they share the surface-family cairo symbols. This module resolves those symbols itself via super::cairo_dlsym over the shared handle, so the foundation’s symbol table never carries surface entries and parallel package agents never contend on it.
Refcount contract (census section 4): every create* constructor and create_similar / create_for_rectangle return a +1 surface, blessed directly (_noinc). DESTROY drops exactly one reference via cairo_surface_destroy. Enum-returning methods (status, get_type, get_content, get_format) surface the cairo int as its string nickname.
Version scope (census top block): the 1.109 phenotype is the floor; we bind it 1:1 against the loaded libcairo 1.18.4. Backend-specific ctors and the
=1.16 PDF metadata/outline methods are dlsym-gated: on a feature-stripped libcairo the symbol resolves to
Noneand the method croaks with a targeted ”built without X support“ message rather than dereferencing null.
Deferred (later dedicated pass, census section 5 hard-parts 1 and 4): the stream ctors and write_to_png_stream / create_from_png_stream need a Perl write/read callback re-entered from inside libcairo through a C trampoline; set_mime_data / get_mime_data cross an SV lifetime into libcairo. These are registered as croaking stubs so the API surface is present but flags the unimplemented path explicitly.
Functions#
Other Functions#
image_surface_create#
Cairo::ImageSurface->create($format, $width, $height) -> blessed surface. Mirrors cairo_image_surface_create; C_ARGS drops the leading class. The constructor owns +1, so we type-dispatch bless without an extra reference.
image_surface_create_for_data#
Cairo::ImageSurface->create_for_data($data, $format, $width, $height, $stride). Mirrors cairo_image_surface_create_for_data: the raw bytes are borrowed by cairo (not copied), so the SV must outlive the surface - matching the XS, which passes the SV’s PV pointer straight through.
image_get_data#
$image_surface->get_data -> SV string of height*stride bytes, or undef. Mirrors the XS which reads height and stride to size the SV.
image_get_format#
$image_surface->get_format -> format nickname (enum-string return).
image_create_from_png#
Cairo::ImageSurface->create_from_png($filename) -> blessed surface. PNG is a build option; the symbol is dlsym-gated (census runtime-env note).
surface_destroy#
$surface->DESTROY -> cairo_surface_destroy, dropping the one reference this wrapper owns (census section 4).
surface_status#
$surface->status -> status nickname (enum-string return).
surface_get_type#
$surface->get_type -> surface-type nickname (enum-string return).
surface_get_content#
$surface->get_content -> content nickname (enum-string return).
surface_write_to_png#
$surface->write_to_png($filename) -> status nickname. PNG is dlsym-gated.
surface_create_similar#
create_similar in its dual class/instance form (CairoSurface.xs L313): Cairo::Surface->create_similar($other, $content, $w, $h) (items==5) $other->create_similar($content, $w, $h) (items==4) The extra leading class shifts the arg offset by one. content is an enum string; the result is a +1 surface blessed type-dispatched.
surface_set_device_offset#
$surface->set_device_offset($x, $y).
surface_get_device_offset#
$surface->get_device_offset -> ($x_offset, $y_offset) (OUTLIST list).
surface_set_fallback_resolution#
$surface->set_fallback_resolution($x_ppi, $y_ppi).
surface_get_fallback_resolution#
$surface->get_fallback_resolution -> ($x_ppi, $y_ppi) (OUTLIST list).
surface_get_font_options#
$surface->get_font_options -> blessed Cairo::FontOptions. Mirrors the XS CODE block: allocate a fresh options with cairo_font_options_create, fill it via cairo_surface_get_font_options, then bless the +1 pointer directly (font options are their own object owned by the Font package).
surface_mark_dirty_rectangle#
$surface->mark_dirty_rectangle($x, $y, $width, $height) (four ints).
surface_has_show_text_glyphs#
$surface->has_show_text_glyphs -> bool (0/1).
surface_create_for_rectangle#
Cairo::Surface->create_for_rectangle($target, $x, $y, $width, $height). Mirrors the XS class, target, x, y, w, h with C_ARGS dropping class; the result is a +1 surface blessed type-dispatched.
surface_supports_mime_type#
$surface->supports_mime_type($mime_type) -> bool (0/1).
pdf_restrict_to_version#
$pdf->restrict_to_version($version) (enum string arg).
pdf_set_metadata#
$pdf->set_metadata($metadata, $utf8) (>=1.16). metadata is an enum string.
pdf_set_page_label#
$pdf->set_page_label($utf8) (>=1.16).
pdf_set_thumbnail_size#
$pdf->set_thumbnail_size($width, $height) (>=1.16).
pdf_add_outline#
$pdf->add_outline($parent_id, $utf8, $link_attribs, $flags) -> int (>=1.16). flags is the outline-flags enum as an integer bitmask (not a nickname in the XS - it is a plain int typemap for this method).
pdf_outline_root#
Cairo::PdfSurface::OUTLINE_ROOT -> 0 (CAIRO_PDF_OUTLINE_ROOT constant).
ps_dsc_comment#
$ps->dsc_comment($comment).
ps_restrict_to_level#
$ps->restrict_to_level($level) (enum string arg).
ps_set_eps#
$ps->set_eps($bool).
ps_get_eps#
$ps->get_eps -> bool (0/1).
svg_restrict_to_version#
$svg->restrict_to_version($version) (enum string arg).
recording_create#
Cairo::RecordingSurface->create($content, $extents_or_undef). Mirrors the XS class, content, cairo_rectangle_t_ornull *extents: content is an enum string; extents is either an unblessed {x,y,width,height} hashref (a bounded recording surface) or undef/absent (unbounded, NULL rectangle).
recording_ink_extents#
$recording->ink_extents -> ($x0, $y0, $width, $height) (OUTLIST list).
recording_get_extents#
$recording->get_extents -> {x,y,width,height} hashref, or undef when the surface is unbounded. Mirrors the XS: the cairo_bool_t return gates whether the filled rectangle is returned at all.
format_stride_for_width#
Cairo::Format::stride_for_width($format, $width) -> int. Mirrors cairo_format_stride_for_width; format is an enum string. Called as a plain function (not a method), so the format is ST(0).
write_to_png_stream#
$surface->write_to_png_stream($closure [, $data]) -> status nickname. One-shot write_func: the closure lives only for the call, so we free it immediately afterwards (no set_user_data). Mirrors CairoSurface.xs cairo_surface_write_to_png_stream. PNG is dlsym-gated.
create_from_png_stream#
Cairo::ImageSurface->create_from_png_stream($closure [, $data]) -> blessed surface. read_func ctor; +1 surface blessed type-dispatched. The closure is consumed only during the ctor call, so free it immediately after. PNG gated.
set_mime_data#
$surface->set_mime_data($mime_type, $data) -> status nickname (>=1.10). Mirrors CairoSurface.xs: SvREFCNT_inc the passed $data SV (NOT a copy), hand its raw bytes to cairo, and register data_destroy (SvREFCNT_dec) so cairo owns exactly one reference until it drops the buffer. The SV’s PV must stay valid for the surface’s life, which the retained reference guarantees.
get_mime_data#
$surface->get_mime_data($mime_type) -> SV string, or undef if the surface carries no data for that MIME type (>=1.10). cairo writes an out double- pointer + length; the XS builds newSVpvn(data, length). We return undef when cairo reports a null data pointer (no attached blob) rather than an empty string, since a genuine zero-length blob is indistinguishable and undef is the more useful phenotype for ”absent“.