<?xml version="1.0"?>
<!-- This file was automatically generated from C sources - DO NOT EDIT!
To affect the contents of this file, edit the original C definitions,
and/or use gtk-doc annotations.  -->
<repository version="1.2"
            xmlns="http://www.gtk.org/introspection/core/1.0"
            xmlns:c="http://www.gtk.org/introspection/c/1.0"
            xmlns:doc="http://www.gtk.org/introspection/doc/1.0"
            xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
  <include name="GObject" version="2.0"/>
  <c:include name="vips/vips.h"/>
  <doc:format name="unknown"/>
  <namespace name="Vips"
             version="8.0"
             shared-library="libvips.so.42"
             c:identifier-prefixes="Vips"
             c:symbol-prefixes="vips">
    <alias name="ArgumentTable" c:type="VipsArgumentTable">
      <source-position filename="libvips/include/vips/object.h" line="317"/>
      <type name="GLib.HashTable" c:type="GHashTable"/>
    </alias>
    <alias name="Pel" c:type="VipsPel">
      <doc xml:space="preserve"
           filename="libvips/include/vips/basic.h"
           line="63">A picture element. Cast this to whatever the associated VipsBandFormat says
to get the value.</doc>
      <source-position filename="libvips/include/vips/basic.h" line="69"/>
      <type name="guint8" c:type="unsigned char"/>
    </alias>
    <function-macro name="AREA" c:identifier="VIPS_AREA" introspectable="0">
      <source-position filename="libvips/include/vips/type.h" line="137"/>
      <parameters>
        <parameter name="X">
        </parameter>
      </parameters>
    </function-macro>
    <constant name="ARGUMENT_OPTIONAL_INPUT"
              value="18"
              c:type="VIPS_ARGUMENT_OPTIONAL_INPUT">
      <source-position filename="libvips/include/vips/object.h" line="95"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="ARGUMENT_OPTIONAL_OUTPUT"
              value="34"
              c:type="VIPS_ARGUMENT_OPTIONAL_OUTPUT">
      <source-position filename="libvips/include/vips/object.h" line="99"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="ARGUMENT_REQUIRED_INPUT"
              value="19"
              c:type="VIPS_ARGUMENT_REQUIRED_INPUT">
      <source-position filename="libvips/include/vips/object.h" line="93"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="ARGUMENT_REQUIRED_OUTPUT"
              value="35"
              c:type="VIPS_ARGUMENT_REQUIRED_OUTPUT">
      <source-position filename="libvips/include/vips/object.h" line="97"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <function-macro name="ARG_IMAGE"
                    c:identifier="VIPS_ARG_IMAGE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/object.h" line="101"/>
      <parameters>
        <parameter name="CLASS">
        </parameter>
        <parameter name="NAME">
        </parameter>
        <parameter name="PRIORITY">
        </parameter>
        <parameter name="LONG">
        </parameter>
        <parameter name="DESC">
        </parameter>
        <parameter name="FLAGS">
        </parameter>
        <parameter name="OFFSET">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="ARG_INTERPOLATE"
                    c:identifier="VIPS_ARG_INTERPOLATE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/object.h" line="127"/>
      <parameters>
        <parameter name="CLASS">
        </parameter>
        <parameter name="NAME">
        </parameter>
        <parameter name="PRIORITY">
        </parameter>
        <parameter name="LONG">
        </parameter>
        <parameter name="DESC">
        </parameter>
        <parameter name="FLAGS">
        </parameter>
        <parameter name="OFFSET">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="ARG_OBJECT"
                    c:identifier="VIPS_ARG_OBJECT"
                    introspectable="0">
      <source-position filename="libvips/include/vips/object.h" line="114"/>
      <parameters>
        <parameter name="CLASS">
        </parameter>
        <parameter name="NAME">
        </parameter>
        <parameter name="PRIORITY">
        </parameter>
        <parameter name="LONG">
        </parameter>
        <parameter name="DESC">
        </parameter>
        <parameter name="FLAGS">
        </parameter>
        <parameter name="OFFSET">
        </parameter>
        <parameter name="TYPE">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="ARRAY" c:identifier="VIPS_ARRAY" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="136">Allocate memory for an array of objects of type @T. The memory is not
cleared.

This macro cannot fail. See vips_tracked_malloc() if you are
allocating large amounts of memory.

See also: vips_malloc().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="71"/>
      <parameters>
        <parameter name="OBJ">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="138">allocate memory local to @OBJ, or %NULL for no auto-free</doc>
        </parameter>
        <parameter name="N">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="139">number of @T 's to allocate</doc>
        </parameter>
        <parameter name="T">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="140">type of thing to allocate</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="ARRAY_ADDR"
                    c:identifier="VIPS_ARRAY_ADDR"
                    introspectable="0">
      <source-position filename="libvips/include/vips/type.h" line="114"/>
      <parameters>
        <parameter name="X">
        </parameter>
        <parameter name="I">
        </parameter>
      </parameters>
    </function-macro>
    <constant name="A_X0" value="109.850300" c:type="VIPS_A_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="189">Areas under curves for illuminant A (2856K), 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="72"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="A_Y0" value="100.000000" c:type="VIPS_A_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="73"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="A_Z0" value="35.584900" c:type="VIPS_A_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="74"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <enumeration name="Access"
                 glib:type-name="VipsAccess"
                 glib:get-type="vips_access_get_type"
                 c:type="VipsAccess">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="155">The type of access an operation has to supply. See vips_tilecache()
and #VipsForeign.

@VIPS_ACCESS_RANDOM means requests can come in any order.

@VIPS_ACCESS_SEQUENTIAL means requests will be top-to-bottom, but with some
amount of buffering behind the read point for small non-local accesses.</doc>
      <member name="random"
              value="0"
              c:identifier="VIPS_ACCESS_RANDOM"
              glib:nick="random"
              glib:name="VIPS_ACCESS_RANDOM">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="157">can read anywhere</doc>
      </member>
      <member name="sequential"
              value="1"
              c:identifier="VIPS_ACCESS_SEQUENTIAL"
              glib:nick="sequential"
              glib:name="VIPS_ACCESS_SEQUENTIAL">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="158">top-to-bottom reading only, but with a small buffer</doc>
      </member>
      <member name="sequential_unbuffered"
              value="2"
              c:identifier="VIPS_ACCESS_SEQUENTIAL_UNBUFFERED"
              glib:nick="sequential-unbuffered"
              glib:name="VIPS_ACCESS_SEQUENTIAL_UNBUFFERED">
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_ACCESS_LAST"
              glib:nick="last"
              glib:name="VIPS_ACCESS_LAST">
      </member>
    </enumeration>
    <enumeration name="Align"
                 glib:type-name="VipsAlign"
                 glib:get-type="vips_align_get_type"
                 c:type="VipsAlign">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="182">See vips_join() and so on.

Operations like vips_join() need to be told whether to align images on the
low or high coordinate edge, or centre.

See also: vips_join().</doc>
      <member name="low"
              value="0"
              c:identifier="VIPS_ALIGN_LOW"
              glib:nick="low"
              glib:name="VIPS_ALIGN_LOW">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="184">align low coordinate edge</doc>
      </member>
      <member name="centre"
              value="1"
              c:identifier="VIPS_ALIGN_CENTRE"
              glib:nick="centre"
              glib:name="VIPS_ALIGN_CENTRE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="185">align centre</doc>
      </member>
      <member name="high"
              value="2"
              c:identifier="VIPS_ALIGN_HIGH"
              glib:nick="high"
              glib:name="VIPS_ALIGN_HIGH">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="186">align high coordinate edge</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_ALIGN_LAST"
              glib:nick="last"
              glib:name="VIPS_ALIGN_LAST">
      </member>
    </enumeration>
    <enumeration name="Angle"
                 glib:type-name="VipsAngle"
                 glib:get-type="vips_angle_get_type"
                 c:type="VipsAngle">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="196">See vips_rot() and so on.

Fixed rotate angles.

See also: vips_rot().</doc>
      <member name="d0"
              value="0"
              c:identifier="VIPS_ANGLE_D0"
              glib:nick="d0"
              glib:name="VIPS_ANGLE_D0">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="198">no rotate</doc>
      </member>
      <member name="d90"
              value="1"
              c:identifier="VIPS_ANGLE_D90"
              glib:nick="d90"
              glib:name="VIPS_ANGLE_D90">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="199">90 degrees clockwise</doc>
      </member>
      <member name="d180"
              value="2"
              c:identifier="VIPS_ANGLE_D180"
              glib:nick="d180"
              glib:name="VIPS_ANGLE_D180">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="200">180 degree rotate</doc>
      </member>
      <member name="d270"
              value="3"
              c:identifier="VIPS_ANGLE_D270"
              glib:nick="d270"
              glib:name="VIPS_ANGLE_D270">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="201">90 degrees anti-clockwise</doc>
      </member>
      <member name="last"
              value="4"
              c:identifier="VIPS_ANGLE_LAST"
              glib:nick="last"
              glib:name="VIPS_ANGLE_LAST">
      </member>
    </enumeration>
    <enumeration name="Angle45"
                 glib:type-name="VipsAngle45"
                 glib:get-type="vips_angle45_get_type"
                 c:type="VipsAngle45">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="246">See vips_rot45() and so on.

Fixed rotate angles.

See also: vips_rot45().</doc>
      <member name="d0"
              value="0"
              c:identifier="VIPS_ANGLE45_D0"
              glib:nick="d0"
              glib:name="VIPS_ANGLE45_D0">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="248">no rotate</doc>
      </member>
      <member name="d45"
              value="1"
              c:identifier="VIPS_ANGLE45_D45"
              glib:nick="d45"
              glib:name="VIPS_ANGLE45_D45">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="249">45 degrees clockwise</doc>
      </member>
      <member name="d90"
              value="2"
              c:identifier="VIPS_ANGLE45_D90"
              glib:nick="d90"
              glib:name="VIPS_ANGLE45_D90">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="250">90 degrees clockwise</doc>
      </member>
      <member name="d135"
              value="3"
              c:identifier="VIPS_ANGLE45_D135"
              glib:nick="d135"
              glib:name="VIPS_ANGLE45_D135">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="251">135 degrees clockwise</doc>
      </member>
      <member name="d180"
              value="4"
              c:identifier="VIPS_ANGLE45_D180"
              glib:nick="d180"
              glib:name="VIPS_ANGLE45_D180">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="252">180 degrees</doc>
      </member>
      <member name="d225"
              value="5"
              c:identifier="VIPS_ANGLE45_D225"
              glib:nick="d225"
              glib:name="VIPS_ANGLE45_D225">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="253">135 degrees anti-clockwise</doc>
      </member>
      <member name="d270"
              value="6"
              c:identifier="VIPS_ANGLE45_D270"
              glib:nick="d270"
              glib:name="VIPS_ANGLE45_D270">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="254">90 degrees anti-clockwise</doc>
      </member>
      <member name="d315"
              value="7"
              c:identifier="VIPS_ANGLE45_D315"
              glib:nick="d315"
              glib:name="VIPS_ANGLE45_D315">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="255">45 degrees anti-clockwise</doc>
      </member>
      <member name="last"
              value="8"
              c:identifier="VIPS_ANGLE45_LAST"
              glib:nick="last"
              glib:name="VIPS_ANGLE45_LAST">
      </member>
    </enumeration>
    <record name="Area"
            c:type="VipsArea"
            glib:type-name="VipsArea"
            glib:get-type="vips_area_get_type"
            c:symbol-prefix="area">
      <source-position filename="libvips/include/vips/type.h" line="94"/>
      <field name="data" writable="1">
        <type name="gpointer" c:type="void*"/>
      </field>
      <field name="length" writable="1">
        <type name="gsize" c:type="size_t"/>
      </field>
      <field name="n" writable="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="count" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="lock" readable="0" private="1">
        <type name="GLib.Mutex" c:type="GMutex*"/>
      </field>
      <field name="free_fn" readable="0" private="1">
        <type name="CallbackFn" c:type="VipsCallbackFn"/>
      </field>
      <field name="client" readable="0" private="1">
        <type name="gpointer" c:type="void*"/>
      </field>
      <field name="type" readable="0" private="1">
        <type name="GType" c:type="GType"/>
      </field>
      <field name="sizeof_type" readable="0" private="1">
        <type name="gsize" c:type="size_t"/>
      </field>
      <constructor name="new" c:identifier="vips_area_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="234">A VipsArea wraps a chunk of memory. It adds reference counting and a free
function. It also keeps a count and a %GType, so the area can be an array.

This type is used for things like passing an array of double or an array of
#VipsObject pointers to operations, and for reference-counted immutable
strings.

Initial count == 1, so _unref() after attaching somewhere.

See also: vips_area_unref().</doc>
        <source-position filename="libvips/include/vips/type.h" line="104"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="250">the new #VipsArea.</doc>
          <type name="Area" c:type="VipsArea*"/>
        </return-value>
        <parameters>
          <parameter name="free_fn"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1"
                     scope="async"
                     closure="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="236">@data will be freed with this function</doc>
            <type name="CallbackFn" c:type="VipsCallbackFn"/>
          </parameter>
          <parameter name="data"
                     transfer-ownership="full"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="237">data will be freed with this function</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_array" c:identifier="vips_area_new_array">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="308">An area which holds an array of elements of some %GType. To set values for
the elements, get the pointer and write.

See also: vips_area_unref().</doc>
        <source-position filename="libvips/include/vips/type.h" line="106"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="319">the new #VipsArea.</doc>
          <type name="Area" c:type="VipsArea*"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="310">%GType of elements to store</doc>
            <type name="GType" c:type="GType"/>
          </parameter>
          <parameter name="sizeof_type" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="311">sizeof() an element in the array</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="312">number of elements in the array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_array_object"
                   c:identifier="vips_area_new_array_object">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="351">An area which holds an array of %GObject s. See vips_area_new_array(). When
the area is freed, each %GObject will be unreffed.

Add an extra NULL element at the end, handy for eg.
vips_image_pipeline_array() etc.

See also: vips_area_unref().</doc>
        <source-position filename="libvips/include/vips/type.h" line="108"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="363">the new #VipsArea.</doc>
          <type name="Area" c:type="VipsArea*"/>
        </return-value>
        <parameters>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="353">number of elements in the array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="copy" c:identifier="vips_area_copy">
        <source-position filename="libvips/include/vips/type.h" line="97"/>
        <return-value transfer-ownership="full">
          <type name="Area" c:type="VipsArea*"/>
        </return-value>
        <parameters>
          <instance-parameter name="area" transfer-ownership="none">
            <type name="Area" c:type="VipsArea*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_data" c:identifier="vips_area_get_data">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="382">Return the data pointer plus optionally the length in bytes of an area,
the number of elements, the %GType of each element and the sizeof() each
element.</doc>
        <source-position filename="libvips/include/vips/type.h" line="110"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="394">The pointer held by @area.</doc>
          <type name="gpointer" c:type="void*"/>
        </return-value>
        <parameters>
          <instance-parameter name="area" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="384">#VipsArea to fetch from</doc>
            <type name="Area" c:type="VipsArea*"/>
          </instance-parameter>
          <parameter name="length"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     optional="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="385">optionally return length in bytes here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="n"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     optional="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="386">optionally return number of elements here</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="type"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     optional="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="387">optionally return element type here</doc>
            <type name="GType" c:type="GType*"/>
          </parameter>
          <parameter name="sizeof_type"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     optional="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="388">optionally return sizeof() element type here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
        </parameters>
      </method>
      <method name="unref" c:identifier="vips_area_unref">
        <source-position filename="libvips/include/vips/type.h" line="101"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="area" transfer-ownership="none">
            <type name="Area" c:type="VipsArea*"/>
          </instance-parameter>
        </parameters>
      </method>
      <function name="free_cb" c:identifier="vips_area_free_cb">
        <source-position filename="libvips/include/vips/type.h" line="99"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <parameter name="mem"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
          <parameter name="area" transfer-ownership="none">
            <type name="Area" c:type="VipsArea*"/>
          </parameter>
        </parameters>
      </function>
    </record>
    <record name="Argument" c:type="VipsArgument">
      <source-position filename="libvips/include/vips/object.h" line="270"/>
      <field name="pspec" writable="1">
        <type name="GObject.ParamSpec" c:type="GParamSpec*"/>
      </field>
      <function name="get_id"
                c:identifier="vips_argument_get_id"
                introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="230">Allocate a new property id. See g_object_class_install_property().</doc>
        <source-position filename="libvips/include/vips/object.h" line="320"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="235">a new property id &gt; 0</doc>
          <type name="gint" c:type="int"/>
        </return-value>
      </function>
      <function name="map" c:identifier="vips_argument_map" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="581">Loop over the vips_arguments to an object. Stop when @fn returns non-%NULL
and return that value.</doc>
        <source-position filename="libvips/include/vips/object.h" line="327"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="591">%NULL if @fn returns %NULL for all arguments, otherwise the first
non-%NULL value from @fn.</doc>
          <type name="gpointer" c:type="void*"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="583">object whose args should be enumerated</doc>
            <type name="Object" c:type="VipsObject*"/>
          </parameter>
          <parameter name="fn" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="584">call this function for every argument</doc>
            <type name="ArgumentMapFn" c:type="VipsArgumentMapFn"/>
          </parameter>
          <parameter name="a"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="585">client data</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
          <parameter name="b"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="586">client data</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </function>
    </record>
    <record name="ArgumentClass" c:type="VipsArgumentClass">
      <source-position filename="libvips/include/vips/object.h" line="284"/>
      <field name="parent" writable="1">
        <type name="Argument" c:type="VipsArgument"/>
      </field>
      <field name="object_class" writable="1">
        <type name="ObjectClass" c:type="VipsObjectClass*"/>
      </field>
      <field name="flags" writable="1">
        <type name="ArgumentFlags" c:type="VipsArgumentFlags"/>
      </field>
      <field name="priority" writable="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="offset" writable="1">
        <type name="guint" c:type="guint"/>
      </field>
      <method name="needsstring"
              c:identifier="vips_argument_class_needsstring">
        <source-position filename="libvips/include/vips/object.h" line="339"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="argument_class" transfer-ownership="none">
            <type name="ArgumentClass" c:type="VipsArgumentClass*"/>
          </instance-parameter>
        </parameters>
      </method>
      <function name="map"
                c:identifier="vips_argument_class_map"
                introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="625">And loop over a class. Same as ^^, but with no VipsArgumentInstance.</doc>
        <source-position filename="libvips/include/vips/object.h" line="336"/>
        <return-value transfer-ownership="none" nullable="1">
          <type name="gpointer" c:type="void*"/>
        </return-value>
        <parameters>
          <parameter name="object_class" transfer-ownership="none">
            <type name="ObjectClass" c:type="VipsObjectClass*"/>
          </parameter>
          <parameter name="fn" transfer-ownership="none">
            <type name="ArgumentClassMapFn" c:type="VipsArgumentClassMapFn"/>
          </parameter>
          <parameter name="a"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
          <parameter name="b"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </function>
    </record>
    <callback name="ArgumentClassMapFn" c:type="VipsArgumentClassMapFn">
      <source-position filename="libvips/include/vips/object.h" line="332"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="object_class" transfer-ownership="none">
          <type name="ObjectClass" c:type="VipsObjectClass*"/>
        </parameter>
        <parameter name="pspec" transfer-ownership="none">
          <type name="GObject.ParamSpec" c:type="GParamSpec*"/>
        </parameter>
        <parameter name="argument_class" transfer-ownership="none">
          <type name="ArgumentClass" c:type="VipsArgumentClass*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <bitfield name="ArgumentFlags"
              glib:type-name="VipsArgumentFlags"
              glib:get-type="vips_argument_flags_get_type"
              c:type="VipsArgumentFlags">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="165">Flags we associate with each object argument.

Have separate input &amp; output flags. Both set is an error; neither set is OK.

Input gobjects are automatically reffed, output gobjects automatically ref
us. We also automatically watch for "destroy" and unlink.

@VIPS_ARGUMENT_SET_ALWAYS is handy for arguments which are set from C. For
example, VipsImage::width is a property that gives access to the Xsize
member of struct _VipsImage. We default its 'assigned' to TRUE
since the field is always set directly by C.

@VIPS_ARGUMENT_DEPRECATED arguments are not shown in help text, are not
looked for if required, are not checked for "have-been-set". You can
deprecate a required argument, but you must obviously add a new required
argument if you do.

Input args with @VIPS_ARGUMENT_MODIFY will be modified by the operation.
This is used for things like the in-place drawing operations.

@VIPS_ARGUMENT_NON_HASHABLE stops the argument being used in hash and
equality tests. It's useful for arguments like `revalidate` which
control the behaviour of the operator cache.</doc>
      <member name="none"
              value="0"
              c:identifier="VIPS_ARGUMENT_NONE"
              glib:nick="none"
              glib:name="VIPS_ARGUMENT_NONE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="167">no flags</doc>
      </member>
      <member name="required"
              value="1"
              c:identifier="VIPS_ARGUMENT_REQUIRED"
              glib:nick="required"
              glib:name="VIPS_ARGUMENT_REQUIRED">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="168">must be set in the constructor</doc>
      </member>
      <member name="construct"
              value="2"
              c:identifier="VIPS_ARGUMENT_CONSTRUCT"
              glib:nick="construct"
              glib:name="VIPS_ARGUMENT_CONSTRUCT">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="169">can only be set in the constructor</doc>
      </member>
      <member name="set_once"
              value="4"
              c:identifier="VIPS_ARGUMENT_SET_ONCE"
              glib:nick="set-once"
              glib:name="VIPS_ARGUMENT_SET_ONCE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="170">can only be set once</doc>
      </member>
      <member name="set_always"
              value="8"
              c:identifier="VIPS_ARGUMENT_SET_ALWAYS"
              glib:nick="set-always"
              glib:name="VIPS_ARGUMENT_SET_ALWAYS">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="171">don't do use-before-set checks</doc>
      </member>
      <member name="input"
              value="16"
              c:identifier="VIPS_ARGUMENT_INPUT"
              glib:nick="input"
              glib:name="VIPS_ARGUMENT_INPUT">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="172">is an input argument (one we depend on)</doc>
      </member>
      <member name="output"
              value="32"
              c:identifier="VIPS_ARGUMENT_OUTPUT"
              glib:nick="output"
              glib:name="VIPS_ARGUMENT_OUTPUT">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="173">is an output argument (depends on us)</doc>
      </member>
      <member name="deprecated"
              value="64"
              c:identifier="VIPS_ARGUMENT_DEPRECATED"
              glib:nick="deprecated"
              glib:name="VIPS_ARGUMENT_DEPRECATED">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="174">just there for back-compat, hide</doc>
      </member>
      <member name="modify"
              value="128"
              c:identifier="VIPS_ARGUMENT_MODIFY"
              glib:nick="modify"
              glib:name="VIPS_ARGUMENT_MODIFY">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="175">the input argument will be modified</doc>
      </member>
      <member name="non_hashable"
              value="256"
              c:identifier="VIPS_ARGUMENT_NON_HASHABLE"
              glib:nick="non-hashable"
              glib:name="VIPS_ARGUMENT_NON_HASHABLE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="176">the argument is non-hashable</doc>
      </member>
    </bitfield>
    <record name="ArgumentInstance" c:type="VipsArgumentInstance">
      <source-position filename="libvips/include/vips/object.h" line="312"/>
      <field name="parent" writable="1">
        <type name="Argument" c:type="VipsArgument"/>
      </field>
      <field name="argument_class" writable="1">
        <type name="ArgumentClass" c:type="VipsArgumentClass*"/>
      </field>
      <field name="object" writable="1">
        <type name="Object" c:type="VipsObject*"/>
      </field>
      <field name="assigned" writable="1">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="close_id" writable="1">
        <type name="gulong" c:type="gulong"/>
      </field>
      <field name="invalidate_id" writable="1">
        <type name="gulong" c:type="gulong"/>
      </field>
    </record>
    <callback name="ArgumentMapFn" c:type="VipsArgumentMapFn">
      <source-position filename="libvips/include/vips/object.h" line="323"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="object" transfer-ownership="none">
          <type name="Object" c:type="VipsObject*"/>
        </parameter>
        <parameter name="pspec" transfer-ownership="none">
          <type name="GObject.ParamSpec" c:type="GParamSpec*"/>
        </parameter>
        <parameter name="argument_class" transfer-ownership="none">
          <type name="ArgumentClass" c:type="VipsArgumentClass*"/>
        </parameter>
        <parameter name="argument_instance" transfer-ownership="none">
          <type name="ArgumentInstance" c:type="VipsArgumentInstance*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <record name="ArrayDouble"
            c:type="VipsArrayDouble"
            glib:type-name="VipsArrayDouble"
            glib:get-type="vips_array_double_get_type"
            c:symbol-prefix="array_double">
      <source-position filename="libvips/include/vips/type.h" line="205"/>
      <field name="area" writable="1">
        <type name="Area" c:type="VipsArea"/>
      </field>
      <constructor name="new" c:identifier="vips_array_double_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1055">Allocate a new array of doubles and copy @array into it. Free with
vips_area_unref().

See also: #VipsArea.</doc>
        <source-position filename="libvips/include/vips/type.h" line="208"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1065">A new #VipsArrayDouble.</doc>
          <type name="ArrayDouble" c:type="VipsArrayDouble*"/>
        </return-value>
        <parameters>
          <parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1057">array of double</doc>
            <array length="1" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1058">number of doubles</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="newv"
                   c:identifier="vips_array_double_newv"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1080">Allocate a new array of @n doubles and copy @... into it. Free with
vips_area_unref().

See also: vips_array_double_new()</doc>
        <source-position filename="libvips/include/vips/type.h" line="210"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1090">A new #VipsArrayDouble.</doc>
          <type name="ArrayDouble" c:type="VipsArrayDouble*"/>
        </return-value>
        <parameters>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1082">number of doubles</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1083">list of double arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </constructor>
      <method name="get" c:identifier="vips_array_double_get">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1111">Fetch a double array from a #VipsArrayDouble. Useful for language bindings.</doc>
        <source-position filename="libvips/include/vips/type.h" line="212"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1118">array of double</doc>
          <array length="0" zero-terminated="0" c:type="double*">
            <type name="gdouble" c:type="double"/>
          </array>
        </return-value>
        <parameters>
          <instance-parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1113">the #VipsArrayDouble to fetch from</doc>
            <type name="ArrayDouble" c:type="VipsArrayDouble*"/>
          </instance-parameter>
          <parameter name="n"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1114">length of array</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
    </record>
    <record name="ArrayImage"
            c:type="VipsArrayImage"
            glib:type-name="VipsArrayImage"
            glib:get-type="vips_array_image_get_type"
            c:symbol-prefix="array_image">
      <source-position filename="libvips/include/vips/type.h" line="245"/>
      <field name="area" writable="1">
        <type name="Area" c:type="VipsArea"/>
      </field>
      <constructor name="empty" c:identifier="vips_array_image_empty">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1394">Make an empty image array.
Handy with vips_array_image_add() for bindings
which can't handle object array arguments.

See also: vips_array_image_add().</doc>
        <source-position filename="libvips/include/vips/image.h" line="584"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1403">A new #VipsArrayImage.</doc>
          <type name="ArrayImage" c:type="VipsArrayImage*"/>
        </return-value>
      </constructor>
      <constructor name="new" c:identifier="vips_array_image_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1269">Allocate a new array of images and copy @array into it. Free with
vips_area_unref().

The images will all be reffed by this function. They
will be automatically unreffed for you by
vips_area_unref().

Add an extra NULL element at the end, handy for eg.
vips_image_pipeline_array() etc.

See also: #VipsArea.</doc>
        <source-position filename="libvips/include/vips/image.h" line="577"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1286">A new #VipsArrayImage.</doc>
          <type name="ArrayImage" c:type="VipsArrayImage*"/>
        </return-value>
        <parameters>
          <parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1271">array of #VipsImage</doc>
            <array length="1" zero-terminated="0" c:type="VipsImage**">
              <type name="Image" c:type="VipsImage*"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1272">number of images</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_string"
                   c:identifier="vips_array_image_new_from_string">
        <source-position filename="libvips/include/vips/image.h" line="581"/>
        <return-value transfer-ownership="full">
          <type name="ArrayImage" c:type="VipsArrayImage*"/>
        </return-value>
        <parameters>
          <parameter name="string" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="flags" transfer-ownership="none">
            <type name="Access" c:type="VipsAccess"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="newv"
                   c:identifier="vips_array_image_newv"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1307">Allocate a new array of @n #VipsImage and copy @... into it. Free with
vips_area_unref().

The images will all be reffed by this function. They
will be automatically unreffed for you by
vips_area_unref().

Add an extra NULL element at the end, handy for eg.
vips_image_pipeline_array() etc.

See also: vips_array_image_new()</doc>
        <source-position filename="libvips/include/vips/image.h" line="579"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1324">A new #VipsArrayImage.</doc>
          <type name="ArrayImage" c:type="VipsArrayImage*"/>
        </return-value>
        <parameters>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1309">number of images</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1310">list of #VipsImage arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </constructor>
      <method name="append" c:identifier="vips_array_image_append">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1411">Make a new #VipsArrayImage, one larger than @array, with @image appended
to the end.
Handy with vips_array_image_empty() for bindings
which can't handle object array arguments.

See also: vips_array_image_empty().</doc>
        <source-position filename="libvips/include/vips/image.h" line="586"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1423">A new #VipsArrayImage.</doc>
          <type name="ArrayImage" c:type="VipsArrayImage*"/>
        </return-value>
        <parameters>
          <instance-parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1413">append to this</doc>
            <type name="ArrayImage" c:type="VipsArrayImage*"/>
          </instance-parameter>
          <parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1414">add this</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get" c:identifier="vips_array_image_get">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1451">Fetch an image array from a #VipsArrayImage. Useful for language bindings.</doc>
        <source-position filename="libvips/include/vips/image.h" line="589"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1458">array of #VipsImage</doc>
          <array length="0" zero-terminated="0" c:type="VipsImage**">
            <type name="Image" c:type="VipsImage*"/>
          </array>
        </return-value>
        <parameters>
          <instance-parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1453">the #VipsArrayImage to fetch from</doc>
            <type name="ArrayImage" c:type="VipsArrayImage*"/>
          </instance-parameter>
          <parameter name="n"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="1454">length of array</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
    </record>
    <record name="ArrayInt"
            c:type="VipsArrayInt"
            glib:type-name="VipsArrayInt"
            glib:get-type="vips_array_int_get_type"
            c:symbol-prefix="array_int">
      <source-position filename="libvips/include/vips/type.h" line="225"/>
      <field name="area" writable="1">
        <type name="Area" c:type="VipsArea"/>
      </field>
      <constructor name="new" c:identifier="vips_array_int_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="810">Allocate a new array of ints and copy @array into it. Free with
vips_area_unref().

See also: #VipsArea.</doc>
        <source-position filename="libvips/include/vips/type.h" line="228"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="820">A new #VipsArrayInt.</doc>
          <type name="ArrayInt" c:type="VipsArrayInt*"/>
        </return-value>
        <parameters>
          <parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="812">array of int</doc>
            <array length="1" zero-terminated="0" c:type="const int*">
              <type name="gint" c:type="int"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="813">number of ints</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="newv"
                   c:identifier="vips_array_int_newv"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="835">Allocate a new array of @n ints and copy @... into it. Free with
vips_area_unref().

See also: vips_array_int_new()</doc>
        <source-position filename="libvips/include/vips/type.h" line="230"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="845">A new #VipsArrayInt.</doc>
          <type name="ArrayInt" c:type="VipsArrayInt*"/>
        </return-value>
        <parameters>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="837">number of ints</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="838">list of int arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </constructor>
      <method name="get" c:identifier="vips_array_int_get">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="866">Fetch an int array from a #VipsArrayInt. Useful for language bindings.</doc>
        <source-position filename="libvips/include/vips/type.h" line="232"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="873">array of int</doc>
          <array length="0" zero-terminated="0" c:type="int*">
            <type name="gint" c:type="int"/>
          </array>
        </return-value>
        <parameters>
          <instance-parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="868">the #VipsArrayInt to fetch from</doc>
            <type name="ArrayInt" c:type="VipsArrayInt*"/>
          </instance-parameter>
          <parameter name="n"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="869">length of array</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
    </record>
    <constant name="B_X0" value="99.072000" c:type="VIPS_B_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="195">Areas under curves for illuminant B (4874K), 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="78"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="B_Y0" value="100.000000" c:type="VIPS_B_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="79"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="B_Z0" value="85.223000" c:type="VIPS_B_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="80"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <enumeration name="BandFormat"
                 glib:type-name="VipsBandFormat"
                 glib:get-type="vips_band_format_get_type"
                 c:type="VipsBandFormat">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="239">The format used for each band element.

Each corresponds to a native C type for the current machine. For example,
#VIPS_FORMAT_USHORT is &lt;type&gt;unsigned short&lt;/type&gt;.</doc>
      <member name="notset"
              value="-1"
              c:identifier="VIPS_FORMAT_NOTSET"
              glib:nick="notset"
              glib:name="VIPS_FORMAT_NOTSET">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="241">invalid setting</doc>
      </member>
      <member name="uchar"
              value="0"
              c:identifier="VIPS_FORMAT_UCHAR"
              glib:nick="uchar"
              glib:name="VIPS_FORMAT_UCHAR">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="242">unsigned char format</doc>
      </member>
      <member name="char"
              value="1"
              c:identifier="VIPS_FORMAT_CHAR"
              glib:nick="char"
              glib:name="VIPS_FORMAT_CHAR">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="243">char format</doc>
      </member>
      <member name="ushort"
              value="2"
              c:identifier="VIPS_FORMAT_USHORT"
              glib:nick="ushort"
              glib:name="VIPS_FORMAT_USHORT">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="244">unsigned short format</doc>
      </member>
      <member name="short"
              value="3"
              c:identifier="VIPS_FORMAT_SHORT"
              glib:nick="short"
              glib:name="VIPS_FORMAT_SHORT">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="245">short format</doc>
      </member>
      <member name="uint"
              value="4"
              c:identifier="VIPS_FORMAT_UINT"
              glib:nick="uint"
              glib:name="VIPS_FORMAT_UINT">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="246">unsigned int format</doc>
      </member>
      <member name="int"
              value="5"
              c:identifier="VIPS_FORMAT_INT"
              glib:nick="int"
              glib:name="VIPS_FORMAT_INT">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="247">int format</doc>
      </member>
      <member name="float"
              value="6"
              c:identifier="VIPS_FORMAT_FLOAT"
              glib:nick="float"
              glib:name="VIPS_FORMAT_FLOAT">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="248">float format</doc>
      </member>
      <member name="complex"
              value="7"
              c:identifier="VIPS_FORMAT_COMPLEX"
              glib:nick="complex"
              glib:name="VIPS_FORMAT_COMPLEX">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="249">complex (two floats) format</doc>
      </member>
      <member name="double"
              value="8"
              c:identifier="VIPS_FORMAT_DOUBLE"
              glib:nick="double"
              glib:name="VIPS_FORMAT_DOUBLE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="250">double float format</doc>
      </member>
      <member name="dpcomplex"
              value="9"
              c:identifier="VIPS_FORMAT_DPCOMPLEX"
              glib:nick="dpcomplex"
              glib:name="VIPS_FORMAT_DPCOMPLEX">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="251">double complex (two double) format</doc>
      </member>
      <member name="last"
              value="10"
              c:identifier="VIPS_FORMAT_LAST"
              glib:nick="last"
              glib:name="VIPS_FORMAT_LAST">
      </member>
      <function name="is8bit" c:identifier="vips_band_format_is8bit">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3799">Return %TRUE if @format is uchar or schar.</doc>
        <source-position filename="libvips/include/vips/image.h" line="564"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3801">format to test</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
        </parameters>
      </function>
      <function name="iscomplex" c:identifier="vips_band_format_iscomplex">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3859">Return %TRUE if @fmt is one of the complex types.</doc>
        <source-position filename="libvips/include/vips/image.h" line="568"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3861">format to test</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
        </parameters>
      </function>
      <function name="isfloat" c:identifier="vips_band_format_isfloat">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3829">Return %TRUE if @format is one of the float types.</doc>
        <source-position filename="libvips/include/vips/image.h" line="566"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3831">format to test</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
        </parameters>
      </function>
      <function name="isint" c:identifier="vips_band_format_isint">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3739">Return %TRUE if @format is one of the integer types.</doc>
        <source-position filename="libvips/include/vips/image.h" line="560"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3741">format to test</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
        </parameters>
      </function>
      <function name="isuint" c:identifier="vips_band_format_isuint">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3769">Return %TRUE if @format is one of the unsigned integer types.</doc>
        <source-position filename="libvips/include/vips/image.h" line="562"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3771">format to test</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
        </parameters>
      </function>
    </enumeration>
    <enumeration name="BlendMode"
                 glib:type-name="VipsBlendMode"
                 glib:get-type="vips_blend_mode_get_type"
                 c:type="VipsBlendMode">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="144">The various Porter-Duff and PDF blend modes. See vips_composite(),
for example.

The Cairo docs have a nice explanation of all the blend modes:

https://www.cairographics.org/operators

The non-separable modes are not implemented.</doc>
      <member name="clear"
              value="0"
              c:identifier="VIPS_BLEND_MODE_CLEAR"
              glib:nick="clear"
              glib:name="VIPS_BLEND_MODE_CLEAR">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="146">where the second object is drawn, the first is removed</doc>
      </member>
      <member name="source"
              value="1"
              c:identifier="VIPS_BLEND_MODE_SOURCE"
              glib:nick="source"
              glib:name="VIPS_BLEND_MODE_SOURCE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="147">the second object is drawn as if nothing were below</doc>
      </member>
      <member name="over"
              value="2"
              c:identifier="VIPS_BLEND_MODE_OVER"
              glib:nick="over"
              glib:name="VIPS_BLEND_MODE_OVER">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="148">the image shows what you would expect if you held two semi-transparent slides on top of each other</doc>
      </member>
      <member name="in"
              value="3"
              c:identifier="VIPS_BLEND_MODE_IN"
              glib:nick="in"
              glib:name="VIPS_BLEND_MODE_IN">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="149">the first object is removed completely, the second is only drawn where the first was</doc>
      </member>
      <member name="out"
              value="4"
              c:identifier="VIPS_BLEND_MODE_OUT"
              glib:nick="out"
              glib:name="VIPS_BLEND_MODE_OUT">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="150">the second is drawn only where the first isn't</doc>
      </member>
      <member name="atop"
              value="5"
              c:identifier="VIPS_BLEND_MODE_ATOP"
              glib:nick="atop"
              glib:name="VIPS_BLEND_MODE_ATOP">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="151">this leaves the first object mostly intact, but mixes both objects in the overlapping area</doc>
      </member>
      <member name="dest"
              value="6"
              c:identifier="VIPS_BLEND_MODE_DEST"
              glib:nick="dest"
              glib:name="VIPS_BLEND_MODE_DEST">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="152">leaves the first object untouched, the second is discarded completely</doc>
      </member>
      <member name="dest_over"
              value="7"
              c:identifier="VIPS_BLEND_MODE_DEST_OVER"
              glib:nick="dest-over"
              glib:name="VIPS_BLEND_MODE_DEST_OVER">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="153">like OVER, but swaps the arguments</doc>
      </member>
      <member name="dest_in"
              value="8"
              c:identifier="VIPS_BLEND_MODE_DEST_IN"
              glib:nick="dest-in"
              glib:name="VIPS_BLEND_MODE_DEST_IN">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="154">like IN, but swaps the arguments</doc>
      </member>
      <member name="dest_out"
              value="9"
              c:identifier="VIPS_BLEND_MODE_DEST_OUT"
              glib:nick="dest-out"
              glib:name="VIPS_BLEND_MODE_DEST_OUT">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="155">like OUT, but swaps the arguments</doc>
      </member>
      <member name="dest_atop"
              value="10"
              c:identifier="VIPS_BLEND_MODE_DEST_ATOP"
              glib:nick="dest-atop"
              glib:name="VIPS_BLEND_MODE_DEST_ATOP">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="156">like ATOP, but swaps the arguments</doc>
      </member>
      <member name="xor"
              value="11"
              c:identifier="VIPS_BLEND_MODE_XOR"
              glib:nick="xor"
              glib:name="VIPS_BLEND_MODE_XOR">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="157">something like a difference operator</doc>
      </member>
      <member name="add"
              value="12"
              c:identifier="VIPS_BLEND_MODE_ADD"
              glib:nick="add"
              glib:name="VIPS_BLEND_MODE_ADD">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="158">a bit like adding the two images</doc>
      </member>
      <member name="saturate"
              value="13"
              c:identifier="VIPS_BLEND_MODE_SATURATE"
              glib:nick="saturate"
              glib:name="VIPS_BLEND_MODE_SATURATE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="159">a bit like the darker of the two</doc>
      </member>
      <member name="multiply"
              value="14"
              c:identifier="VIPS_BLEND_MODE_MULTIPLY"
              glib:nick="multiply"
              glib:name="VIPS_BLEND_MODE_MULTIPLY">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="160">at least as dark as the darker of the two inputs</doc>
      </member>
      <member name="screen"
              value="15"
              c:identifier="VIPS_BLEND_MODE_SCREEN"
              glib:nick="screen"
              glib:name="VIPS_BLEND_MODE_SCREEN">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="161">at least as light as the lighter of the inputs</doc>
      </member>
      <member name="overlay"
              value="16"
              c:identifier="VIPS_BLEND_MODE_OVERLAY"
              glib:nick="overlay"
              glib:name="VIPS_BLEND_MODE_OVERLAY">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="162">multiplies or screens colors, depending on the lightness</doc>
      </member>
      <member name="darken"
              value="17"
              c:identifier="VIPS_BLEND_MODE_DARKEN"
              glib:nick="darken"
              glib:name="VIPS_BLEND_MODE_DARKEN">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="163">the darker of each component</doc>
      </member>
      <member name="lighten"
              value="18"
              c:identifier="VIPS_BLEND_MODE_LIGHTEN"
              glib:nick="lighten"
              glib:name="VIPS_BLEND_MODE_LIGHTEN">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="164">the lighter of each component</doc>
      </member>
      <member name="colour_dodge"
              value="19"
              c:identifier="VIPS_BLEND_MODE_COLOUR_DODGE"
              glib:nick="colour-dodge"
              glib:name="VIPS_BLEND_MODE_COLOUR_DODGE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="165">brighten first by a factor second</doc>
      </member>
      <member name="colour_burn"
              value="20"
              c:identifier="VIPS_BLEND_MODE_COLOUR_BURN"
              glib:nick="colour-burn"
              glib:name="VIPS_BLEND_MODE_COLOUR_BURN">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="166">darken first by a factor of second</doc>
      </member>
      <member name="hard_light"
              value="21"
              c:identifier="VIPS_BLEND_MODE_HARD_LIGHT"
              glib:nick="hard-light"
              glib:name="VIPS_BLEND_MODE_HARD_LIGHT">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="167">multiply or screen, depending on lightness</doc>
      </member>
      <member name="soft_light"
              value="22"
              c:identifier="VIPS_BLEND_MODE_SOFT_LIGHT"
              glib:nick="soft-light"
              glib:name="VIPS_BLEND_MODE_SOFT_LIGHT">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="168">darken or lighten, depending on lightness</doc>
      </member>
      <member name="difference"
              value="23"
              c:identifier="VIPS_BLEND_MODE_DIFFERENCE"
              glib:nick="difference"
              glib:name="VIPS_BLEND_MODE_DIFFERENCE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="169">difference of the two</doc>
      </member>
      <member name="exclusion"
              value="24"
              c:identifier="VIPS_BLEND_MODE_EXCLUSION"
              glib:nick="exclusion"
              glib:name="VIPS_BLEND_MODE_EXCLUSION">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="170">somewhat like DIFFERENCE, but lower-contrast</doc>
      </member>
      <member name="last"
              value="25"
              c:identifier="VIPS_BLEND_MODE_LAST"
              glib:nick="last"
              glib:name="VIPS_BLEND_MODE_LAST">
      </member>
    </enumeration>
    <record name="Blob"
            c:type="VipsBlob"
            glib:type-name="VipsBlob"
            glib:get-type="vips_blob_get_type"
            c:symbol-prefix="blob">
      <source-position filename="libvips/include/vips/type.h" line="181"/>
      <field name="area" writable="1">
        <type name="Area" c:type="VipsArea"/>
      </field>
      <constructor name="new" c:identifier="vips_blob_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="634">Like vips_area_new(), but track a length as well. The returned #VipsBlob
takes ownership of @data and will free it with @free_fn. Pass %NULL for
@free_fn to not transfer ownership.

An area of mem with a free func and a length (some sort of binary object,
like an ICC profile).

See also: vips_area_unref().</doc>
        <source-position filename="libvips/include/vips/type.h" line="184"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="649">the new #VipsBlob.</doc>
          <type name="Blob" c:type="VipsBlob*"/>
        </return-value>
        <parameters>
          <parameter name="free_fn"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1"
                     scope="async">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="636">@data will be freed with this function</doc>
            <type name="CallbackFn" c:type="VipsCallbackFn"/>
          </parameter>
          <parameter name="data" transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="637">data to store</doc>
            <array length="2" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="length" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="638">number of bytes in @data</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="get" c:identifier="vips_blob_get">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="688">Get the data from a #VipsBlob.

See also: vips_blob_new().</doc>
        <source-position filename="libvips/include/vips/type.h" line="189"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="697">the
data</doc>
          <array length="0" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </return-value>
        <parameters>
          <instance-parameter name="blob" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="690">#VipsBlob to fetch from</doc>
            <type name="Blob" c:type="VipsBlob*"/>
          </instance-parameter>
          <parameter name="length"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="691">return number of bytes of data</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set" c:identifier="vips_blob_set">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="707">Any old data is freed and new data attached.

It's sometimes useful to be able to create blobs as empty and then fill
them later.

See also: vips_blob_new().</doc>
        <source-position filename="libvips/include/vips/type.h" line="191"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="blob" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="709">#VipsBlob to set</doc>
            <type name="Blob" c:type="VipsBlob*"/>
          </instance-parameter>
          <parameter name="free_fn"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1"
                     scope="async">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="710">@data will be freed with this function</doc>
            <type name="CallbackFn" c:type="VipsCallbackFn"/>
          </parameter>
          <parameter name="data" transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="711">data to store</doc>
            <array length="2" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="length" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="712">number of bytes in @data</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
        </parameters>
      </method>
      <function name="copy" c:identifier="vips_blob_copy">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="662">Like vips_blob_new(), but take a copy of the data. Useful for bindings
which struggle with callbacks.

See also: vips_blob_new().</doc>
        <source-position filename="libvips/include/vips/type.h" line="187"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="672">the new #VipsBlob.</doc>
          <type name="Blob" c:type="VipsBlob*"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="664">data to store</doc>
            <array length="1" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="length" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="665">number of bytes in @data</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
        </parameters>
      </function>
    </record>
    <record name="Buf" c:type="VipsBuf" disguised="1" opaque="1">
      <source-position filename="libvips/include/vips/basic.h" line="103"/>
    </record>
    <function name="CMC2XYZ" c:identifier="vips_CMC2XYZ" introspectable="0">
      <source-position filename="libvips/include/vips/colour.h" line="150"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out" transfer-ownership="none">
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <constant name="CONFIG"
              value="enable debug: false&#10;enable deprecated: true&#10;enable modules: true&#10;enable cplusplus: true&#10;enable RAD load/save: true&#10;enable Analyze7 load: true&#10;enable PPM load/save: true&#10;enable GIF load: true&#10;FFTs with fftw3: true&#10;SIMD support with libhwy: true&#10;ICC profile support with lcms2: true&#10;deflate compression with zlib: true&#10;text rendering with pangocairo: true&#10;font file support with fontconfig: true&#10;EXIF metadata support with libexif: true&#10;JPEG load/save with libjpeg: true&#10;JXL load/save with libjxl: true (dynamic module: true)&#10;JPEG2000 load/save with libopenjp2: true&#10;PNG load/save with spng: true&#10;image quantisation with imagequant: true&#10;TIFF load/save with libtiff-4: true&#10;image pyramid save with libarchive: true&#10;HEIC/AVIF load/save with libheif: true (dynamic module: true)&#10;WebP load/save with libwebp: true&#10;PDF load with poppler-glib: true (dynamic module: true)&#10;SVG load with librsvg-2.0: true&#10;EXR load with OpenEXR: true&#10;WSI load with openslide: true (dynamic module: true)&#10;Matlab load with matio: true&#10;NIfTI load/save with libnifti: false&#10;FITS load/save with cfitsio: true&#10;GIF save with cgif: true&#10;Magick load/save with MagickCore: true (dynamic module: true)"
              c:type="VIPS_CONFIG">
      <source-position filename="libvips/include/vips/version.h" line="19"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <function-macro name="COUNT_PIXELS"
                    c:identifier="VIPS_COUNT_PIXELS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="189"/>
      <parameters>
        <parameter name="R">
        </parameter>
        <parameter name="N">
        </parameter>
      </parameters>
    </function-macro>
    <constant name="C_X0" value="98.070000" c:type="VIPS_C_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="201">Areas under curves for illuminant C (6774K), 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="84"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="C_Y0" value="100.000000" c:type="VIPS_C_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="85"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="C_Z0" value="118.230000" c:type="VIPS_C_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="86"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <callback name="CallbackFn" c:type="VipsCallbackFn">
      <source-position filename="libvips/include/vips/basic.h" line="73"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <callback name="ClassMapFn" c:type="VipsClassMapFn">
      <source-position filename="libvips/include/vips/object.h" line="674"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="cls" transfer-ownership="none">
          <type name="ObjectClass" c:type="VipsObjectClass*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <enumeration name="Coding"
                 glib:type-name="VipsCoding"
                 glib:get-type="vips_coding_get_type"
                 c:type="VipsCoding">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="259">How pixels are coded.

Normally, pixels are uncoded and can be manipulated as you would expect.
However some file formats code pixels for compression, and sometimes it's
useful to be able to manipulate images in the coded format.

The gaps in the numbering are historical and must be maintained. Allocate
new numbers from the end.</doc>
      <member name="error"
              value="-1"
              c:identifier="VIPS_CODING_ERROR"
              glib:nick="error"
              glib:name="VIPS_CODING_ERROR">
      </member>
      <member name="none"
              value="0"
              c:identifier="VIPS_CODING_NONE"
              glib:nick="none"
              glib:name="VIPS_CODING_NONE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="261">pixels are not coded</doc>
      </member>
      <member name="labq"
              value="2"
              c:identifier="VIPS_CODING_LABQ"
              glib:nick="labq"
              glib:name="VIPS_CODING_LABQ">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="262">pixels encode 3 float CIELAB values as 4 uchar</doc>
      </member>
      <member name="rad"
              value="6"
              c:identifier="VIPS_CODING_RAD"
              glib:nick="rad"
              glib:name="VIPS_CODING_RAD">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="263">pixels encode 3 float RGB as 4 uchar (Radiance coding)</doc>
      </member>
      <member name="last"
              value="7"
              c:identifier="VIPS_CODING_LAST"
              glib:nick="last"
              glib:name="VIPS_CODING_LAST">
      </member>
    </enumeration>
    <enumeration name="Combine"
                 glib:type-name="VipsCombine"
                 glib:get-type="vips_combine_get_type"
                 c:type="VipsCombine">
      <doc xml:space="preserve"
           filename="libvips/convolution/convolution.c"
           line="73">How to combine values. See vips_compass(), for example.</doc>
      <member name="max"
              value="0"
              c:identifier="VIPS_COMBINE_MAX"
              glib:nick="max"
              glib:name="VIPS_COMBINE_MAX">
        <doc xml:space="preserve"
             filename="libvips/convolution/convolution.c"
             line="75">take the maximum of the possible values</doc>
      </member>
      <member name="sum"
              value="1"
              c:identifier="VIPS_COMBINE_SUM"
              glib:nick="sum"
              glib:name="VIPS_COMBINE_SUM">
        <doc xml:space="preserve"
             filename="libvips/convolution/convolution.c"
             line="76">sum all the values</doc>
      </member>
      <member name="min"
              value="2"
              c:identifier="VIPS_COMBINE_MIN"
              glib:nick="min"
              glib:name="VIPS_COMBINE_MIN">
        <doc xml:space="preserve"
             filename="libvips/convolution/convolution.c"
             line="77">take the minimum value</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_COMBINE_LAST"
              glib:nick="last"
              glib:name="VIPS_COMBINE_LAST">
      </member>
    </enumeration>
    <enumeration name="CombineMode"
                 glib:type-name="VipsCombineMode"
                 glib:get-type="vips_combine_mode_get_type"
                 c:type="VipsCombineMode">
      <doc xml:space="preserve"
           filename="libvips/draw/draw.c"
           line="79">See vips_draw_image() and so on.

Operations like vips_draw_image() need to be told how to combine images
from two sources.

See also: vips_join().</doc>
      <member name="set"
              value="0"
              c:identifier="VIPS_COMBINE_MODE_SET"
              glib:nick="set"
              glib:name="VIPS_COMBINE_MODE_SET">
        <doc xml:space="preserve"
             filename="libvips/draw/draw.c"
             line="81">set pixels to the new value</doc>
      </member>
      <member name="add"
              value="1"
              c:identifier="VIPS_COMBINE_MODE_ADD"
              glib:nick="add"
              glib:name="VIPS_COMBINE_MODE_ADD">
        <doc xml:space="preserve"
             filename="libvips/draw/draw.c"
             line="82">add pixels</doc>
      </member>
      <member name="last"
              value="2"
              c:identifier="VIPS_COMBINE_MODE_LAST"
              glib:nick="last"
              glib:name="VIPS_COMBINE_MODE_LAST">
      </member>
    </enumeration>
    <enumeration name="CompassDirection"
                 glib:type-name="VipsCompassDirection"
                 glib:get-type="vips_compass_direction_get_type"
                 c:type="VipsCompassDirection">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="231">A direction on a compass. Used for vips_gravity(), for example.</doc>
      <member name="centre"
              value="0"
              c:identifier="VIPS_COMPASS_DIRECTION_CENTRE"
              glib:nick="centre"
              glib:name="VIPS_COMPASS_DIRECTION_CENTRE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="233">centre</doc>
      </member>
      <member name="north"
              value="1"
              c:identifier="VIPS_COMPASS_DIRECTION_NORTH"
              glib:nick="north"
              glib:name="VIPS_COMPASS_DIRECTION_NORTH">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="234">north</doc>
      </member>
      <member name="east"
              value="2"
              c:identifier="VIPS_COMPASS_DIRECTION_EAST"
              glib:nick="east"
              glib:name="VIPS_COMPASS_DIRECTION_EAST">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="235">east</doc>
      </member>
      <member name="south"
              value="3"
              c:identifier="VIPS_COMPASS_DIRECTION_SOUTH"
              glib:nick="south"
              glib:name="VIPS_COMPASS_DIRECTION_SOUTH">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="236">south</doc>
      </member>
      <member name="west"
              value="4"
              c:identifier="VIPS_COMPASS_DIRECTION_WEST"
              glib:nick="west"
              glib:name="VIPS_COMPASS_DIRECTION_WEST">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="237">west</doc>
      </member>
      <member name="north_east"
              value="5"
              c:identifier="VIPS_COMPASS_DIRECTION_NORTH_EAST"
              glib:nick="north-east"
              glib:name="VIPS_COMPASS_DIRECTION_NORTH_EAST">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="238">north-east</doc>
      </member>
      <member name="south_east"
              value="6"
              c:identifier="VIPS_COMPASS_DIRECTION_SOUTH_EAST"
              glib:nick="south-east"
              glib:name="VIPS_COMPASS_DIRECTION_SOUTH_EAST">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="239">south-east</doc>
      </member>
      <member name="south_west"
              value="7"
              c:identifier="VIPS_COMPASS_DIRECTION_SOUTH_WEST"
              glib:nick="south-west"
              glib:name="VIPS_COMPASS_DIRECTION_SOUTH_WEST">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="240">south-west</doc>
      </member>
      <member name="north_west"
              value="8"
              c:identifier="VIPS_COMPASS_DIRECTION_NORTH_WEST"
              glib:nick="north-west"
              glib:name="VIPS_COMPASS_DIRECTION_NORTH_WEST">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="241">north-west</doc>
      </member>
      <member name="last"
              value="9"
              c:identifier="VIPS_COMPASS_DIRECTION_LAST"
              glib:nick="last"
              glib:name="VIPS_COMPASS_DIRECTION_LAST">
      </member>
    </enumeration>
    <constant name="D3250_X0" value="105.659000" c:type="VIPS_D3250_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="213">Areas under curves for black body at 3250K, 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="92"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D3250_Y0" value="100.000000" c:type="VIPS_D3250_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="93"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D3250_Z0" value="45.850100" c:type="VIPS_D3250_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="94"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D50_X0" value="96.425000" c:type="VIPS_D50_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="183">Areas under curves for D50, 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="66"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D50_Y0" value="100.000000" c:type="VIPS_D50_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="67"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D50_Z0" value="82.468000" c:type="VIPS_D50_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="68"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D55_X0" value="95.683100" c:type="VIPS_D55_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="177">Areas under curves for D55, 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="62"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D55_Y0" value="100.000000" c:type="VIPS_D55_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="63"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D55_Z0" value="92.087100" c:type="VIPS_D55_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="64"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D65_X0" value="95.047000" c:type="VIPS_D65_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="171">Areas under curves for D65, 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="58"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D65_Y0" value="100.000000" c:type="VIPS_D65_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="59"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D65_Z0" value="108.882700" c:type="VIPS_D65_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="60"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D75_X0" value="94.968200" c:type="VIPS_D75_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="165">Areas under curves for D75, 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="52"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D75_Y0" value="100.000000" c:type="VIPS_D75_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="53"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D75_Z0" value="122.571000" c:type="VIPS_D75_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="54"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D93_X0" value="89.740000" c:type="VIPS_D93_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="159">Areas under curves for D93, 2 degree observer.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="48"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D93_Y0" value="100.000000" c:type="VIPS_D93_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="49"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="D93_Z0" value="130.770000" c:type="VIPS_D93_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="50"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="DEFAULT_MAX_COORD"
              value="100000000"
              c:type="VIPS_DEFAULT_MAX_COORD">
      <source-position filename="libvips/include/vips/image.h" line="65"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <function-macro name="DEPRECATED_FOR"
                    c:identifier="VIPS_DEPRECATED_FOR"
                    introspectable="0">
      <source-position filename="libvips/include/vips/basic.h" line="53"/>
      <parameters>
        <parameter name="f">
        </parameter>
      </parameters>
    </function-macro>
    <enumeration name="DemandStyle"
                 glib:type-name="VipsDemandStyle"
                 glib:get-type="vips_demand_style_get_type"
                 c:type="VipsDemandStyle">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="169">See vips_image_pipelinev(). Operations can hint
the kind of demand geometry they prefer
to the VIPS image IO system.

These demand styles are given below in order of increasing
specialisation.  When demanding output from a pipeline,
vips_image_generate()
will use the most general style requested by the operations
in the pipeline.

#VIPS_DEMAND_STYLE_SMALLTILE --- This is the most general demand format.
Output is demanded in small (around 100x100 pel) sections. This style works
reasonably efficiently, even for bizarre operations like 45 degree rotate.

#VIPS_DEMAND_STYLE_FATSTRIP --- This operation would like to output strips
the width of the image and as high as possible. This option is suitable
for area operations which do not violently transform coordinates, such
as vips_conv().

#VIPS_DEMAND_STYLE_THINSTRIP --- This operation would like to output strips
the width of the image and a few pels high. This option is suitable for
point-to-point operations, such as those in the arithmetic package.

#VIPS_DEMAND_STYLE_ANY --- This image is not being demand-read from a disc
file (even indirectly) so any demand style is OK. It's used for things like
vips_black() where the pixels are calculated.

See also: vips_image_pipelinev().</doc>
      <member name="error"
              value="-1"
              c:identifier="VIPS_DEMAND_STYLE_ERROR"
              glib:nick="error"
              glib:name="VIPS_DEMAND_STYLE_ERROR">
      </member>
      <member name="smalltile"
              value="0"
              c:identifier="VIPS_DEMAND_STYLE_SMALLTILE"
              glib:nick="smalltile"
              glib:name="VIPS_DEMAND_STYLE_SMALLTILE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="171">demand in small (typically 128x128 pixel) tiles</doc>
      </member>
      <member name="fatstrip"
              value="1"
              c:identifier="VIPS_DEMAND_STYLE_FATSTRIP"
              glib:nick="fatstrip"
              glib:name="VIPS_DEMAND_STYLE_FATSTRIP">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="172">demand in fat (typically 16 pixel high) strips</doc>
      </member>
      <member name="thinstrip"
              value="2"
              c:identifier="VIPS_DEMAND_STYLE_THINSTRIP"
              glib:nick="thinstrip"
              glib:name="VIPS_DEMAND_STYLE_THINSTRIP">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="173">demand in thin (typically 1 pixel high) strips</doc>
      </member>
      <member name="any"
              value="3"
              c:identifier="VIPS_DEMAND_STYLE_ANY"
              glib:nick="any"
              glib:name="VIPS_DEMAND_STYLE_ANY">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="174">demand geometry does not matter</doc>
      </member>
    </enumeration>
    <enumeration name="Direction"
                 glib:type-name="VipsDirection"
                 glib:get-type="vips_direction_get_type"
                 c:type="VipsDirection">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="298">See vips_flip(), vips_join() and so on.

Operations like vips_flip() need to be told whether to flip left-right or
top-bottom.

See also: vips_flip(), vips_join().</doc>
      <member name="horizontal"
              value="0"
              c:identifier="VIPS_DIRECTION_HORIZONTAL"
              glib:nick="horizontal"
              glib:name="VIPS_DIRECTION_HORIZONTAL">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="300">left-right</doc>
      </member>
      <member name="vertical"
              value="1"
              c:identifier="VIPS_DIRECTION_VERTICAL"
              glib:nick="vertical"
              glib:name="VIPS_DIRECTION_VERTICAL">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="301">top-bottom</doc>
      </member>
      <member name="last"
              value="2"
              c:identifier="VIPS_DIRECTION_LAST"
              glib:nick="last"
              glib:name="VIPS_DIRECTION_LAST">
      </member>
    </enumeration>
    <constant name="ENABLE_DEPRECATED"
              value="1"
              c:type="VIPS_ENABLE_DEPRECATED">
      <source-position filename="libvips/include/vips/version.h" line="24"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="E_X0" value="100.000000" c:type="VIPS_E_X0">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="207">Areas under curves for equal energy illuminant E.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="88"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="E_Y0" value="100.000000" c:type="VIPS_E_Y0">
      <source-position filename="libvips/include/vips/colour.h" line="89"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <constant name="E_Z0" value="100.000000" c:type="VIPS_E_Z0">
      <source-position filename="libvips/include/vips/colour.h" line="90"/>
      <type name="gdouble" c:type="gdouble"/>
    </constant>
    <enumeration name="Extend"
                 glib:type-name="VipsExtend"
                 glib:get-type="vips_extend_get_type"
                 c:type="VipsExtend">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="264">See vips_embed(), vips_conv(), vips_affine() and so on.

When the edges of an image are extended, you can specify
how you want the extension done.

#VIPS_EXTEND_BLACK --- new pixels are black, ie. all bits are zero.

#VIPS_EXTEND_COPY --- each new pixel takes the value of the nearest edge
pixel

#VIPS_EXTEND_REPEAT --- the image is tiled to fill the new area

#VIPS_EXTEND_MIRROR --- the image is reflected and tiled to reduce hash
edges

#VIPS_EXTEND_WHITE --- new pixels are white, ie. all bits are set

#VIPS_EXTEND_BACKGROUND --- colour set from the @background property

We have to specify the exact value of each enum member since we have to
keep these frozen for back compat with vips7.

See also: vips_embed().</doc>
      <member name="black"
              value="0"
              c:identifier="VIPS_EXTEND_BLACK"
              glib:nick="black"
              glib:name="VIPS_EXTEND_BLACK">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="266">extend with black (all 0) pixels</doc>
      </member>
      <member name="copy"
              value="1"
              c:identifier="VIPS_EXTEND_COPY"
              glib:nick="copy"
              glib:name="VIPS_EXTEND_COPY">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="267">copy the image edges</doc>
      </member>
      <member name="repeat"
              value="2"
              c:identifier="VIPS_EXTEND_REPEAT"
              glib:nick="repeat"
              glib:name="VIPS_EXTEND_REPEAT">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="268">repeat the whole image</doc>
      </member>
      <member name="mirror"
              value="3"
              c:identifier="VIPS_EXTEND_MIRROR"
              glib:nick="mirror"
              glib:name="VIPS_EXTEND_MIRROR">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="269">mirror the whole image</doc>
      </member>
      <member name="white"
              value="4"
              c:identifier="VIPS_EXTEND_WHITE"
              glib:nick="white"
              glib:name="VIPS_EXTEND_WHITE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="270">extend with white (all bits set) pixels</doc>
      </member>
      <member name="background"
              value="5"
              c:identifier="VIPS_EXTEND_BACKGROUND"
              glib:nick="background"
              glib:name="VIPS_EXTEND_BACKGROUND">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="271">extend with colour from the @background property</doc>
      </member>
      <member name="last"
              value="6"
              c:identifier="VIPS_EXTEND_LAST"
              glib:nick="last"
              glib:name="VIPS_EXTEND_LAST">
      </member>
    </enumeration>
    <function-macro name="FOREIGN"
                    c:identifier="VIPS_FOREIGN"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="45"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FOREIGN_CLASS"
                    c:identifier="VIPS_FOREIGN_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="48"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FOREIGN_GET_CLASS"
                    c:identifier="VIPS_FOREIGN_GET_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="55"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FOREIGN_LOAD"
                    c:identifier="VIPS_FOREIGN_LOAD"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="132"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FOREIGN_LOAD_CLASS"
                    c:identifier="VIPS_FOREIGN_LOAD_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="135"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FOREIGN_LOAD_GET_CLASS"
                    c:identifier="VIPS_FOREIGN_LOAD_GET_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="142"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FOREIGN_SAVE"
                    c:identifier="VIPS_FOREIGN_SAVE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="298"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FOREIGN_SAVE_CLASS"
                    c:identifier="VIPS_FOREIGN_SAVE_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="301"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FOREIGN_SAVE_GET_CLASS"
                    c:identifier="VIPS_FOREIGN_SAVE_GET_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="308"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FREE" c:identifier="VIPS_FREE" introspectable="0">
      <source-position filename="libvips/include/vips/memory.h" line="50"/>
      <parameters>
        <parameter name="S">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="FREEF" c:identifier="VIPS_FREEF" introspectable="0">
      <source-position filename="libvips/include/vips/memory.h" line="40"/>
      <parameters>
        <parameter name="F">
        </parameter>
        <parameter name="S">
        </parameter>
      </parameters>
    </function-macro>
    <enumeration name="FailOn"
                 glib:type-name="VipsFailOn"
                 glib:get-type="vips_fail_on_get_type"
                 c:type="VipsFailOn">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="110">How sensitive loaders are to errors, from never stop (very insensitive), to
stop on the smallest warning (very sensitive).

Each one implies the ones before it, so #VIPS_FAIL_ON_ERROR implies
#VIPS_FAIL_ON_TRUNCATED.</doc>
      <member name="none"
              value="0"
              c:identifier="VIPS_FAIL_ON_NONE"
              glib:nick="none"
              glib:name="VIPS_FAIL_ON_NONE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="112">never stop</doc>
      </member>
      <member name="truncated"
              value="1"
              c:identifier="VIPS_FAIL_ON_TRUNCATED"
              glib:nick="truncated"
              glib:name="VIPS_FAIL_ON_TRUNCATED">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="113">stop on image truncated, nothing else</doc>
      </member>
      <member name="error"
              value="2"
              c:identifier="VIPS_FAIL_ON_ERROR"
              glib:nick="error"
              glib:name="VIPS_FAIL_ON_ERROR">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="114">stop on serious error or truncation</doc>
      </member>
      <member name="warning"
              value="3"
              c:identifier="VIPS_FAIL_ON_WARNING"
              glib:nick="warning"
              glib:name="VIPS_FAIL_ON_WARNING">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="115">stop on anything, even warnings</doc>
      </member>
      <member name="last"
              value="4"
              c:identifier="VIPS_FAIL_ON_LAST"
              glib:nick="last"
              glib:name="VIPS_FAIL_ON_LAST">
      </member>
    </enumeration>
    <class name="Foreign"
           c:symbol-prefix="foreign"
           c:type="VipsForeign"
           parent="Operation"
           abstract="1"
           glib:type-name="VipsForeign"
           glib:get-type="vips_foreign_get_type"
           glib:type-struct="ForeignClass">
      <source-position filename="libvips/include/vips/foreign.h" line="83"/>
      <function name="find_load" c:identifier="vips_foreign_find_load">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="583">Searches for an operation you could use to load @filename. Any trailing
options on @filename are stripped and ignored.

See also: vips_foreign_find_load_buffer(), vips_image_new_from_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="277"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="592">the name of an operation on success, %NULL on error</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="585">file to find a loader for</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </function>
      <function name="find_load_buffer"
                c:identifier="vips_foreign_find_load_buffer">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="682">Searches for an operation you could use to load a memory buffer. To see the
range of buffer loaders supported by your vips, try something like:

	vips -l | grep load_buffer

See also: vips_image_new_from_buffer().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="279"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="695">the name of an operation on success, %NULL on
error.</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="684">start of
memory buffer</doc>
            <array length="1" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="686">number of bytes in @data</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
        </parameters>
      </function>
      <function name="find_load_source"
                c:identifier="vips_foreign_find_load_source">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="745">Searches for an operation you could use to load a source. To see the
range of source loaders supported by your vips, try something like:

	vips -l | grep load_source

See also: vips_image_new_from_source().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="281"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="756">the name of an operation on success, %NULL on
error.</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="747">source to load from</doc>
            <type name="Source" c:type="VipsSource*"/>
          </parameter>
        </parameters>
      </function>
      <function name="find_save" c:identifier="vips_foreign_find_save">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="1978">Searches for an operation you could use to write to @filename.
Any trailing options on @filename are stripped and ignored.

See also: vips_foreign_find_save_buffer(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="434"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="1987">the name of an operation on success, %NULL on error</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="1980">name to find a saver for</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </function>
      <function name="find_save_buffer"
                c:identifier="vips_foreign_find_save_buffer">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2191">Searches for an operation you could use to write to a buffer in @suffix
format.

See also: vips_image_write_to_buffer().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="438"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2200">the name of an operation on success, %NULL on error</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <parameter name="suffix" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2193">name to find a saver for</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </function>
      <function name="find_save_target"
                c:identifier="vips_foreign_find_save_target">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2133">Searches for an operation you could use to write to a target in @suffix
format.

See also: vips_image_write_to_buffer().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="440"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2142">the name of an operation on success, %NULL on error</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <parameter name="suffix" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2135">format to find a saver for</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </function>
      <function name="get_suffixes" c:identifier="vips_foreign_get_suffixes">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2045">Get a %NULL-terminated array listing all the supported suffixes.

This is not the same as all the supported file types, since libvips
detects image format for load by testing the first few bytes.

Use vips_foreign_find_load() to detect type for a specific file.

Free the return result with g_strfreev().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="436"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2057">all supported file extensions, as a
%NULL-terminated array.</doc>
          <array zero-terminated="0" c:type="gchar**">
            <type name="utf8"/>
          </array>
        </return-value>
      </function>
      <function name="is_a" c:identifier="vips_foreign_is_a">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="781">Return %TRUE if @filename can be loaded by @loader. @loader is something
like "tiffload" or "VipsForeignLoadTiff".</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="286"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="789">%TRUE if @filename can be loaded by @loader.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="loader" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="783">name of loader to use for test</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="784">file to test</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </function>
      <function name="is_a_buffer" c:identifier="vips_foreign_is_a_buffer">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="807">Return %TRUE if @data can be loaded by @loader. @loader is something
like "tiffload_buffer" or "VipsForeignLoadTiffBuffer".</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="288"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="816">%TRUE if @data can be loaded by @loader.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="loader" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="809">name of loader to use for test</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="810">pointer to the buffer to test</doc>
            <array length="2" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="811">size of the buffer to test</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
        </parameters>
      </function>
      <function name="is_a_source" c:identifier="vips_foreign_is_a_source">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="834">Return %TRUE if @source can be loaded by @loader. @loader is something
like "tiffload_source" or "VipsForeignLoadTiffSource".</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="291"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="842">%TRUE if @data can be loaded by @source.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="loader" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="836">name of loader to use for test</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="source" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="837">source to test</doc>
            <type name="Source" c:type="VipsSource*"/>
          </parameter>
        </parameters>
      </function>
      <function name="map" c:identifier="vips_foreign_map">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="448">Apply a function to every #VipsForeignClass that VIPS knows about. Foreigns
are presented to the function in priority order.

Like all VIPS map functions, if @fn returns %NULL, iteration continues. If
it returns non-%NULL, iteration terminates and that value is returned. The
map function returns %NULL if all calls return %NULL.

See also: vips_slist_map().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="94"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="464">the result of iteration</doc>
          <type name="gpointer" c:type="void*"/>
        </return-value>
        <parameters>
          <parameter name="base" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="450">base class to search below (eg. "VipsForeignLoad")</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="fn" transfer-ownership="none" scope="call">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="451">function to apply to each #VipsForeignClass</doc>
            <type name="SListMap2Fn" c:type="VipsSListMap2Fn"/>
          </parameter>
          <parameter name="a"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="452">user data</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
          <parameter name="b"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="453">user data</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </function>
      <field name="parent_object">
        <type name="Operation" c:type="VipsOperation"/>
      </field>
    </class>
    <record name="ForeignClass"
            c:type="VipsForeignClass"
            glib:is-gtype-struct-for="Foreign">
      <source-position filename="libvips/include/vips/foreign.h" line="83"/>
      <field name="parent_class">
        <type name="OperationClass" c:type="VipsOperationClass"/>
      </field>
      <field name="priority">
        <type name="gint" c:type="int"/>
      </field>
      <field name="suffs">
        <type name="utf8" c:type="const char**"/>
      </field>
    </record>
    <enumeration name="ForeignDzContainer"
                 glib:type-name="VipsForeignDzContainer"
                 glib:get-type="vips_foreign_dz_container_get_type"
                 c:type="VipsForeignDzContainer">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="949">How many pyramid layers to create.</doc>
      <member name="fs"
              value="0"
              c:identifier="VIPS_FOREIGN_DZ_CONTAINER_FS"
              glib:nick="fs"
              glib:name="VIPS_FOREIGN_DZ_CONTAINER_FS">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="951">write tiles to the filesystem</doc>
      </member>
      <member name="zip"
              value="1"
              c:identifier="VIPS_FOREIGN_DZ_CONTAINER_ZIP"
              glib:nick="zip"
              glib:name="VIPS_FOREIGN_DZ_CONTAINER_ZIP">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="952">write tiles to a zip file</doc>
      </member>
      <member name="szi"
              value="2"
              c:identifier="VIPS_FOREIGN_DZ_CONTAINER_SZI"
              glib:nick="szi"
              glib:name="VIPS_FOREIGN_DZ_CONTAINER_SZI">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="953">write to a szi file</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_FOREIGN_DZ_CONTAINER_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_DZ_CONTAINER_LAST">
      </member>
    </enumeration>
    <enumeration name="ForeignDzDepth"
                 glib:type-name="VipsForeignDzDepth"
                 glib:get-type="vips_foreign_dz_depth_get_type"
                 c:type="VipsForeignDzDepth">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="934">How many pyramid layers to create.</doc>
      <member name="onepixel"
              value="0"
              c:identifier="VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL"
              glib:nick="onepixel"
              glib:name="VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="936">create layers down to 1x1 pixel</doc>
      </member>
      <member name="onetile"
              value="1"
              c:identifier="VIPS_FOREIGN_DZ_DEPTH_ONETILE"
              glib:nick="onetile"
              glib:name="VIPS_FOREIGN_DZ_DEPTH_ONETILE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="937">create layers down to 1x1 tile</doc>
      </member>
      <member name="one"
              value="2"
              c:identifier="VIPS_FOREIGN_DZ_DEPTH_ONE"
              glib:nick="one"
              glib:name="VIPS_FOREIGN_DZ_DEPTH_ONE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="938">only create a single layer</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_FOREIGN_DZ_DEPTH_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_DZ_DEPTH_LAST">
      </member>
    </enumeration>
    <enumeration name="ForeignDzLayout"
                 glib:type-name="VipsForeignDzLayout"
                 glib:get-type="vips_foreign_dz_layout_get_type"
                 c:type="VipsForeignDzLayout">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="915">What directory layout and metadata standard to use.</doc>
      <member name="dz"
              value="0"
              c:identifier="VIPS_FOREIGN_DZ_LAYOUT_DZ"
              glib:nick="dz"
              glib:name="VIPS_FOREIGN_DZ_LAYOUT_DZ">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="917">use DeepZoom directory layout</doc>
      </member>
      <member name="zoomify"
              value="1"
              c:identifier="VIPS_FOREIGN_DZ_LAYOUT_ZOOMIFY"
              glib:nick="zoomify"
              glib:name="VIPS_FOREIGN_DZ_LAYOUT_ZOOMIFY">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="918">use Zoomify directory layout</doc>
      </member>
      <member name="google"
              value="2"
              c:identifier="VIPS_FOREIGN_DZ_LAYOUT_GOOGLE"
              glib:nick="google"
              glib:name="VIPS_FOREIGN_DZ_LAYOUT_GOOGLE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="919">use Google maps directory layout</doc>
      </member>
      <member name="iiif"
              value="3"
              c:identifier="VIPS_FOREIGN_DZ_LAYOUT_IIIF"
              glib:nick="iiif"
              glib:name="VIPS_FOREIGN_DZ_LAYOUT_IIIF">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="920">use IIIF v2 directory layout</doc>
      </member>
      <member name="iiif3"
              value="4"
              c:identifier="VIPS_FOREIGN_DZ_LAYOUT_IIIF3"
              glib:nick="iiif3"
              glib:name="VIPS_FOREIGN_DZ_LAYOUT_IIIF3">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="921">use IIIF v3 directory layout</doc>
      </member>
      <member name="last"
              value="5"
              c:identifier="VIPS_FOREIGN_DZ_LAYOUT_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_DZ_LAYOUT_LAST">
      </member>
    </enumeration>
    <bitfield name="ForeignFlags"
              glib:type-name="VipsForeignFlags"
              glib:get-type="vips_foreign_flags_get_type"
              c:type="VipsForeignFlags">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="342">Some hints about the image loader.

#VIPS_FOREIGN_PARTIAL means that the image can be read directly from the
file without needing to be unpacked to a temporary image first.

#VIPS_FOREIGN_SEQUENTIAL means that the loader supports lazy reading, but
only top-to-bottom (sequential) access. Formats like PNG can read sets of
scanlines, for example, but only in order.

If neither PARTIAL or SEQUENTIAL is set, the loader only supports whole
image read. Setting both PARTIAL and SEQUENTIAL is an error.

#VIPS_FOREIGN_BIGENDIAN means that image pixels are most-significant byte
first. Depending on the native byte order of the host machine, you may
need to swap bytes. See vips_copy().</doc>
      <member name="none"
              value="0"
              c:identifier="VIPS_FOREIGN_NONE"
              glib:nick="none"
              glib:name="VIPS_FOREIGN_NONE">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="344">no flags set</doc>
      </member>
      <member name="partial"
              value="1"
              c:identifier="VIPS_FOREIGN_PARTIAL"
              glib:nick="partial"
              glib:name="VIPS_FOREIGN_PARTIAL">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="345">the image may be read lazilly</doc>
      </member>
      <member name="bigendian"
              value="2"
              c:identifier="VIPS_FOREIGN_BIGENDIAN"
              glib:nick="bigendian"
              glib:name="VIPS_FOREIGN_BIGENDIAN">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="346">image pixels are most-significant byte first</doc>
      </member>
      <member name="sequential"
              value="4"
              c:identifier="VIPS_FOREIGN_SEQUENTIAL"
              glib:nick="sequential"
              glib:name="VIPS_FOREIGN_SEQUENTIAL">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="347">top-to-bottom lazy reading</doc>
      </member>
      <member name="all"
              value="7"
              c:identifier="VIPS_FOREIGN_ALL"
              glib:nick="all"
              glib:name="VIPS_FOREIGN_ALL">
      </member>
    </bitfield>
    <enumeration name="ForeignHeifCompression"
                 glib:type-name="VipsForeignHeifCompression"
                 glib:get-type="vips_foreign_heif_compression_get_type"
                 c:type="VipsForeignHeifCompression">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="974">The compression format to use inside a HEIF container.

This is assumed to use the same numbering as %heif_compression_format.</doc>
      <member name="hevc"
              value="1"
              c:identifier="VIPS_FOREIGN_HEIF_COMPRESSION_HEVC"
              glib:nick="hevc"
              glib:name="VIPS_FOREIGN_HEIF_COMPRESSION_HEVC">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="976">x265</doc>
      </member>
      <member name="avc"
              value="2"
              c:identifier="VIPS_FOREIGN_HEIF_COMPRESSION_AVC"
              glib:nick="avc"
              glib:name="VIPS_FOREIGN_HEIF_COMPRESSION_AVC">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="977">x264</doc>
      </member>
      <member name="jpeg"
              value="3"
              c:identifier="VIPS_FOREIGN_HEIF_COMPRESSION_JPEG"
              glib:nick="jpeg"
              glib:name="VIPS_FOREIGN_HEIF_COMPRESSION_JPEG">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="978">jpeg</doc>
      </member>
      <member name="av1"
              value="4"
              c:identifier="VIPS_FOREIGN_HEIF_COMPRESSION_AV1"
              glib:nick="av1"
              glib:name="VIPS_FOREIGN_HEIF_COMPRESSION_AV1">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="979">aom</doc>
      </member>
      <member name="last"
              value="5"
              c:identifier="VIPS_FOREIGN_HEIF_COMPRESSION_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_HEIF_COMPRESSION_LAST">
      </member>
    </enumeration>
    <enumeration name="ForeignHeifEncoder"
                 glib:type-name="VipsForeignHeifEncoder"
                 glib:get-type="vips_foreign_heif_encoder_get_type"
                 c:type="VipsForeignHeifEncoder">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="993">The selected encoder to use.
If libheif hasn't been compiled with the selected encoder,
we will fallback to the default encoder for the compression format.</doc>
      <member name="auto"
              value="0"
              c:identifier="VIPS_FOREIGN_HEIF_ENCODER_AUTO"
              glib:nick="auto"
              glib:name="VIPS_FOREIGN_HEIF_ENCODER_AUTO">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="995">auto</doc>
      </member>
      <member name="aom"
              value="1"
              c:identifier="VIPS_FOREIGN_HEIF_ENCODER_AOM"
              glib:nick="aom"
              glib:name="VIPS_FOREIGN_HEIF_ENCODER_AOM">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="996">aom</doc>
      </member>
      <member name="rav1e"
              value="2"
              c:identifier="VIPS_FOREIGN_HEIF_ENCODER_RAV1E"
              glib:nick="rav1e"
              glib:name="VIPS_FOREIGN_HEIF_ENCODER_RAV1E">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="997">RAV1E</doc>
      </member>
      <member name="svt"
              value="3"
              c:identifier="VIPS_FOREIGN_HEIF_ENCODER_SVT"
              glib:nick="svt"
              glib:name="VIPS_FOREIGN_HEIF_ENCODER_SVT">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="998">SVT-AV1</doc>
      </member>
      <member name="x265"
              value="4"
              c:identifier="VIPS_FOREIGN_HEIF_ENCODER_X265"
              glib:nick="x265"
              glib:name="VIPS_FOREIGN_HEIF_ENCODER_X265">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="999">x265</doc>
      </member>
      <member name="last"
              value="5"
              c:identifier="VIPS_FOREIGN_HEIF_ENCODER_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_HEIF_ENCODER_LAST">
      </member>
    </enumeration>
    <enumeration name="ForeignJpegSubsample"
                 glib:type-name="VipsForeignJpegSubsample"
                 glib:get-type="vips_foreign_jpeg_subsample_get_type"
                 c:type="VipsForeignJpegSubsample">
      <member name="auto"
              value="0"
              c:identifier="VIPS_FOREIGN_JPEG_SUBSAMPLE_AUTO"
              glib:nick="auto"
              glib:name="VIPS_FOREIGN_JPEG_SUBSAMPLE_AUTO">
      </member>
      <member name="on"
              value="1"
              c:identifier="VIPS_FOREIGN_JPEG_SUBSAMPLE_ON"
              glib:nick="on"
              glib:name="VIPS_FOREIGN_JPEG_SUBSAMPLE_ON">
      </member>
      <member name="off"
              value="2"
              c:identifier="VIPS_FOREIGN_JPEG_SUBSAMPLE_OFF"
              glib:nick="off"
              glib:name="VIPS_FOREIGN_JPEG_SUBSAMPLE_OFF">
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_FOREIGN_JPEG_SUBSAMPLE_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_JPEG_SUBSAMPLE_LAST">
      </member>
    </enumeration>
    <bitfield name="ForeignKeep"
              glib:type-name="VipsForeignKeep"
              glib:get-type="vips_foreign_keep_get_type"
              c:type="VipsForeignKeep">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="333">Which metadata to retain.</doc>
      <member name="none"
              value="0"
              c:identifier="VIPS_FOREIGN_KEEP_NONE"
              glib:nick="none"
              glib:name="VIPS_FOREIGN_KEEP_NONE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="335">don't attach metadata</doc>
      </member>
      <member name="exif"
              value="1"
              c:identifier="VIPS_FOREIGN_KEEP_EXIF"
              glib:nick="exif"
              glib:name="VIPS_FOREIGN_KEEP_EXIF">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="336">keep Exif metadata</doc>
      </member>
      <member name="xmp"
              value="2"
              c:identifier="VIPS_FOREIGN_KEEP_XMP"
              glib:nick="xmp"
              glib:name="VIPS_FOREIGN_KEEP_XMP">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="337">keep XMP metadata</doc>
      </member>
      <member name="iptc"
              value="4"
              c:identifier="VIPS_FOREIGN_KEEP_IPTC"
              glib:nick="iptc"
              glib:name="VIPS_FOREIGN_KEEP_IPTC">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="338">keep IPTC metadata</doc>
      </member>
      <member name="icc"
              value="8"
              c:identifier="VIPS_FOREIGN_KEEP_ICC"
              glib:nick="icc"
              glib:name="VIPS_FOREIGN_KEEP_ICC">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="339">keep ICC metadata</doc>
      </member>
      <member name="other"
              value="16"
              c:identifier="VIPS_FOREIGN_KEEP_OTHER"
              glib:nick="other"
              glib:name="VIPS_FOREIGN_KEEP_OTHER">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="340">keep other metadata (e.g. PNG comments and some TIFF tags)</doc>
      </member>
      <member name="all"
              value="31"
              c:identifier="VIPS_FOREIGN_KEEP_ALL"
              glib:nick="all"
              glib:name="VIPS_FOREIGN_KEEP_ALL">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="341">keep all metadata</doc>
      </member>
    </bitfield>
    <class name="ForeignLoad"
           c:symbol-prefix="foreign_load"
           c:type="VipsForeignLoad"
           parent="Foreign"
           abstract="1"
           glib:type-name="VipsForeignLoad"
           glib:get-type="vips_foreign_load_get_type"
           glib:type-struct="ForeignLoadClass">
      <source-position filename="libvips/include/vips/foreign.h" line="269"/>
      <virtual-method name="get_flags">
        <source-position filename="libvips/include/vips/foreign.h" line="243"/>
        <return-value transfer-ownership="none">
          <type name="ForeignFlags" c:type="VipsForeignFlags"/>
        </return-value>
        <parameters>
          <instance-parameter name="load" transfer-ownership="none">
            <type name="ForeignLoad" c:type="VipsForeignLoad*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="header">
        <source-position filename="libvips/include/vips/foreign.h" line="257"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="load" transfer-ownership="none">
            <type name="ForeignLoad" c:type="VipsForeignLoad*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="load">
        <source-position filename="libvips/include/vips/foreign.h" line="268"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="load" transfer-ownership="none">
            <type name="ForeignLoad" c:type="VipsForeignLoad*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <property name="access"
                writable="1"
                transfer-ownership="none"
                default-value="VIPS_ACCESS_RANDOM">
        <type name="Access"/>
      </property>
      <property name="disc"
                writable="1"
                transfer-ownership="none"
                default-value="TRUE">
        <type name="gboolean" c:type="gboolean"/>
      </property>
      <property name="fail"
                writable="1"
                transfer-ownership="none"
                default-value="FALSE">
        <type name="gboolean" c:type="gboolean"/>
      </property>
      <property name="fail-on"
                writable="1"
                transfer-ownership="none"
                default-value="VIPS_FAIL_ON_NONE">
        <type name="FailOn"/>
      </property>
      <property name="flags"
                writable="1"
                transfer-ownership="none"
                default-value="VIPS_FOREIGN_NONE">
        <type name="ForeignFlags"/>
      </property>
      <property name="memory"
                writable="1"
                transfer-ownership="none"
                default-value="FALSE">
        <type name="gboolean" c:type="gboolean"/>
      </property>
      <property name="out" writable="1" transfer-ownership="none">
        <type name="Image"/>
      </property>
      <property name="revalidate"
                writable="1"
                transfer-ownership="none"
                default-value="FALSE">
        <type name="gboolean" c:type="gboolean"/>
      </property>
      <property name="sequential"
                writable="1"
                transfer-ownership="none"
                default-value="FALSE">
        <type name="gboolean" c:type="gboolean"/>
      </property>
      <field name="parent_object">
        <type name="Foreign" c:type="VipsForeign"/>
      </field>
      <field name="memory" readable="0" private="1">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="access" readable="0" private="1">
        <type name="Access" c:type="VipsAccess"/>
      </field>
      <field name="flags" readable="0" private="1">
        <type name="ForeignFlags" c:type="VipsForeignFlags"/>
      </field>
      <field name="fail_on" readable="0" private="1">
        <type name="FailOn" c:type="VipsFailOn"/>
      </field>
      <field name="fail" readable="0" private="1">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="sequential" readable="0" private="1">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="out">
        <type name="Image" c:type="VipsImage*"/>
      </field>
      <field name="real">
        <type name="Image" c:type="VipsImage*"/>
      </field>
      <field name="nocache">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="disc">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="error">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="revalidate">
        <type name="gboolean" c:type="gboolean"/>
      </field>
    </class>
    <record name="ForeignLoadClass"
            c:type="VipsForeignLoadClass"
            glib:is-gtype-struct-for="ForeignLoad">
      <source-position filename="libvips/include/vips/foreign.h" line="269"/>
      <field name="parent_class">
        <type name="ForeignClass" c:type="VipsForeignClass"/>
      </field>
      <field name="is_a">
        <callback name="is_a">
          <source-position filename="libvips/include/vips/foreign.h"
                           line="212"/>
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="filename" transfer-ownership="none">
              <type name="utf8" c:type="const char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="is_a_buffer">
        <callback name="is_a_buffer">
          <source-position filename="libvips/include/vips/foreign.h"
                           line="219"/>
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="data" transfer-ownership="none">
              <type name="gpointer" c:type="void*"/>
            </parameter>
            <parameter name="size" transfer-ownership="none">
              <type name="gsize" c:type="size_t"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="is_a_source">
        <callback name="is_a_source">
          <source-position filename="libvips/include/vips/foreign.h"
                           line="226"/>
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="VipsSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_flags_filename">
        <callback name="get_flags_filename">
          <source-position filename="libvips/include/vips/foreign.h"
                           line="237"/>
          <return-value transfer-ownership="none">
            <type name="ForeignFlags" c:type="VipsForeignFlags"/>
          </return-value>
          <parameters>
            <parameter name="filename" transfer-ownership="none">
              <type name="utf8" c:type="const char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_flags">
        <callback name="get_flags">
          <source-position filename="libvips/include/vips/foreign.h"
                           line="243"/>
          <return-value transfer-ownership="none">
            <type name="ForeignFlags" c:type="VipsForeignFlags"/>
          </return-value>
          <parameters>
            <parameter name="load" transfer-ownership="none">
              <type name="ForeignLoad" c:type="VipsForeignLoad*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="header">
        <callback name="header">
          <source-position filename="libvips/include/vips/foreign.h"
                           line="257"/>
          <return-value transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </return-value>
          <parameters>
            <parameter name="load" transfer-ownership="none">
              <type name="ForeignLoad" c:type="VipsForeignLoad*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="load">
        <callback name="load">
          <source-position filename="libvips/include/vips/foreign.h"
                           line="268"/>
          <return-value transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </return-value>
          <parameters>
            <parameter name="load" transfer-ownership="none">
              <type name="ForeignLoad" c:type="VipsForeignLoad*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <bitfield name="ForeignPngFilter"
              glib:type-name="VipsForeignPngFilter"
              glib:get-type="vips_foreign_png_filter_get_type"
              c:type="VipsForeignPngFilter">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="698">http://www.w3.org/TR/PNG-Filters.html
The values mirror those of png.h in libpng.</doc>
      <member name="none"
              value="8"
              c:identifier="VIPS_FOREIGN_PNG_FILTER_NONE"
              glib:nick="none"
              glib:name="VIPS_FOREIGN_PNG_FILTER_NONE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="700">no filtering</doc>
      </member>
      <member name="sub"
              value="16"
              c:identifier="VIPS_FOREIGN_PNG_FILTER_SUB"
              glib:nick="sub"
              glib:name="VIPS_FOREIGN_PNG_FILTER_SUB">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="701">difference to the left</doc>
      </member>
      <member name="up"
              value="32"
              c:identifier="VIPS_FOREIGN_PNG_FILTER_UP"
              glib:nick="up"
              glib:name="VIPS_FOREIGN_PNG_FILTER_UP">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="702">difference up</doc>
      </member>
      <member name="avg"
              value="64"
              c:identifier="VIPS_FOREIGN_PNG_FILTER_AVG"
              glib:nick="avg"
              glib:name="VIPS_FOREIGN_PNG_FILTER_AVG">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="703">average of left and up</doc>
      </member>
      <member name="paeth"
              value="128"
              c:identifier="VIPS_FOREIGN_PNG_FILTER_PAETH"
              glib:nick="paeth"
              glib:name="VIPS_FOREIGN_PNG_FILTER_PAETH">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="704">pick best neighbor predictor automatically</doc>
      </member>
      <member name="all"
              value="248"
              c:identifier="VIPS_FOREIGN_PNG_FILTER_ALL"
              glib:nick="all"
              glib:name="VIPS_FOREIGN_PNG_FILTER_ALL">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="705">adaptive</doc>
      </member>
    </bitfield>
    <enumeration name="ForeignPpmFormat"
                 glib:type-name="VipsForeignPpmFormat"
                 glib:get-type="vips_foreign_ppm_format_get_type"
                 c:type="VipsForeignPpmFormat">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="738">The netpbm file format to save as.

#VIPS_FOREIGN_PPM_FORMAT_PBM images are single bit.

#VIPS_FOREIGN_PPM_FORMAT_PGM images are 8, 16, or 32-bits, one band.

#VIPS_FOREIGN_PPM_FORMAT_PPM images are 8, 16, or 32-bits, three bands.

#VIPS_FOREIGN_PPM_FORMAT_PFM images are 32-bit float pixels.

#VIPS_FOREIGN_PPM_FORMAT_PNM images are anymap images -- the image format
is used to pick the saver.</doc>
      <member name="pbm"
              value="0"
              c:identifier="VIPS_FOREIGN_PPM_FORMAT_PBM"
              glib:nick="pbm"
              glib:name="VIPS_FOREIGN_PPM_FORMAT_PBM">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="740">portable bitmap</doc>
      </member>
      <member name="pgm"
              value="1"
              c:identifier="VIPS_FOREIGN_PPM_FORMAT_PGM"
              glib:nick="pgm"
              glib:name="VIPS_FOREIGN_PPM_FORMAT_PGM">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="741">portable greymap</doc>
      </member>
      <member name="ppm"
              value="2"
              c:identifier="VIPS_FOREIGN_PPM_FORMAT_PPM"
              glib:nick="ppm"
              glib:name="VIPS_FOREIGN_PPM_FORMAT_PPM">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="742">portable pixmap</doc>
      </member>
      <member name="pfm"
              value="3"
              c:identifier="VIPS_FOREIGN_PPM_FORMAT_PFM"
              glib:nick="pfm"
              glib:name="VIPS_FOREIGN_PPM_FORMAT_PFM">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="743">portable float map</doc>
      </member>
      <member name="pnm"
              value="4"
              c:identifier="VIPS_FOREIGN_PPM_FORMAT_PNM"
              glib:nick="pnm"
              glib:name="VIPS_FOREIGN_PPM_FORMAT_PNM">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="744">portable anymap</doc>
      </member>
      <member name="last"
              value="5"
              c:identifier="VIPS_FOREIGN_PPM_FORMAT_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_PPM_FORMAT_LAST">
      </member>
    </enumeration>
    <class name="ForeignSave"
           c:symbol-prefix="foreign_save"
           c:type="VipsForeignSave"
           parent="Foreign"
           abstract="1"
           glib:type-name="VipsForeignSave"
           glib:get-type="vips_foreign_save_get_type"
           glib:type-struct="ForeignSaveClass">
      <source-position filename="libvips/include/vips/foreign.h" line="426"/>
      <property name="background" writable="1" transfer-ownership="none">
        <type name="ArrayDouble"/>
      </property>
      <property name="in" writable="1" transfer-ownership="none">
        <type name="Image"/>
      </property>
      <property name="keep"
                writable="1"
                transfer-ownership="none"
                default-value="VIPS_FOREIGN_KEEP_EXIF | VIPS_FOREIGN_KEEP_XMP | VIPS_FOREIGN_KEEP_IPTC | VIPS_FOREIGN_KEEP_ICC | VIPS_FOREIGN_KEEP_OTHER">
        <type name="ForeignKeep"/>
      </property>
      <property name="page-height"
                writable="1"
                transfer-ownership="none"
                default-value="0">
        <type name="gint" c:type="gint"/>
      </property>
      <property name="profile"
                writable="1"
                transfer-ownership="none"
                default-value="NULL">
        <type name="utf8" c:type="gchar*"/>
      </property>
      <property name="strip"
                writable="1"
                transfer-ownership="none"
                default-value="FALSE">
        <type name="gboolean" c:type="gboolean"/>
      </property>
      <field name="parent_object">
        <type name="Foreign" c:type="VipsForeign"/>
      </field>
      <field name="strip">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="keep">
        <type name="ForeignKeep" c:type="VipsForeignKeep"/>
      </field>
      <field name="profile">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="background">
        <type name="ArrayDouble" c:type="VipsArrayDouble*"/>
      </field>
      <field name="page_height">
        <type name="gint" c:type="int"/>
      </field>
      <field name="in">
        <type name="Image" c:type="VipsImage*"/>
      </field>
      <field name="ready">
        <type name="Image" c:type="VipsImage*"/>
      </field>
    </class>
    <record name="ForeignSaveClass"
            c:type="VipsForeignSaveClass"
            glib:is-gtype-struct-for="ForeignSave">
      <source-position filename="libvips/include/vips/foreign.h" line="426"/>
      <field name="parent_class">
        <type name="ForeignClass" c:type="VipsForeignClass"/>
      </field>
      <field name="saveable">
        <type name="Saveable" c:type="VipsSaveable"/>
      </field>
      <field name="format_table">
        <type name="BandFormat" c:type="VipsBandFormat*"/>
      </field>
      <field name="coding">
        <array zero-terminated="0">
          <type name="gboolean" c:type="gboolean"/>
        </array>
      </field>
    </record>
    <enumeration name="ForeignSubsample"
                 glib:type-name="VipsForeignSubsample"
                 glib:get-type="vips_foreign_subsample_get_type"
                 c:type="VipsForeignSubsample">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="462">Set subsampling mode.</doc>
      <member name="auto"
              value="0"
              c:identifier="VIPS_FOREIGN_SUBSAMPLE_AUTO"
              glib:nick="auto"
              glib:name="VIPS_FOREIGN_SUBSAMPLE_AUTO">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="464">prevent subsampling when quality &gt;= 90</doc>
      </member>
      <member name="on"
              value="1"
              c:identifier="VIPS_FOREIGN_SUBSAMPLE_ON"
              glib:nick="on"
              glib:name="VIPS_FOREIGN_SUBSAMPLE_ON">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="465">always perform subsampling</doc>
      </member>
      <member name="off"
              value="2"
              c:identifier="VIPS_FOREIGN_SUBSAMPLE_OFF"
              glib:nick="off"
              glib:name="VIPS_FOREIGN_SUBSAMPLE_OFF">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="466">never perform subsampling</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_FOREIGN_SUBSAMPLE_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_SUBSAMPLE_LAST">
      </member>
    </enumeration>
    <enumeration name="ForeignTiffCompression"
                 glib:type-name="VipsForeignTiffCompression"
                 glib:get-type="vips_foreign_tiff_compression_get_type"
                 c:type="VipsForeignTiffCompression">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="544">The compression types supported by the tiff writer.

Use @Q to set the jpeg compression level, default 75.

Use @predictor to set the lzw or deflate prediction, default horizontal.

Use @lossless to set WEBP lossless compression.

Use @level to set webp and zstd compression level.</doc>
      <member name="none"
              value="0"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_NONE"
              glib:nick="none"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_NONE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="546">no compression</doc>
      </member>
      <member name="jpeg"
              value="1"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_JPEG"
              glib:nick="jpeg"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_JPEG">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="547">jpeg compression</doc>
      </member>
      <member name="deflate"
              value="2"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_DEFLATE"
              glib:nick="deflate"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_DEFLATE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="548">deflate (zip) compression</doc>
      </member>
      <member name="packbits"
              value="3"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_PACKBITS"
              glib:nick="packbits"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_PACKBITS">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="549">packbits compression</doc>
      </member>
      <member name="ccittfax4"
              value="4"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_CCITTFAX4"
              glib:nick="ccittfax4"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_CCITTFAX4">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="550">fax4 compression</doc>
      </member>
      <member name="lzw"
              value="5"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_LZW"
              glib:nick="lzw"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_LZW">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="551">LZW compression</doc>
      </member>
      <member name="webp"
              value="6"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_WEBP"
              glib:nick="webp"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_WEBP">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="552">WEBP compression</doc>
      </member>
      <member name="zstd"
              value="7"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_ZSTD"
              glib:nick="zstd"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_ZSTD">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="553">ZSTD compression</doc>
      </member>
      <member name="jp2k"
              value="8"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_JP2K"
              glib:nick="jp2k"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_JP2K">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="554">JP2K compression</doc>
      </member>
      <member name="last"
              value="9"
              c:identifier="VIPS_FOREIGN_TIFF_COMPRESSION_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_TIFF_COMPRESSION_LAST">
      </member>
    </enumeration>
    <enumeration name="ForeignTiffPredictor"
                 glib:type-name="VipsForeignTiffPredictor"
                 glib:get-type="vips_foreign_tiff_predictor_get_type"
                 c:type="VipsForeignTiffPredictor">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="579">The predictor can help deflate and lzw compression. The values are fixed by
the tiff library.</doc>
      <member name="none"
              value="1"
              c:identifier="VIPS_FOREIGN_TIFF_PREDICTOR_NONE"
              glib:nick="none"
              glib:name="VIPS_FOREIGN_TIFF_PREDICTOR_NONE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="581">no prediction</doc>
      </member>
      <member name="horizontal"
              value="2"
              c:identifier="VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL"
              glib:nick="horizontal"
              glib:name="VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="582">horizontal differencing</doc>
      </member>
      <member name="float"
              value="3"
              c:identifier="VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT"
              glib:nick="float"
              glib:name="VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="583">float predictor</doc>
      </member>
      <member name="last"
              value="4"
              c:identifier="VIPS_FOREIGN_TIFF_PREDICTOR_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_TIFF_PREDICTOR_LAST">
      </member>
    </enumeration>
    <enumeration name="ForeignTiffResunit"
                 glib:type-name="VipsForeignTiffResunit"
                 glib:get-type="vips_foreign_tiff_resunit_get_type"
                 c:type="VipsForeignTiffResunit">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="595">Use inches or centimeters as the resolution unit for a tiff file.</doc>
      <member name="cm"
              value="0"
              c:identifier="VIPS_FOREIGN_TIFF_RESUNIT_CM"
              glib:nick="cm"
              glib:name="VIPS_FOREIGN_TIFF_RESUNIT_CM">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="597">use centimeters</doc>
      </member>
      <member name="inch"
              value="1"
              c:identifier="VIPS_FOREIGN_TIFF_RESUNIT_INCH"
              glib:nick="inch"
              glib:name="VIPS_FOREIGN_TIFF_RESUNIT_INCH">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="598">use inches</doc>
      </member>
      <member name="last"
              value="2"
              c:identifier="VIPS_FOREIGN_TIFF_RESUNIT_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_TIFF_RESUNIT_LAST">
      </member>
    </enumeration>
    <enumeration name="ForeignWebpPreset"
                 glib:type-name="VipsForeignWebpPreset"
                 glib:get-type="vips_foreign_webp_preset_get_type"
                 c:type="VipsForeignWebpPreset">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="500">Tune lossy encoder settings for different image types.</doc>
      <member name="default"
              value="0"
              c:identifier="VIPS_FOREIGN_WEBP_PRESET_DEFAULT"
              glib:nick="default"
              glib:name="VIPS_FOREIGN_WEBP_PRESET_DEFAULT">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="502">default preset</doc>
      </member>
      <member name="picture"
              value="1"
              c:identifier="VIPS_FOREIGN_WEBP_PRESET_PICTURE"
              glib:nick="picture"
              glib:name="VIPS_FOREIGN_WEBP_PRESET_PICTURE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="503">digital picture, like portrait, inner shot</doc>
      </member>
      <member name="photo"
              value="2"
              c:identifier="VIPS_FOREIGN_WEBP_PRESET_PHOTO"
              glib:nick="photo"
              glib:name="VIPS_FOREIGN_WEBP_PRESET_PHOTO">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="504">outdoor photograph, with natural lighting</doc>
      </member>
      <member name="drawing"
              value="3"
              c:identifier="VIPS_FOREIGN_WEBP_PRESET_DRAWING"
              glib:nick="drawing"
              glib:name="VIPS_FOREIGN_WEBP_PRESET_DRAWING">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="505">hand or line drawing, with high-contrast details</doc>
      </member>
      <member name="icon"
              value="4"
              c:identifier="VIPS_FOREIGN_WEBP_PRESET_ICON"
              glib:nick="icon"
              glib:name="VIPS_FOREIGN_WEBP_PRESET_ICON">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="506">small-sized colorful images</doc>
      </member>
      <member name="text"
              value="5"
              c:identifier="VIPS_FOREIGN_WEBP_PRESET_TEXT"
              glib:nick="text"
              glib:name="VIPS_FOREIGN_WEBP_PRESET_TEXT">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="507">text-like</doc>
      </member>
      <member name="last"
              value="6"
              c:identifier="VIPS_FOREIGN_WEBP_PRESET_LAST"
              glib:nick="last"
              glib:name="VIPS_FOREIGN_WEBP_PRESET_LAST">
      </member>
    </enumeration>
    <callback name="GenerateFn" c:type="VipsGenerateFn">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/generate.c"
           line="596">Fill @out-&gt;valid with pixels. @seq contains per-thread state, such as the
input regions. Set @stop to %TRUE to stop processing.

See also: vips_image_generate(), vips_stop_many().</doc>
      <source-position filename="libvips/include/vips/image.h" line="149"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/generate.c"
             line="609">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="598">#VipsRegion to fill</doc>
          <type name="Region" c:type="VipsRegion*"/>
        </parameter>
        <parameter name="seq"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="599">sequence value</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="600">user data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="601">user data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="stop" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="602">set this to stop processing</doc>
          <type name="gboolean" c:type="gboolean*"/>
        </parameter>
      </parameters>
    </callback>
    <function-macro name="IMAGE" c:identifier="VIPS_IMAGE" introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="170"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_ADDR"
                    c:identifier="VIPS_IMAGE_ADDR"
                    introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="331">This macro returns a pointer to a pixel in an image, cast to a #VipsPel *.
It only works for
images which are fully available in memory, so memory buffers and small
mapped images only.

If VIPS_DEBUG is defined, you get a version that checks bounds for you.

See also: vips_image_wio_input(), vips_image_inplace(), VIPS_REGION_ADDR().</doc>
      <source-position filename="libvips/include/vips/image.h" line="397"/>
      <parameters>
        <parameter name="I">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="333">a #VipsImage</doc>
        </parameter>
        <parameter name="X">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="334">x coordinate</doc>
        </parameter>
        <parameter name="Y">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="335">y coordinate</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_CLASS"
                    c:identifier="VIPS_IMAGE_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="173"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_GET_CLASS"
                    c:identifier="VIPS_IMAGE_GET_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="180"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_N_ELEMENTS"
                    c:identifier="VIPS_IMAGE_N_ELEMENTS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="389"/>
      <parameters>
        <parameter name="I">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="319">a #VipsImage</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_N_PELS"
                    c:identifier="VIPS_IMAGE_N_PELS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="391"/>
      <parameters>
        <parameter name="I">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="326">a #VipsImage</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_SIZEOF_ELEMENT"
                    c:identifier="VIPS_IMAGE_SIZEOF_ELEMENT"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="381"/>
      <parameters>
        <parameter name="I">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="298">a #VipsImage</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_SIZEOF_IMAGE"
                    c:identifier="VIPS_IMAGE_SIZEOF_IMAGE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="387"/>
      <parameters>
        <parameter name="I">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_SIZEOF_LINE"
                    c:identifier="VIPS_IMAGE_SIZEOF_LINE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="385"/>
      <parameters>
        <parameter name="I">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="312">a #VipsImage</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IMAGE_SIZEOF_PEL"
                    c:identifier="VIPS_IMAGE_SIZEOF_PEL"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="383"/>
      <parameters>
        <parameter name="I">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="305">a #VipsImage</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="INIT" c:identifier="VIPS_INIT" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="204">VIPS_INIT() starts up the world of VIPS. You should call this on
program startup before using any other VIPS operations. If you do not call
VIPS_INIT(), VIPS will call it for you when you use your first VIPS
operation, but it may not be able to get hold of @ARGV0 and VIPS may
therefore be unable to find its data files. It is much better to call
this macro yourself.

@ARGV0 is used to help discover message catalogues if libvips has been
relocated. If you don't need a relocatable package, you can just pass `""`
and it'll be fine.

Additionally, VIPS_INIT() can be run from any thread, but it must not be
called from more than one thread at the same time. This is much easier to
guarantee if you call it yourself.

VIPS_INIT() is a macro, since it tries to check ABI compatibility
between the caller and the library. You can also call vips_init(), the
non-macro version, if macros are not available to you.

You may call VIPS_INIT() many times and vips_shutdown() many times, but you
must not call VIPS_INIT() after vips_shutdown(). In other words, you cannot
stop and restart vips.

Use the environment variable `VIPS_MIN_STACK_SIZE` to set the minimum stack
size. For example, `2m` for a minimum of two megabytes of stack. This can
be important for systems like musl where the default stack is very small.

VIPS_INIT() does approximately the following:

+ checks that the libvips your program is expecting is
  binary-compatible with the vips library you're running against

+ sets a minimum stack size, see above

+ initialises any libraries that VIPS is using, including GObject
  and the threading system, if necessary

+ guesses where the VIPS data files are and sets up
  internationalisation --- see vips_guess_prefix()

+ creates the main vips types, including #VipsImage and friends

+ loads any plugins from $libdir/vips-x.y/, where x and y are the
  major and minor version numbers for this VIPS.

Example:

|[
int main(int argc, char **argv)
{
    if (VIPS_INIT(argv[0]))
        vips_error_exit("unable to start VIPS");

    vips_shutdown();

    return 0;
}
]|

See also: vips_shutdown(), vips_add_option_entries(), vips_version(),
vips_guess_prefix(), vips_guess_libdir().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="152"/>
      <parameters>
        <parameter name="ARGV0">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="206">name of application</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="INTERPOLATE"
                    c:identifier="VIPS_INTERPOLATE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="46"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="INTERPOLATE_CLASS"
                    c:identifier="VIPS_INTERPOLATE_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="49"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="INTERPOLATE_GET_CLASS"
                    c:identifier="VIPS_INTERPOLATE_GET_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="56"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <constant name="INTERPOLATE_SCALE"
              value="1"
              c:type="VIPS_INTERPOLATE_SCALE">
      <doc xml:space="preserve"
           filename="libvips/resample/interpolate.c"
           line="303">#VIPS_INTERPOLATE_SHIFT as a multiplicative constant.</doc>
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="120"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="INTERPOLATE_SHIFT"
              value="12"
              c:type="VIPS_INTERPOLATE_SHIFT">
      <doc xml:space="preserve"
           filename="libvips/resample/interpolate.c"
           line="296">Many of the vips interpolators use fixed-point arithmetic for value
calculation. This is how many bits of precision they use.</doc>
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="119"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <function-macro name="IS_FOREIGN"
                    c:identifier="VIPS_IS_FOREIGN"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="51"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_FOREIGN_CLASS"
                    c:identifier="VIPS_IS_FOREIGN_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="53"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_FOREIGN_LOAD"
                    c:identifier="VIPS_IS_FOREIGN_LOAD"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="138"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_FOREIGN_LOAD_CLASS"
                    c:identifier="VIPS_IS_FOREIGN_LOAD_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="140"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_FOREIGN_SAVE"
                    c:identifier="VIPS_IS_FOREIGN_SAVE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="304"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_FOREIGN_SAVE_CLASS"
                    c:identifier="VIPS_IS_FOREIGN_SAVE_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/foreign.h" line="306"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_IMAGE"
                    c:identifier="VIPS_IS_IMAGE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="176"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_IMAGE_CLASS"
                    c:identifier="VIPS_IS_IMAGE_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/image.h" line="178"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_INTERPOLATE"
                    c:identifier="VIPS_IS_INTERPOLATE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="52"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_INTERPOLATE_CLASS"
                    c:identifier="VIPS_IS_INTERPOLATE_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="54"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_OPERATION"
                    c:identifier="VIPS_IS_OPERATION"
                    introspectable="0">
      <source-position filename="libvips/include/vips/operation.h" line="62"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_OPERATION_CLASS"
                    c:identifier="VIPS_IS_OPERATION_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/operation.h" line="64"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_REGION"
                    c:identifier="VIPS_IS_REGION"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="57"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="IS_REGION_CLASS"
                    c:identifier="VIPS_IS_REGION_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="59"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <class name="Image"
           c:symbol-prefix="image"
           c:type="VipsImage"
           parent="Object"
           glib:type-name="VipsImage"
           glib:get-type="vips_image_get_type"
           glib:type-struct="ImageClass">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="288">An image. These can represent an image on disc, a memory buffer, an image
in the process of being written to disc or a partially evaluated image
in memory.</doc>
      <source-position filename="libvips/include/vips/image.h" line="368"/>
      <constructor name="memory" c:identifier="vips_image_memory">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1788">A renamed vips_image_new_memory() ... Some gobject binding systems do not
like more than one _new() method.

See also: vips_image_new_memory().</doc>
        <source-position filename="libvips/include/vips/image.h" line="464"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1796">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
      </constructor>
      <constructor name="new" c:identifier="vips_image_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1710">vips_image_new() creates a new, empty #VipsImage.
If you write to one of these images, vips will just attach some callbacks,
no pixels will be generated.

Write pixels to an image with vips_image_generate() or
vips_image_write_line(). Write a whole image to another image with
vips_image_write().</doc>
        <source-position filename="libvips/include/vips/image.h" line="460"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1721">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
      </constructor>
      <constructor name="new_from_buffer"
                   c:identifier="vips_image_new_from_buffer"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2128">Loads an image from the formatted area of memory @buf, @len using the
loader recommended by vips_foreign_find_load_buffer().
To load an unformatted area of memory, use
vips_image_new_from_memory().

VIPS does not take
responsibility for the area of memory, it's up to you to make sure it's
freed when the image is closed. See for example #VipsObject::close.

Load options may be given in @option_string as "[name=value,...]" or given as
a NULL-terminated list of name-value pairs at the end of the arguments.
Options given in the function call override options given in the filename.

See also: vips_image_write_to_buffer().</doc>
        <source-position filename="libvips/include/vips/image.h" line="480"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2150">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2130">image data</doc>
            <array length="1" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2131">length of memory buffer</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
          <parameter name="option_string" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2132">set of extra options as a string</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2133">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_file"
                   c:identifier="vips_image_new_from_file"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1852">Optional arguments:

* @access: hint #VipsAccess mode to loader
* @memory: force load via memory

vips_image_new_from_file() opens @name for reading. It can load files
in many image formats, including VIPS, TIFF, PNG, JPEG, FITS, Matlab,
OpenEXR, CSV, WebP, Radiance, RAW, PPM and others.

Load options may be appended to @filename as "[name=value,...]" or given as
a NULL-terminated list of name-value pairs at the end of the arguments.
Options given in the function call override options given in the filename.
Many loaders add extra options, see vips_jpegload(), for example.

vips_image_new_from_file() always returns immediately with the header
fields filled in. No pixels are actually read until you first access them.

@access lets you set a #VipsAccess hint giving the expected access pattern
for this file.
#VIPS_ACCESS_RANDOM means you can fetch pixels randomly from the image.
This is the default mode. #VIPS_ACCESS_SEQUENTIAL means you will read the
whole image exactly once, top-to-bottom. In this mode, vips can avoid
converting the whole image in one go, for a large memory saving. You are
allowed to make small non-local references, so area operations like
convolution will work.

In #VIPS_ACCESS_RANDOM mode, small images are decompressed to memory and
then processed from there. Large images are decompressed to temporary
random-access files on disc and then processed from there.

Set @memory to %TRUE to force loading via memory. The default is to load
large random access images via temporary disc files. See
vips_image_new_temp_file() for an
explanation of how VIPS selects a location for the temporary file.

The disc threshold can be set with the "--vips-disc-threshold"
command-line argument, or the `VIPS_DISC_THRESHOLD` environment variable.
The value is a simple integer, but can take a unit postfix of "k",
"m" or "g" to indicate kilobytes, megabytes or gigabytes.
The default threshold is 100 MB.

For example:

|[
VipsImage *image = vips_image_new_from_file("fred.tif",
    "page", 12,
    NULL);
]|

Will open "fred.tif", reading page 12.

|[
VipsImage *image = vips_image_new_from_file("fred.jpg[shrink=2]",
    NULL);
]|

Will open "fred.jpg", downsampling by a factor of two.

Use vips_foreign_find_load() or vips_foreign_is_a() to see what format a
file is in and therefore what options are available. If you need more
control over the loading process, you can call loaders directly, see
vips_jpegload(), for example.

See also: vips_foreign_find_load(), vips_foreign_is_a(),
vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/image.h" line="466"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1923">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1854">file to open</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1855">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_file_RW"
                   c:identifier="vips_image_new_from_file_RW">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1953">Opens the named file for simultaneous reading and writing. This will only
work for VIPS files in a format native to your machine. It is only for
paintbox-type applications.

See also: vips_draw_circle().</doc>
        <source-position filename="libvips/include/vips/image.h" line="469"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1963">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1955">filename to open</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_file_raw"
                   c:identifier="vips_image_new_from_file_raw">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1971">This function maps the named file and returns a #VipsImage you can use to
read it.

It returns an 8-bit image with @bands bands. If the image is not 8-bit, use
vips_copy() to transform the descriptor after loading it.

See also: vips_copy(), vips_rawload(), vips_image_new_from_file().</doc>
        <source-position filename="libvips/include/vips/image.h" line="471"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1987">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1973">filename to open</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="xsize" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1974">image width</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="ysize" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1975">image height</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="bands" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1976">image bands (or bytes per pixel)</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="offset" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1977">bytes to skip at start of file</doc>
            <type name="guint64" c:type="guint64"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_image"
                   c:identifier="vips_image_new_from_image">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2408">Creates a new image with width, height, format, interpretation, resolution
and offset taken from @image, but with number of bands taken from @n and the
value of each band element set from @c.

See also: vips_image_new_from_image1()</doc>
        <source-position filename="libvips/include/vips/image.h" line="497"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2420">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2410">image to copy</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2411">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2412">number of constants</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_image1"
                   c:identifier="vips_image_new_from_image1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2463">Creates a new image with width, height, format, interpretation, resolution
and offset taken from @image, but with one band and each pixel having the
value @c.

See also: vips_image_new_from_image()</doc>
        <source-position filename="libvips/include/vips/image.h" line="500"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2474">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2465">image to copy</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2466">constants</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_memory"
                   c:identifier="vips_image_new_from_memory">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2014">This function wraps a #VipsImage around a memory area. The memory area
must be a simple array, for example RGBRGBRGB, left-to-right,
top-to-bottom. Use vips_image_new_from_buffer() to load an area of memory
containing an image in a format.

VIPS does not take
responsibility for the area of memory, it's up to you to make sure it's
freed when the image is closed. See for example #VipsObject::close.

Because VIPS is "borrowing" @data from the caller, this function is
extremely dangerous. Unless you are very careful, you will get crashes or
memory corruption. Use vips_image_new_from_memory_copy() instead if you are
at all unsure.

Use vips_copy() to set other image properties.

See also: vips_image_new(), vips_image_write_to_memory(),
vips_image_new_from_memory_copy().</doc>
        <source-position filename="libvips/include/vips/image.h" line="474"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2042">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2016">start of memory area</doc>
            <array length="1" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2017">length of memory area</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2018">image width</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2019">image height</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="bands" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2020">image bands (or bytes per pixel)</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2021">image format</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_memory_copy"
                   c:identifier="vips_image_new_from_memory_copy">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2087">Like vips_image_new_from_memory(), but VIPS will make a copy of the memory
area. This means more memory use and an extra copy operation, but is much
simpler and safer.

See also: vips_image_new_from_memory().</doc>
        <source-position filename="libvips/include/vips/image.h" line="477"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2102">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2089">start of memory area</doc>
            <array length="1" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2090">length of memory area</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2091">image width</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2092">image height</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="bands" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2093">image bands (or bytes per pixel)</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2094">image format</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_source"
                   c:identifier="vips_image_new_from_source"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2184">Loads an image from the formatted source @input,
loader recommended by vips_foreign_find_load_source().

Load options may be given in @option_string as "[name=value,...]" or given as
a NULL-terminated list of name-value pairs at the end of the arguments.
Options given in the function call override options given in the string.

See also: vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/image.h" line="484"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2199">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2186">source to fetch image from</doc>
            <type name="Source" c:type="VipsSource*"/>
          </parameter>
          <parameter name="option_string" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2187">set of extra options as a string</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2188">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_matrix" c:identifier="vips_image_new_matrix">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2270">This convenience function makes an image which is a matrix: a one-band
#VIPS_FORMAT_DOUBLE image held in memory.

Use VIPS_IMAGE_ADDR(), or VIPS_MATRIX() to address pixels in the image.

Use vips_image_set_double() to set "scale" and "offset", if required.

See also: vips_image_new_matrixv()</doc>
        <source-position filename="libvips/include/vips/image.h" line="487"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2284">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2272">image width</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2273">image height</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_matrix_from_array"
                   c:identifier="vips_image_new_matrix_from_array">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2350">A binding-friendly version of vips_image_new_matrixv().</doc>
        <source-position filename="libvips/include/vips/image.h" line="491"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2359">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2352">image width</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2353">image height</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2354">array of elements</doc>
            <array length="3" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2355">number of elements</doc>
            <type name="gsize" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_matrixv"
                   c:identifier="vips_image_new_matrixv"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2316">As vips_image_new_matrix(), but initialise the matrix from the argument
list. After @height should be @width * @height double constants which are
used to set the matrix elements.

See also: vips_image_new_matrix()</doc>
        <source-position filename="libvips/include/vips/image.h" line="489"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2328">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2318">image width</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2319">image height</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2320">matrix coefficients</doc>
            <varargs/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_memory"
                   c:identifier="vips_image_new_memory"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1769">vips_image_new_memory() creates a new #VipsImage which, when written to, will
create a memory image.

See also: vips_image_new().</doc>
        <source-position filename="libvips/include/vips/image.h" line="462"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1777">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
      </constructor>
      <constructor name="new_temp_file"
                   c:identifier="vips_image_new_temp_file">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2550">Make a #VipsImage which, when written to, will create a temporary file on
disc. The file will be automatically deleted when the image is destroyed.
@format is something like "&amp;percnt;s.v" for a vips file.

The file is created in the temporary directory. This is set with the
environment variable TMPDIR. If this is not set, then on Unix systems, vips
will default to /tmp. On Windows, vips uses GetTempPath() to find the
temporary directory.

See also: vips_image_new().</doc>
        <source-position filename="libvips/include/vips/image.h" line="508"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2565">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2552">format of file</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="get_format_max" c:identifier="vips_image_get_format_max">
        <source-position filename="libvips/include/vips/header.h" line="198"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="442">the maximum numeric value possible for this format.</doc>
          <type name="gdouble" c:type="double"/>
        </return-value>
        <parameters>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="440">the format</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
        </parameters>
      </function>
      <function name="matrix_from_array"
                c:identifier="vips_image_matrix_from_array"
                introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2388">A renamed vips_image_new_matrix_from_array(). Some gobject bindings do not
like more than one _new method.</doc>
        <source-position filename="libvips/include/vips/image.h" line="494"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2398">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2390">image width</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2391">image height</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="array" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2392">array of elements</doc>
            <array length="3" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2393">number of elements</doc>
            <type name="gsize" c:type="int"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="eval">
        <source-position filename="libvips/include/vips/image.h" line="340"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="progress" transfer-ownership="none">
            <type name="Progress" c:type="VipsProgress*"/>
          </parameter>
          <parameter name="data"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="invalidate">
        <source-position filename="libvips/include/vips/image.h" line="356"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="data"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="minimise">
        <source-position filename="libvips/include/vips/image.h" line="366"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="data"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="posteval">
        <source-position filename="libvips/include/vips/image.h" line="344"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="progress" transfer-ownership="none">
            <type name="Progress" c:type="VipsProgress*"/>
          </parameter>
          <parameter name="data"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="preeval">
        <source-position filename="libvips/include/vips/image.h" line="336"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="progress" transfer-ownership="none">
            <type name="Progress" c:type="VipsProgress*"/>
          </parameter>
          <parameter name="data"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="written">
        <source-position filename="libvips/include/vips/image.h" line="351"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="result" transfer-ownership="none">
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="data"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="CMC2LCh" c:identifier="vips_CMC2LCh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/UCS2LCh.c"
             line="287">Turn LCh to CMC.

See also: vips_LCh2CMC().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="185"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/UCS2LCh.c"
               line="297">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/UCS2LCh.c"
                 line="289">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/UCS2LCh.c"
                 line="290">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/UCS2LCh.c"
                 line="291">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="CMYK2XYZ" c:identifier="vips_CMYK2XYZ" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/CMYK2XYZ.c"
             line="205">Turn CMYK to XYZ. If the image has an embedded ICC profile this will be
used for the conversion. If there is no embedded profile, a generic
fallback profile will be used.

Conversion is to D65 XYZ with relative intent. If you need more control
over the process, use vips_icc_import() instead.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="201"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/CMYK2XYZ.c"
               line="218">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/CMYK2XYZ.c"
                 line="207">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/CMYK2XYZ.c"
                 line="208">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/CMYK2XYZ.c"
                 line="209">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="HSV2sRGB" c:identifier="vips_HSV2sRGB" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/HSV2sRGB.c"
             line="133">Convert HSV to sRGB.

HSV is a crude polar coordinate system for RGB images. It is provided for
compatibility with other image processing systems. See vips_Lab2LCh() for a
much better colour space.

See also: vips_sRGB2HSV().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="175"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/HSV2sRGB.c"
               line="147">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/HSV2sRGB.c"
                 line="135">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/HSV2sRGB.c"
                 line="136">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/HSV2sRGB.c"
                 line="137">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="LCh2CMC" c:identifier="vips_LCh2CMC" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/LCh2UCS.c"
             line="219">Turn LCh to CMC.

The CMC colourspace is described in "Uniform Colour Space Based on the
CMC(l:c) Colour-difference Formula", M R Luo and B Rigg, Journal of the
Society of Dyers and Colourists, vol 102, 1986. Distances in this
colourspace approximate, within 10% or so, differences in the CMC(l:c)
colour difference formula.

This operation generates CMC(1:1). For CMC(2:1), halve Lucs and double
Cucs.

See also: vips_CMC2LCh().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="182"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2UCS.c"
               line="238">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LCh2UCS.c"
                 line="221">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/LCh2UCS.c"
                 line="222">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LCh2UCS.c"
                 line="223">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="LCh2Lab" c:identifier="vips_LCh2Lab" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/LCh2Lab.c"
             line="124">Turn LCh to Lab.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="141"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2Lab.c"
               line="132">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LCh2Lab.c"
                 line="126">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/LCh2Lab.c"
                 line="127">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LCh2Lab.c"
                 line="128">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="Lab2LCh" c:identifier="vips_Lab2LCh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/Lab2LCh.c"
             line="145">Turn Lab to LCh.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="144"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2LCh.c"
               line="153">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LCh.c"
                 line="147">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LCh.c"
                 line="148">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LCh.c"
                 line="149">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="Lab2LabQ" c:identifier="vips_Lab2LabQ" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/Lab2LabQ.c"
             line="158">Convert a Lab three-band float image to LabQ (#VIPS_CODING_LABQ).

See also: vips_LabQ2Lab().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="138"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2LabQ.c"
               line="168">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LabQ.c"
                 line="160">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LabQ.c"
                 line="161">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LabQ.c"
                 line="162">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="Lab2LabS" c:identifier="vips_Lab2LabS" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/Lab2LabS.c"
             line="102">Turn Lab to LabS, signed 16-bit int fixed point.

See also: vips_LabQ2Lab().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="197"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2LabS.c"
               line="112">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LabS.c"
                 line="104">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LabS.c"
                 line="105">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2LabS.c"
                 line="106">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="Lab2XYZ" c:identifier="vips_Lab2XYZ" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/Lab2XYZ.c"
             line="202">Optional arguments:

* @temp: #VipsArrayDouble, colour temperature

Turn Lab to XYZ. The colour temperature defaults to D65, but can be
specified with @temp.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="153"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2XYZ.c"
               line="215">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2XYZ.c"
                 line="204">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2XYZ.c"
                 line="205">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Lab2XYZ.c"
                 line="206">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="LabQ2Lab" c:identifier="vips_LabQ2Lab" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/LabQ2Lab.c"
             line="144">Unpack a LabQ (#VIPS_CODING_LABQ) image to a three-band float image.

See also: vips_LabQ2Lab(), vips_LabQ2LabS(), vips_rad2float().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="135"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2Lab.c"
               line="154">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2Lab.c"
                 line="146">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2Lab.c"
                 line="147">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2Lab.c"
                 line="148">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="LabQ2LabS"
              c:identifier="vips_LabQ2LabS"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/LabQ2LabS.c"
             line="123">Unpack a LabQ (#VIPS_CODING_LABQ) image to a three-band short image.

See also: vips_LabS2LabQ(), vips_LabQ2LabS(), vips_rad2float().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="132"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2LabS.c"
               line="133">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2LabS.c"
                 line="125">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2LabS.c"
                 line="126">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2LabS.c"
                 line="127">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="LabQ2sRGB"
              c:identifier="vips_LabQ2sRGB"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/LabQ2sRGB.c"
             line="568">Unpack a LabQ (#VIPS_CODING_LABQ) image to a three-band short image.

See also: vips_LabS2LabQ(), vips_LabQ2sRGB(), vips_rad2float().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="120"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="578">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2sRGB.c"
                 line="570">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2sRGB.c"
                 line="571">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabQ2sRGB.c"
                 line="572">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="LabS2Lab" c:identifier="vips_LabS2Lab" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/LabS2Lab.c"
             line="98">Convert a LabS three-band signed short image to a three-band float image.

See also: vips_LabS2Lab().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="194"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabS2Lab.c"
               line="108">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabS2Lab.c"
                 line="100">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabS2Lab.c"
                 line="101">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabS2Lab.c"
                 line="102">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="LabS2LabQ"
              c:identifier="vips_LabS2LabQ"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/LabS2LabQ.c"
             line="148">Convert a LabS three-band signed short image to LabQ

See also: vips_LabQ2LabS().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="129"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabS2LabQ.c"
               line="158">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabS2LabQ.c"
                 line="150">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabS2LabQ.c"
                 line="151">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/LabS2LabQ.c"
                 line="152">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="XYZ2CMYK" c:identifier="vips_XYZ2CMYK" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/XYZ2CMYK.c"
             line="216">Turn XYZ to CMYK.

Conversion is from D65 XYZ with relative intent. If you need more control
over the process, use vips_icc_export() instead.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="204"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2CMYK.c"
               line="227">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2CMYK.c"
                 line="218">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2CMYK.c"
                 line="219">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2CMYK.c"
                 line="220">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="XYZ2Lab" c:identifier="vips_XYZ2Lab" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/XYZ2Lab.c"
             line="255">Optional arguments:

* @temp: #VipsArrayDouble, colour temperature

Turn XYZ to Lab, optionally specifying the colour temperature. @temp
defaults to D65.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="156"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2Lab.c"
               line="268">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2Lab.c"
                 line="257">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2Lab.c"
                 line="258">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2Lab.c"
                 line="259">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="XYZ2Yxy" c:identifier="vips_XYZ2Yxy" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/XYZ2Yxy.c"
             line="111">Turn XYZ to Yxy.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="188"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2Yxy.c"
               line="119">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2Yxy.c"
                 line="113">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2Yxy.c"
                 line="114">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2Yxy.c"
                 line="115">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="XYZ2scRGB"
              c:identifier="vips_XYZ2scRGB"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/XYZ2scRGB.c"
             line="217">Turn XYZ to scRGB.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="160"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2scRGB.c"
               line="225">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2scRGB.c"
                 line="219">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2scRGB.c"
                 line="220">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/XYZ2scRGB.c"
                 line="221">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="Yxy2XYZ" c:identifier="vips_Yxy2XYZ" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/Yxy2XYZ.c"
             line="116">Turn XYZ to Yxy.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="191"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Yxy2XYZ.c"
               line="124">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Yxy2XYZ.c"
                 line="118">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/Yxy2XYZ.c"
                 line="119">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/Yxy2XYZ.c"
                 line="120">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="abs" c:identifier="vips_abs" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/abs.c"
             line="213">This operation finds the absolute value of an image. It does a copy for
unsigned integer types, negate for negative values in
signed integer types, &lt;function&gt;fabs(3)&lt;/function&gt; for
float types, and calculates modulus for complex
types.

See also: vips_sign().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="231"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/abs.c"
               line="227">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/abs.c"
                 line="215">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/abs.c"
                 line="216">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/abs.c"
                 line="217">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="acos" c:identifier="vips_acos" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="402">Perform #VIPS_OPERATION_MATH_ACOS on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="275"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="410">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="404">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="405">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="406">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="acosh" c:identifier="vips_acosh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="540">Perform #VIPS_OPERATION_MATH_ACOSH on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="305"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="548">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="542">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="543">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="544">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="addalpha" c:identifier="vips_addalpha" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/addalpha.c"
             line="101">Append an alpha channel.

See also: vips_image_hasalpha().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="327"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/addalpha.c"
               line="111">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/addalpha.c"
                 line="103">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/addalpha.c"
                 line="104">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/addalpha.c"
                 line="105">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="affine" c:identifier="vips_affine" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/affine.c"
             line="705">Optional arguments:

* @interpolate: #VipsInterpolate, interpolate pixels with this
* @oarea: #VipsArrayInt, output rectangle
* @idx: %gdouble, input horizontal offset
* @idy: %gdouble, input vertical offset
* @odx: %gdouble, output horizontal offset
* @ody: %gdouble, output vertical offset
* @extend: #VipsExtend how to generate new pixels
* @background: #VipsArrayDouble colour for new pixels
* @premultiplied: %gboolean, images are already premultiplied

This operator performs an affine transform on an image using @interpolate.

The transform is:

|[
  X = @a * (x + @idx) + @b * (y + @idy) + @odx
  Y = @c * (x + @idx) + @d * (y + @idy) + @doy

  where:
    x and y are the coordinates in input image.
    X and Y are the coordinates in output image.
    (0,0) is the upper left corner.
]|

The section of the output space defined by @oarea is written to
@out. @oarea is a four-element int array of left, top, width, height.
By default @oarea is just large enough to cover the whole of the
transformed input image.

By default, new pixels are filled with @background. This defaults to
zero (black). You can set other extend types with @extend. #VIPS_EXTEND_COPY
is better for image upsizing.

@interpolate defaults to bilinear.

@idx, @idy, @odx, @ody default to zero.

Image are normally treated as unpremultiplied, so this operation can be used
directly on PNG images. If your images have been through vips_premultiply(),
set @premultiplied.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

See also: vips_shrink(), vips_resize(), #VipsInterpolate.</doc>
        <source-position filename="libvips/include/vips/resample.h"
                         line="103"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/affine.c"
               line="763">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/affine.c"
                 line="707">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/affine.c"
                 line="708">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="a" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/affine.c"
                 line="709">transformation matrix coefficient</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/affine.c"
                 line="710">transformation matrix coefficient</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/affine.c"
                 line="711">transformation matrix coefficient</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="d" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/affine.c"
                 line="712">transformation matrix coefficient</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/affine.c"
                 line="713">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="andimage_const"
              c:identifier="vips_andimage_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="651">Perform #VIPS_OPERATION_BOOLEAN_AND on an image and an array of constants.
See vips_boolean_const().

See also: vips_boolean(), vips_boolean_const1().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="446"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="664">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="653">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="654">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="655">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="656">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="657">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="andimage_const1"
              c:identifier="vips_andimage_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="828">Perform #VIPS_OPERATION_BOOLEAN_AND on an image and a constant.
See vips_boolean_const1().

See also: vips_boolean(), vips_boolean_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="470"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="840">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="830">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="831">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="832">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="833">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="asin" c:identifier="vips_asin" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="379">Perform #VIPS_OPERATION_MATH_ASIN on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="272"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="387">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="381">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="382">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="383">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="asinh" c:identifier="vips_asinh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="517">Perform #VIPS_OPERATION_MATH_ASINH on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="302"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="525">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="519">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="520">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="521">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="atan" c:identifier="vips_atan" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="425">Perform #VIPS_OPERATION_MATH_ATAN on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="278"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="433">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="427">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="428">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="429">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="atan2_const"
              c:identifier="vips_atan2_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="601">Perform #VIPS_OPERATION_MATH2_ATAN2 on an image and a constant. See
vips_math2_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="511"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="612">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="603">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="604">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="605">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="606">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="607">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="atan2_const1"
              c:identifier="vips_atan2_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="707">Perform #VIPS_OPERATION_MATH2_ATAN2 on an image and a constant. See
vips_math2_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="525"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="717">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="709">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="710">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="711">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="712">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="atanh" c:identifier="vips_atanh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="563">Perform #VIPS_OPERATION_MATH_ATANH on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="308"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="571">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="565">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="566">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="567">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="autorot" c:identifier="vips_autorot" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/autorot.c"
             line="234">Optional arguments:

* @angle: output #VipsAngle the image was rotated by
* @flip: output %gboolean whether the image was flipped

Look at the image metadata and rotate and flip the image to make it
upright. The #VIPS_META_ORIENTATION tag is removed from @out to prevent
accidental double rotation.

Read @angle to find the amount the image was rotated by. Read @flip to
see if the image was also flipped.</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="220"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/autorot.c"
               line="252">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/autorot.c"
                 line="236">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/autorot.c"
                 line="237">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/autorot.c"
                 line="238">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="autorot_remove_angle"
              c:identifier="vips_autorot_remove_angle">
        <doc xml:space="preserve"
             filename="libvips/conversion/autorot.c"
             line="88">Remove the orientation tag on @image. Also remove any exif orientation tags.
You must vips_copy() the image before calling this function since it
modifies metadata.</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="218"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/autorot.c"
                 line="90">image to remove orientation from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="avg" c:identifier="vips_avg" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/avg.c"
             line="247">This operation finds the average value in an image. It operates on all
bands of the input image: use vips_stats() if you need to calculate an
average for each band. For complex images, return the average modulus.

See also: vips_stats(), vips_bandmean(), vips_deviate(), vips_rank()</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="529"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/avg.c"
               line="259">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/avg.c"
                 line="249">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/avg.c"
                 line="250">output pixel average</doc>
            <type name="gdouble" c:type="double*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/avg.c"
                 line="251">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandand" c:identifier="vips_bandand" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandbool.c"
             line="299">Perform #VIPS_OPERATION_BOOLEAN_AND on an image. See
vips_bandbool().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="299"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandbool.c"
               line="308">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="301">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="302">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="303">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandbool" c:identifier="vips_bandbool" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandbool.c"
             line="259">Perform various boolean operations across the bands of an image. For
example, a three-band uchar image operated on with
#VIPS_OPERATION_BOOLEAN_AND will produce a one-band uchar image where each
pixel is the bitwise and of the band elements of the corresponding pixel in
the input image.

The output image is the same format as the input image for integer
types. Float types are cast to int before processing. Complex types are not
supported.

The output image always has one band.

This operation is useful in conjunction with vips_relational(). You can use
it to see if all image bands match exactly.

See also: vips_boolean_const().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="295"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandbool.c"
               line="283">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="261">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="262">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="boolean" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="263">boolean operation to perform</doc>
            <type name="OperationBoolean" c:type="VipsOperationBoolean"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="264">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandeor" c:identifier="vips_bandeor" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandbool.c"
             line="347">Perform #VIPS_OPERATION_BOOLEAN_EOR on an image. See
vips_bandbool().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="305"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandbool.c"
               line="356">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="349">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="350">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="351">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandfold" c:identifier="vips_bandfold" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandfold.c"
             line="181">Optional arguments:

* @factor: fold by this factor

Fold up an image horizontally: width is collapsed into bands.
Use @factor to set how much to fold by: @factor 3, for example, will make
the output image three times narrower than the input, and with three times
as many bands. By default the whole of the input width is folded up.

See also: vips_csvload(), vips_bandunfold().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="288"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandfold.c"
               line="198">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandfold.c"
                 line="183">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandfold.c"
                 line="184">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandfold.c"
                 line="185">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandjoin_const"
              c:identifier="vips_bandjoin_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandjoin.c"
             line="470">Append a set of constant bands to an image.

See also: vips_bandjoin().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="279"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="482">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="472">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="473">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="474">array of constants to append</doc>
            <array length="2" zero-terminated="0" c:type="double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="475">number of constants</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="476">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandjoin_const1"
              c:identifier="vips_bandjoin_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandjoin.c"
             line="497">Append a single constant band to an image.</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="282"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="506">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="499">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="500">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="501">constant to append</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandjoin.c"
                 line="502">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandmean" c:identifier="vips_bandmean" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandmean.c"
             line="223">This operation writes a one-band image where each pixel is the average of
the bands for that pixel in the input image. The output band format is
the same as the input band format. Integer types use round-to-nearest
averaging.

See also: vips_add(), vips_avg(), vips_recomb()</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="308"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandmean.c"
               line="236">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandmean.c"
                 line="225">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandmean.c"
                 line="226">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandmean.c"
                 line="227">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandor" c:identifier="vips_bandor" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandbool.c"
             line="323">Perform #VIPS_OPERATION_BOOLEAN_OR on an image. See
vips_bandbool().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="302"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandbool.c"
               line="332">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="325">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="326">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandbool.c"
                 line="327">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="bandunfold"
              c:identifier="vips_bandunfold"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandunfold.c"
             line="184">Optional arguments:

* @factor: unfold by this factor

Unfold image bands into x axis.
Use @factor to set how much to unfold by: @factor 3, for example, will make
the output image three times wider than the input, and with one third
as many bands. By default, all bands are unfolded.

See also: vips_csvload(), vips_bandfold().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="291"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandunfold.c"
               line="201">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandunfold.c"
                 line="186">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandunfold.c"
                 line="187">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/bandunfold.c"
                 line="188">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="boolean_const"
              c:identifier="vips_boolean_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="612">Perform various boolean operations on an image against an array of
constants.

The output type is always uchar, with 0 for FALSE and 255 for TRUE.

If the array of constants has just one element, that constant is used for
all image bands. If the array has more than one element and they have
the same number of elements as there are bands in the image, then
one array element is used for each band. If the arrays have more than one
element and the image only has a single band, the result is a many-band
image where each band corresponds to one array element.

See also: vips_boolean(), vips_boolean_const1().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="442"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="635">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="614">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="615">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="boolean" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="616">boolean operation to perform</doc>
            <type name="OperationBoolean" c:type="VipsOperationBoolean"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="617">array of constants</doc>
            <array length="3" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="618">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="619">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="boolean_const1"
              c:identifier="vips_boolean_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="799">Perform various boolean operations on an image with a single constant. See
vips_boolean_const().

See also: vips_boolean(), vips_boolean_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="466"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="812">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="801">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="802">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="boolean" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="803">boolean operation to perform</doc>
            <type name="OperationBoolean" c:type="VipsOperationBoolean"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="804">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="805">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="buildlut" c:identifier="vips_buildlut" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/create/buildlut.c"
             line="274">This operation builds a lookup table from a set of points. Intermediate
values are generated by piecewise linear interpolation. The lookup table is
always of type #VIPS_FORMAT_DOUBLE, use vips_cast() to change it to the
type you need.

For example, consider this 2 x 2 matrix of (x, y) coordinates:

  &lt;tgroup cols='2' align='left' colsep='1' rowsep='1'&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;0&lt;/entry&gt;
        &lt;entry&gt;0&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;255&lt;/entry&gt;
        &lt;entry&gt;100&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;

We then generate a 1 x 256 element LUT like this:

  &lt;tgroup cols='2' align='left' colsep='1' rowsep='1'&gt;
    &lt;thead&gt;
      &lt;row&gt;
        &lt;entry&gt;Index&lt;/entry&gt;
        &lt;entry&gt;Value&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;0&lt;/entry&gt;
        &lt;entry&gt;0&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;1&lt;/entry&gt;
        &lt;entry&gt;0.4&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;etc.&lt;/entry&gt;
        &lt;entry&gt;0.4&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;255&lt;/entry&gt;
        &lt;entry&gt;100&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;

This is then written as the output image, with the left column giving the
index in the image to place the value.

The (x, y) points don't need to be sorted: we do that. You can have
several Ys, each becomes a band in the output LUT. You don't need to
start at zero, any integer will do, including negatives.

See also: vips_identity(), vips_invertlut(), vips_cast(), vips_maplut().</doc>
        <source-position filename="libvips/include/vips/create.h" line="98"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/buildlut.c"
               line="338">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/create/buildlut.c"
                 line="276">input matrix</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/create/buildlut.c"
                 line="277">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/create/buildlut.c"
                 line="278">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="byteswap" c:identifier="vips_byteswap" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/byteswap.c"
             line="249">Swap the byte order in an image.

See also: vips_rawload().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="269"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/byteswap.c"
               line="259">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/byteswap.c"
                 line="251">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/byteswap.c"
                 line="252">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/byteswap.c"
                 line="253">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="canny" c:identifier="vips_canny" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/canny.c"
             line="475">Optional arguments:

* @sigma: %gdouble, sigma for gaussian blur
* @precision: #VipsPrecision, calculation accuracy

Find edges by Canny's method: The maximum of the derivative of the gradient
in the direction of the gradient. Output is float, except for uchar input,
where output is uchar, and double input, where output is double. Non-complex
images only.

Use @sigma to control the scale over which gradient is measured. 1.4 is
usually a good value.

Use @precision to set the precision of edge detection. For uchar images,
setting this to #VIPS_PRECISION_INTEGER will make edge detection much
faster, but sacrifice some sensitivity.

You will probably need to process the output further to eliminate weak
edges.

See also: vips_sobel().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="94"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/canny.c"
               line="503">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/canny.c"
                 line="477">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/canny.c"
                 line="478">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/canny.c"
                 line="479">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="case" c:identifier="vips_case" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/case.c"
             line="277">Use values in @index to select pixels from @cases.

@index must have one band. @cases can have up to 256 elements. Values in
@index greater than or equal to @n use the final image in @cases. The
images in @cases must have either one band or the same number of bands.
The output image is the same size as @index. Images in @cases are
expanded to the smallest common format and number of bands.

Combine this with vips_switch() to make something like a case statement or
a multi-way vips_ifthenelse().

See also: vips_maplut(), vips_switch(), vips_ifthenelse().</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="77"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/case.c"
               line="298">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="index" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/case.c"
                 line="279">index image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="cases" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/case.c"
                 line="280">array of case images</doc>
            <array length="2" zero-terminated="0" c:type="VipsImage**">
              <type name="Image" c:type="VipsImage*"/>
            </array>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/case.c"
                 line="281">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/case.c"
                 line="282">number of case images</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/case.c"
                 line="283">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast" c:identifier="vips_cast" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="561">Optional arguments:

* @shift: %gboolean, integer values are shifted

Convert @in to @format. You can convert between any pair of formats.
Floats are truncated (not rounded). Out of range values are clipped.

Casting from complex to real returns the real part.

If @shift is %TRUE, integer values are shifted up and down. For example,
casting from unsigned 8 bit to unsigned 16 bit would
shift every value left by 8 bits. The bottom bit is copied into the new
bits, so 255 would become 65535.

See also: vips_scale(), vips_complexform(), vips_real(), vips_imag(),
vips_cast_uchar(), vips_msb().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="230"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="585">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="563">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="564">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="565">format to convert to</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="566">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_char"
              c:identifier="vips_cast_char"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="623">Convert @in to #VIPS_FORMAT_CHAR. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="236"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="631">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="625">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="626">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="627">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_complex"
              c:identifier="vips_cast_complex"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="784">Convert @in to #VIPS_FORMAT_COMPLEX. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="257"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="792">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="786">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="787">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="788">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_double"
              c:identifier="vips_cast_double"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="761">Convert @in to #VIPS_FORMAT_DOUBLE. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="254"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="769">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="763">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="764">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="765">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_dpcomplex"
              c:identifier="vips_cast_dpcomplex"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="807">Convert @in to #VIPS_FORMAT_DPCOMPLEX. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="260"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="815">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="809">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="810">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="811">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_float"
              c:identifier="vips_cast_float"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="738">Convert @in to #VIPS_FORMAT_FLOAT. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="251"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="746">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="740">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="741">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="742">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_int" c:identifier="vips_cast_int" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="715">Convert @in to #VIPS_FORMAT_INT. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="248"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="723">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="717">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="718">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="719">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_short"
              c:identifier="vips_cast_short"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="669">Convert @in to #VIPS_FORMAT_SHORT. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="242"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="677">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="671">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="672">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="673">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_uchar"
              c:identifier="vips_cast_uchar"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="600">Convert @in to #VIPS_FORMAT_UCHAR. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="233"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="608">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="602">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="603">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="604">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_uint"
              c:identifier="vips_cast_uint"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="692">Convert @in to #VIPS_FORMAT_UINT. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="245"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="700">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="694">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="695">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="696">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cast_ushort"
              c:identifier="vips_cast_ushort"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/cast.c"
             line="646">Convert @in to #VIPS_FORMAT_USHORT. See vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="239"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/cast.c"
               line="654">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="648">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="649">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/cast.c"
                 line="650">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="ceil" c:identifier="vips_ceil" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/round.c"
             line="256">Round to an integral value with #VIPS_OPERATION_ROUND_CEIL. See
vips_round().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="252"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/round.c"
               line="265">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="258">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="259">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="260">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="clamp" c:identifier="vips_clamp" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/clamp.c"
             line="183">Optional arguments:

* @min: %gdouble, minimum value
* @max: %gdouble, maximum value

This operation clamps pixel values to a range, by default 0 - 1.

Use @min and @max to change the range.

See also: vips_sign(), vips_abs(), vips_sdf().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="237"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/clamp.c"
               line="200">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/clamp.c"
                 line="185">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/clamp.c"
                 line="186">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/clamp.c"
                 line="187">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="colourspace"
              c:identifier="vips_colourspace"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/colourspace.c"
             line="589">Optional arguments:

* @source_space: input colour space

This operation looks at the interpretation field of @in (or uses
@source_space, if set) and runs
a set of colourspace conversion functions to move it to @space.

For example, given an image tagged as #VIPS_INTERPRETATION_YXY, running
vips_colourspace() with @space set to #VIPS_INTERPRETATION_LAB will
convert with vips_Yxy2XYZ() and vips_XYZ2Lab().

See also: vips_colourspace_issupported(),
vips_image_guess_interpretation().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="115"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/colourspace.c"
               line="611">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/colourspace.c"
                 line="591">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/colourspace.c"
                 line="592">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="space" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/colourspace.c"
                 line="593">convert to this colour space</doc>
            <type name="Interpretation" c:type="VipsInterpretation"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/colourspace.c"
                 line="594">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="colourspace_issupported"
              c:identifier="vips_colourspace_issupported">
        <doc xml:space="preserve"
             filename="libvips/colour/colourspace.c"
             line="423">Test if @image is in a colourspace that vips_colourspace() can process.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="113"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/colourspace.c"
               line="429">%TRUE if @image is in a supported colourspace.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/colourspace.c"
                 line="425">input image</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="compass" c:identifier="vips_compass" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/compass.c"
             line="216">Optional arguments:

* @times: %gint, how many times to rotate and convolve
* @angle: #VipsAngle45, rotate mask by this much between colvolutions
* @combine: #VipsCombine, combine results like this
* @precision: #VipsPrecision, precision for blur, default float
* @layers: %gint, number of layers for approximation
* @cluster: %gint, cluster lines closer than this distance

This convolves @in with @mask @times times, rotating @mask by @angle
each time. By default, it comvolves twice, rotating by 90 degrees, taking
the maximum result.

See also: vips_conv().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="68"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/compass.c"
               line="238">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/compass.c"
                 line="218">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/compass.c"
                 line="219">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/compass.c"
                 line="220">convolve with this mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/compass.c"
                 line="221">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="complex" c:identifier="vips_complex" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="277">Perform various operations on complex images.

Angles are expressed in degrees. The output type is complex unless the
input is double or dpcomplex, in which case the output is dpcomplex.</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="312"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="289">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="279">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="280">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="cmplx" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="281">complex operation to perform</doc>
            <type name="OperationComplex" c:type="VipsOperationComplex"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="282">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="complexget"
              c:identifier="vips_complexget"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="791">Get components of complex images.

The output type is the same as the input type, except #VIPS_FORMAT_COMPLEX
becomes #VIPS_FORMAT_FLOAT and #VIPS_FORMAT_DPCOMPLEX becomes
#VIPS_FORMAT_DOUBLE.</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="334"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="804">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="793">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="794">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="get" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="795">complex operation to perform</doc>
            <type name="OperationComplexget" c:type="VipsOperationComplexget"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="796">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="composite2"
              c:identifier="vips_composite2"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="124">Optional arguments:

* @compositing_space: #VipsInterpretation to composite in
* @premultiplied: %gboolean, images are already premultiplied
* @x: %gint, position of overlay
* @y: %gint, position of overlay

Composite @overlay on top of @base with @mode. See vips_composite().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="339"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/conversion.c"
               line="141">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="base" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/conversion.c"
                 line="126">first input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="overlay" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/conversion.c"
                 line="127">second input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/conversion.c"
                 line="128">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mode" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/conversion.c"
                 line="129">composite with this blend mode</doc>
            <type name="BlendMode" c:type="VipsBlendMode"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/conversion.c"
                 line="130">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="conj" c:identifier="vips_conj" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="350">Perform #VIPS_OPERATION_COMPLEX_CONJ on an image. See vips_complex().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="322"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="358">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="352">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="353">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="354">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="conv" c:identifier="vips_conv" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/conv.c"
             line="163">Optional arguments:

* @precision: #VipsPrecision, calculation accuracy
* @layers: %gint, number of layers for approximation
* @cluster: %gint, cluster lines closer than this distance

Convolution.

Perform a convolution of @in with @mask.
Each output pixel is calculated as:

|[
sigma[i]{pixel[i] * mask[i]} / scale + offset
]|

where scale and offset are part of @mask.

By default, @precision is
#VIPS_PRECISION_FLOAT. The output image
is always #VIPS_FORMAT_FLOAT unless @in is #VIPS_FORMAT_DOUBLE, in which case
@out is also #VIPS_FORMAT_DOUBLE.

If @precision is #VIPS_PRECISION_INTEGER, then
elements of @mask are converted to
integers before convolution, using rint(),
and the output image
always has the same #VipsBandFormat as the input image.

For #VIPS_FORMAT_UCHAR images and #VIPS_PRECISION_INTEGER @precision,
vips_conv() uses a fast vector path based on
half-float arithmetic. This can produce slightly different results.
Disable the vector path with `--vips-novector` or `VIPS_NOVECTOR` or
vips_vector_set_enabled().

If @precision is #VIPS_PRECISION_APPROXIMATE then, like
#VIPS_PRECISION_INTEGER, @mask is converted to int before convolution, and
the output image
always has the same #VipsBandFormat as the input image.

Larger values for @layers give more accurate
results, but are slower. As @layers approaches the mask radius, the
accuracy will become close to exact convolution and the speed will drop to
match. For many large masks, such as Gaussian, @n_layers need be only 10% of
this value and accuracy will still be good.

Smaller values of @cluster will give more accurate results, but be slower
and use more memory. 10% of the mask radius is a good rule of thumb.

See also: vips_convsep().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="49"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/conv.c"
               line="220">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/conv.c"
                 line="165">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/conv.c"
                 line="166">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/conv.c"
                 line="167">convolve with this mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/conv.c"
                 line="168">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="conva" c:identifier="vips_conva" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/conva.c"
             line="1344">Optional arguments:

* @layers: %gint, number of layers for approximation
* @cluster: %gint, cluster lines closer than this distance

Perform an approximate integer convolution of @in with @mask.
This is a low-level operation, see
vips_conv() for something more convenient.

The output image
always has the same #VipsBandFormat as the input image.
Elements of @mask are converted to
integers before convolution.

Larger values for @layers give more accurate
results, but are slower. As @layers approaches the mask radius, the
accuracy will become close to exact convolution and the speed will drop to
match. For many large masks, such as Gaussian, @layers need be only 10% of
this value and accuracy will still be good.

Smaller values of @cluster will give more accurate results, but be slower
and use more memory. 10% of the mask radius is a good rule of thumb.

See also: vips_conv().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="58"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/conva.c"
               line="1376">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/conva.c"
                 line="1346">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/conva.c"
                 line="1347">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/conva.c"
                 line="1348">convolution mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/conva.c"
                 line="1349">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="convasep" c:identifier="vips_convasep" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/convasep.c"
             line="932">Optional arguments:

* @layers: %gint, number of layers for approximation

Approximate separable integer convolution. This is a low-level operation, see
vips_convsep() for something more convenient.

The image is convolved twice: once with @mask and then again with @mask
rotated by 90 degrees.
@mask must be 1xn or nx1 elements.
Elements of @mask are converted to
integers before convolution.

Larger values for @layers give more accurate
results, but are slower. As @layers approaches the mask radius, the
accuracy will become close to exact convolution and the speed will drop to
match. For many large masks, such as Gaussian, @layers need be only 10% of
this value and accuracy will still be good.

The output image
always has the same #VipsBandFormat as the input image.

See also: vips_convsep().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="64"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/convasep.c"
               line="963">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convasep.c"
                 line="934">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convasep.c"
                 line="935">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convasep.c"
                 line="936">convolve with this mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convasep.c"
                 line="937">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="convf" c:identifier="vips_convf" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/convf.c"
             line="386">Convolution. This is a low-level operation, see vips_conv() for something
more convenient.

Perform a convolution of @in with @mask.
Each output pixel is
calculated as sigma[i]{pixel[i] * mask[i]} / scale + offset, where scale
and offset are part of @mask.

The convolution is performed with floating-point arithmetic. The output image
is always #VIPS_FORMAT_FLOAT unless @in is #VIPS_FORMAT_DOUBLE, in which case
@out is also #VIPS_FORMAT_DOUBLE.

See also: vips_conv().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="52"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/convf.c"
               line="407">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convf.c"
                 line="388">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convf.c"
                 line="389">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convf.c"
                 line="390">convolve with this mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convf.c"
                 line="391">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="convi" c:identifier="vips_convi" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/convi.c"
             line="1260">Integer convolution. This is a low-level operation, see vips_conv() for
something more convenient.

@mask is converted to an integer mask with rint() of each element, rint of
scale and rint of offset. Each output pixel is then calculated as

|[
sigma[i]{pixel[i] * mask[i]} / scale + offset
]|

The output image always has the same #VipsBandFormat as the input image.

For #VIPS_FORMAT_UCHAR images, vips_convi() uses a fast vector path based on
half-float arithmetic. This can produce slightly different results.
Disable the vector path with `--vips-novector` or `VIPS_NOVECTOR` or
vips_vector_set_enabled().

See also: vips_conv().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="55"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/convi.c"
               line="1286">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convi.c"
                 line="1262">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convi.c"
                 line="1263">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convi.c"
                 line="1264">convolve with this mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convi.c"
                 line="1265">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="convsep" c:identifier="vips_convsep" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/convsep.c"
             line="159">Optional arguments:

* @precision: calculation accuracy
* @layers: number of layers for approximation
* @cluster: cluster lines closer than this distance

Perform a separable convolution of @in with @mask.
See vips_conv() for a detailed description.

The mask must be 1xn or nx1 elements.

The image is convolved twice: once with @mask and then again with @mask
rotated by 90 degrees. This is much faster for certain types of mask
(gaussian blur, for example) than doing a full 2D convolution.

See also: vips_conv(), vips_gaussmat().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="61"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/convsep.c"
               line="183">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convsep.c"
                 line="161">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convsep.c"
                 line="162">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convsep.c"
                 line="163">convolution mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/convsep.c"
                 line="164">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="copy" c:identifier="vips_copy" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/copy.c"
             line="362">Optional arguments:

* @width: %gint, set image width
* @height: %gint, set image height
* @bands: %gint, set image bands
* @format: #VipsBandFormat, set image format
* @coding: #VipsCoding, set image coding
* @interpretation: #VipsInterpretation, set image interpretation
* @xres: %gdouble, set image xres
* @yres: %gdouble, set image yres
* @xoffset: %gint, set image xoffset
* @yoffset: %gint, set image yoffset

Copy an image, optionally modifying the header. VIPS copies images by
copying pointers, so this operation is instant, even for very large images.

You can optionally change any or all header fields during the copy. You can
make any change which does not change the size of a pel, so for example
you can turn a 4-band uchar image into a 2-band ushort image, but you
cannot change a 100 x 100 RGB image into a 300 x 100 mono image.

See also: vips_byteswap(), vips_bandfold(), vips_bandunfold().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="138"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/copy.c"
               line="391">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/copy.c"
                 line="364">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/copy.c"
                 line="365">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/copy.c"
                 line="366">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="copy_file"
              c:identifier="vips_copy_file"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/copy.c"
             line="406">A simple convenience function to copy an image to a file, then copy
again to output. If the image is already a file, just copy straight
through.

The file is allocated with vips_image_new_temp_file().
The file is automatically deleted when @out is closed.

See also: vips_copy(), vips_image_new_temp_file().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="150"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/copy.c"
               line="421">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/copy.c"
                 line="408">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/copy.c"
                 line="409">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/copy.c"
                 line="410">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="copy_memory" c:identifier="vips_image_copy_memory">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3321">This function allocates memory, renders @image into it, builds a new
image around the memory area, and returns that.

If the image is already a simple area of memory, it just refs @image and
returns it.

Call this before using the draw operations to make sure you have a
memory image that can be modified.

vips_copy() adds a null "copy" node to a pipeline. Use that
instead if you want to change metadata and not pixels.

This operation is thread-safe, unlike vips_image_wio_input().

If you are sure that @image is not shared with another thread (perhaps you
have made it yourself), use vips_image_wio_input() instead.

See also: vips_image_wio_input().</doc>
        <source-position filename="libvips/include/vips/image.h" line="544"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3344">the new #VipsImage, or %NULL on error.</doc>
          <type name="Image" c:type="VipsImage*"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3323">image to copy to a memory buffer</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="cos" c:identifier="vips_cos" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="333">Perform #VIPS_OPERATION_MATH_COS on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="266"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="341">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="335">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="336">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="337">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="cosh" c:identifier="vips_cosh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="471">Perform #VIPS_OPERATION_MATH_COSH on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="296"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="479">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="473">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="474">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="475">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="countlines"
              c:identifier="vips_countlines"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/morphology/countlines.c"
             line="158">Function which calculates the number of transitions
between black and white for the horizontal or the vertical
direction of an image.  black&lt;128 , white&gt;=128
The function calculates the number of transitions for all
Xsize or Ysize and returns the mean of the result
Input should be one band, 8-bit.

See also: vips_morph(), vips_conv().</doc>
        <source-position filename="libvips/include/vips/morphology.h"
                         line="59"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/morphology/countlines.c"
               line="174">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/countlines.c"
                 line="160">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="nolines"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/morphology/countlines.c"
                 line="161">output average number of lines</doc>
            <type name="gdouble" c:type="double*"/>
          </parameter>
          <parameter name="direction" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/countlines.c"
                 line="162">count lines horizontally or vertically</doc>
            <type name="Direction" c:type="VipsDirection"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/countlines.c"
                 line="163">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="crop" c:identifier="vips_crop" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/extract.c"
             line="299">A synonym for vips_extract_area().

See also: vips_extract_bands(), vips_smartcrop().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="180"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/extract.c"
               line="313">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="301">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="302">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="left" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="303">left edge of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="top" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="304">top edge of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="305">width of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="306">height of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="307">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="csvsave" c:identifier="vips_csvsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/csvsave.c"
             line="337">Optional arguments:

* @separator: separator string

Writes the pixels in @in to the @filename as CSV (comma-separated values).
The image is written
one line of text per scanline. Complex numbers are written as
"(real,imaginary)" and will need extra parsing I guess. Only the first band
is written.

@separator gives the string to use to separate numbers in the output.
The default is "\\t" (tab).

See also: vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="663"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/csvsave.c"
               line="358">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/csvsave.c"
                 line="339">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/csvsave.c"
                 line="340">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/csvsave.c"
                 line="341">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="csvsave_target"
              c:identifier="vips_csvsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/csvsave.c"
             line="373">Optional arguments:

* @separator: separator string

As vips_csvsave(), but save to a target.

See also: vips_csvsave().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="666"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/csvsave.c"
               line="387">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/csvsave.c"
                 line="375">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/csvsave.c"
                 line="376">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/csvsave.c"
                 line="377">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="decode" c:identifier="vips_image_decode">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2910">A convenience function to unpack to a format that we can compute with.
@out.coding is always #VIPS_CODING_NONE.

This unpacks LABQ to plain LAB. Use vips_LabQ2LabS() for a bit more speed
if you need it.

See also: vips_image_encode(), vips_LabQ2Lab(), vips_rad2float().</doc>
        <source-position filename="libvips/include/vips/image.h" line="530"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2923">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2912">image to decode</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2913">write to this image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
        </parameters>
      </method>
      <method name="decode_predict" c:identifier="vips_image_decode_predict">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2946">We often need to know what an image will decode to without actually
decoding it, for example, in arg checking.

See also: vips_image_decode().</doc>
        <source-position filename="libvips/include/vips/image.h" line="527"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2948">image to decode</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="bands"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2949">predict bands here</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="format"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2950">predict format here</doc>
            <type name="BandFormat" c:type="VipsBandFormat*"/>
          </parameter>
        </parameters>
      </method>
      <method name="deviate" c:identifier="vips_deviate" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/deviate.c"
             line="249">This operation finds the standard deviation of all pixels in @in. It
operates on all bands of the input image: use vips_stats() if you need
to calculate an average for each band.

Non-complex images only.

See also: vips_avg(), vips_stats()..</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="532"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/deviate.c"
               line="263">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/deviate.c"
                 line="251">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/deviate.c"
                 line="252">output pixel standard deviation</doc>
            <type name="gdouble" c:type="double*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/deviate.c"
                 line="253">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_circle"
              c:identifier="vips_draw_circle"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_circle.c"
             line="283">Optional arguments:

* @fill: fill the draw_circle

Draws a circle on @image. If @fill is %TRUE then the circle is filled,
otherwise a 1-pixel-wide perimeter is drawn.

@ink is an array of double containing values to draw.

See also: vips_draw_circle1(), vips_draw_line().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="89"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_circle.c"
               line="304">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="285">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="286">value to draw</doc>
            <array length="1" zero-terminated="0" c:type="double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="287">length of ink array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="cx" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="288">centre of draw_circle</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="cy" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="289">centre of draw_circle</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="radius" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="290">draw_circle radius</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="291">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_circle1"
              c:identifier="vips_draw_circle1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_circle.c"
             line="320">Optional arguments:

* @fill: fill the draw_circle

As vips_draw_circle(), but just takes a single double for @ink.

See also: vips_draw_circle().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="93"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_circle.c"
               line="337">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="322">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="323">value to draw</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="cx" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="324">centre of draw_circle</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="cy" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="325">centre of draw_circle</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="radius" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="326">draw_circle radius</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_circle.c"
                 line="327">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_flood"
              c:identifier="vips_draw_flood"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_flood.c"
             line="690">Optional arguments:

* @test: test this image
* @equal: fill while equal to edge
* @left: output left edge of bounding box of modified area
* @top: output top edge of bounding box of modified area
* @width: output width of bounding box of modified area
* @height: output height of bounding box of modified area

Flood-fill @image with @ink, starting at position @x, @y. The filled area is
bounded by pixels that are equal to the ink colour, in other words, it
searches for pixels enclosed by an edge of @ink.

If @equal is set, it instead searches for pixels which are equal to the
start point and fills them with @ink.

Normally it will test and set pixels in @image. If @test is set, it will
test pixels in @test and set pixels in @image. This lets you search an
image (@test) for continuous areas of pixels without modifying it.

@left, @top, @width, @height output the bounding box of the modified
pixels.

@ink is an array of double containing values to draw.

See also: vips_draw_flood1().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="98"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_flood.c"
               line="726">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="692">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="693">value to draw</doc>
            <array length="1" zero-terminated="0" c:type="double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="694">length of ink array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="695">centre of circle</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="696">centre of circle</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="697">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_flood1"
              c:identifier="vips_draw_flood1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_flood.c"
             line="742">Optional arguments:

* @test: test this image
* @equal: fill while equal to edge
* @left: output left edge of bounding box of modified area
* @top: output top edge of bounding box of modified area
* @width: output width of bounding box of modified area
* @height: output height of bounding box of modified area

As vips_draw_flood(), but just takes a single double for @ink.

See also: vips_draw_flood().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="101"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_flood.c"
               line="763">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="744">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="745">value to draw</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="746">centre of circle</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="747">centre of circle</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_flood.c"
                 line="748">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_image"
              c:identifier="vips_draw_image"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_image.c"
             line="302">Optional arguments:

* @mode: how to combine pixels

Draw @sub on top of @image at position @x, @y. The two images must have the
same Coding. If @sub has 1 band, the bands will be duplicated to match the
number of bands in @image. @sub will be converted to @image's format, see
vips_cast().

Use @mode to set how pixels are combined. If you use
#VIPS_COMBINE_MODE_ADD, both images muct be uncoded.

See also: vips_draw_mask(), vips_insert().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="67"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_image.c"
               line="324">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_image.c"
                 line="304">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="sub" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_image.c"
                 line="305">image to paint</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_image.c"
                 line="306">draw @sub here</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_image.c"
                 line="307">draw @sub here</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_image.c"
                 line="308">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_line"
              c:identifier="vips_draw_line"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_line.c"
             line="332">Draws a 1-pixel-wide line on an image.

@ink is an array of double containing values to draw.

See also: vips_draw_line1(), vips_draw_circle(), vips_draw_mask().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="80"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_line.c"
               line="349">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="334">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="335">value to draw</doc>
            <array length="1" zero-terminated="0" c:type="double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="336">length of ink array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="x1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="337">start of draw_line</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="338">start of draw_line</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="x2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="339">end of draw_line</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="340">end of draw_line</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="341">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_line1"
              c:identifier="vips_draw_line1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_line.c"
             line="365">As vips_draw_line(), but just take a single double for @ink.

See also: vips_draw_line().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="84"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_line.c"
               line="379">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="367">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="368">value to draw</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="x1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="369">start of draw_line</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="370">start of draw_line</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="x2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="371">end of draw_line</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="372">end of draw_line</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_line.c"
                 line="373">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_mask"
              c:identifier="vips_draw_mask"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_mask.c"
             line="372">Draw @mask on the image. @mask is a monochrome 8-bit image with 0/255
for transparent or @ink coloured points. Intermediate values blend the ink
with the pixel. Use with vips_text() to draw text on an image. Use in a
vips_draw_line() subclass to draw an object along a line.

@ink is an array of double containing values to draw.

See also: vips_text(), vips_draw_line().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="71"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_mask.c"
               line="391">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="374">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="375">value to draw</doc>
            <array length="1" zero-terminated="0" c:type="double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="376">size of ink array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="377">mask of 0/255 values showing where to plot</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="378">draw mask here</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="379">draw mask here</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="380">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_mask1"
              c:identifier="vips_draw_mask1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_mask.c"
             line="407">As vips_draw_mask(), but just takes a single double for @ink.

See also: vips_draw_mask().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="75"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_mask.c"
               line="420">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="409">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="410">value to draw</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="411">mask of 0/255 values showing where to plot</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="412">draw mask here</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="413">draw mask here</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_mask.c"
                 line="414">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_point"
              c:identifier="vips_draw_point"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_rect.c"
             line="304">As vips_draw_rect(), but draw a single pixel at @x, @y.

See also: vips_draw_rect().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="60"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_rect.c"
               line="317">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="306">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="307">value to draw</doc>
            <array length="1" zero-terminated="0" c:type="double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="308">length of ink array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="309">point to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="310">point to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="311">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_point1"
              c:identifier="vips_draw_point1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_rect.c"
             line="332">As vips_draw_point(), but just take a single double for @ink.

See also: vips_draw_point().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="63"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_rect.c"
               line="344">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="334">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="335">value to draw</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="336">point to draw</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="337">point to draw</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="338">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_rect"
              c:identifier="vips_draw_rect"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_rect.c"
             line="229">Optional arguments:

* @fill: fill the rect

Paint pixels within @left, @top, @width, @height in @image with @ink. If
@fill is zero, just paint a 1-pixel-wide outline.

See also: vips_draw_circle().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="52"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_rect.c"
               line="249">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="231">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="232">value to draw</doc>
            <array length="1" zero-terminated="0" c:type="double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="233">length of ink array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="left" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="234">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="top" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="235">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="236">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="237">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="238">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_rect1"
              c:identifier="vips_draw_rect1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_rect.c"
             line="266">Optional arguments:

* @fill: fill the rect

As vips_draw_rect(), but just take a single double for @ink.

See also: vips_draw_rect().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="56"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_rect.c"
               line="284">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="268">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="269">value to draw</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="left" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="270">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="top" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="271">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="272">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="273">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_rect.c"
                 line="274">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="draw_smudge"
              c:identifier="vips_draw_smudge"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/draw/draw_smudge.c"
             line="248">Smudge a section of @image. Each pixel in the area @left, @top, @width,
@height is replaced by the average of the surrounding 3x3 pixels.

See also: vips_draw_line().</doc>
        <source-position filename="libvips/include/vips/draw.h" line="105"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/draw/draw_smudge.c"
               line="262">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_smudge.c"
                 line="250">image to draw on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="left" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_smudge.c"
                 line="251">point to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="top" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_smudge.c"
                 line="252">point to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_smudge.c"
                 line="253">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_smudge.c"
                 line="254">area to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/draw/draw_smudge.c"
                 line="255">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="dzsave" c:identifier="vips_dzsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/dzsave.c"
             line="2684">Optional arguments:

* @basename: %gchar base part of name
* @layout: #VipsForeignDzLayout directory layout convention
* @suffix: %gchar suffix for tiles
* @overlap: %gint set tile overlap
* @tile_size: %gint set tile size
* @background: #VipsArrayDouble background colour
* @depth: #VipsForeignDzDepth how deep to make the pyramid
* @centre: %gboolean centre the tiles
* @angle: #VipsAngle rotate the image by this much
* @container: #VipsForeignDzContainer set container type
* @compression: %gint zip deflate compression level
* @region_shrink: #VipsRegionShrink how to shrink each 2x2 region
* @skip_blanks: %gint skip tiles which are nearly equal to the background
* @id: %gchar id for IIIF properties
* @Q: %gint, quality factor

Save an image as a set of tiles at various resolutions. By default dzsave
uses DeepZoom layout -- use @layout to pick other conventions.

vips_dzsave() creates a directory called @name to hold the tiles. If @name
ends `.zip`, vips_dzsave() will create a zip file called @name to hold the
tiles. You can use @container to force zip file output.

Use @basename to set the name of the image we are creating. The
default value is set from @name.

By default, tiles are written as JPEGs. Use @Q set set the JPEG quality
factor.

You can set @suffix to something like `".png[bitdepth=4]"` to write tiles
in another format.

In Google layout mode, edge tiles are expanded to @tile_size by @tile_size
pixels. Normally they are filled with white, but you can set another colour
with @background. Images are usually placed at the top-left of the tile,
but you can have them centred by turning on @centre.

You can set the size and overlap of tiles with @tile_size and @overlap.
They default to the correct settings for the selected @layout. The deepzoom
defaults produce 256x256 jpeg files for centre tiles, the most efficient
size.

Use @depth to control how low the pyramid goes. This defaults to the
correct setting for the @layout you select.

You can rotate the image during write with the @angle argument. However,
this will only work for images which support random access, like openslide,
and not for things like JPEG. You'll need to rotate those images
yourself with vips_rot(). Note that the `autorotate` option to the loader
may do what you need.

By default, all tiles are stripped since usually you do not want a copy of
all metadata in every tile. Set @keep if you want to keep metadata.

If @container is set to `zip`, you can set a compression level from -1
(use zlib default), 0 (store, compression disabled) to 9 (max compression).
If no value is given, the default is to store files without compression.

You can use @region_shrink to control the method for shrinking each 2x2
region. This defaults to using the average of the 4 input pixels but you can
also use the median in cases where you want to preserve the range of values.

If you set @skip_blanks to a value greater than or equal to zero, tiles
which are all within that many pixel values to the background are skipped.
This can save a lot of space for some image types. This option defaults to
5 in Google layout mode, -1 otherwise.

In IIIF layout, you can set the base of the `id` property in `info.json`
with @id. The default is `https://example.com/iiif`.

Use @layout #VIPS_FOREIGN_DZ_LAYOUT_IIIF3 for IIIF v3 layout.

See also: vips_tiffsave().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="965"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/dzsave.c"
               line="2766">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2686">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2687">name to save to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2688">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="dzsave_buffer"
              c:identifier="vips_dzsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/dzsave.c"
             line="2781">Optional arguments:

* @basename: %gchar base part of name
* @layout: #VipsForeignDzLayout directory layout convention
* @suffix: %gchar suffix for tiles
* @overlap: %gint set tile overlap
* @tile_size: %gint set tile size
* @background: #VipsArrayDouble background colour
* @depth: #VipsForeignDzDepth how deep to make the pyramid
* @centre: %gboolean centre the tiles
* @angle: #VipsAngle rotate the image by this much
* @container: #VipsForeignDzContainer set container type
* @compression: %gint zip deflate compression level
* @region_shrink: #VipsRegionShrink how to shrink each 2x2 region.
* @skip_blanks: %gint skip tiles which are nearly equal to the background
* @id: %gchar id for IIIF properties
* @Q: %gint, quality factor

As vips_dzsave(), but save to a memory buffer.

Output is always in a zip container. Use @basename to set the name of the
directory that the zip will create when unzipped.

The address of the buffer is returned in @buf, the length of the buffer in
@len. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_dzsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="968"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/dzsave.c"
               line="2817">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2783">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2784">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2785">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2786">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="dzsave_target"
              c:identifier="vips_dzsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/dzsave.c"
             line="2847">Optional arguments:

* @basename: %gchar base part of name
* @layout: #VipsForeignDzLayout directory layout convention
* @suffix: %gchar suffix for tiles
* @overlap: %gint set tile overlap
* @tile_size: %gint set tile size
* @background: #VipsArrayDouble background colour
* @depth: #VipsForeignDzDepth how deep to make the pyramid
* @centre: %gboolean centre the tiles
* @angle: #VipsAngle rotate the image by this much
* @container: #VipsForeignDzContainer set container type
* @compression: %gint zip deflate compression level
* @region_shrink: #VipsRegionShrink how to shrink each 2x2 region.
* @skip_blanks: %gint skip tiles which are nearly equal to the background
* @id: %gchar id for IIIF properties
* @Q: %gint, quality factor

As vips_dzsave(), but save to a target.

See also: vips_dzsave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="971"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/dzsave.c"
               line="2875">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2849">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2850">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/dzsave.c"
                 line="2851">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="embed" c:identifier="vips_embed" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/embed.c"
             line="675">Optional arguments:

* @extend: #VipsExtend to generate the edge pixels (default: black)
* @background: #VipsArrayDouble colour for edge pixels

The opposite of vips_extract_area(): embed @in within an image of size
@width by @height at position @x, @y.

@extend
controls what appears in the new pels, see #VipsExtend.

See also: vips_extract_area(), vips_insert().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="154"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/embed.c"
               line="698">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/embed.c"
                 line="677">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/embed.c"
                 line="678">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/embed.c"
                 line="679">place @in at this x position in @out</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/embed.c"
                 line="680">place @in at this y position in @out</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/embed.c"
                 line="681">@out should be this many pixels across</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/embed.c"
                 line="682">@out should be this many pixels down</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/embed.c"
                 line="683">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="encode" c:identifier="vips_image_encode">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2985">A convenience function to pack to a coding. The inverse of
vips_image_decode().

See also: vips_image_decode().</doc>
        <source-position filename="libvips/include/vips/image.h" line="532"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2996">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2987">image to encode</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2988">write to this image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="coding" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2989">coding to apply</doc>
            <type name="Coding" c:type="VipsCoding"/>
          </parameter>
        </parameters>
      </method>
      <method name="eorimage_const"
              c:identifier="vips_eorimage_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="711">Perform #VIPS_OPERATION_BOOLEAN_EOR on an image and an array of constants.
See vips_boolean_const().

See also: vips_boolean(), vips_boolean_const1().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="454"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="724">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="713">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="714">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="715">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="716">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="717">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="eorimage_const1"
              c:identifier="vips_eorimage_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="884">Perform #VIPS_OPERATION_BOOLEAN_EOR on an image and a constant.
See vips_boolean_const1().

See also: vips_boolean(), vips_boolean_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="476"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="896">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="886">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="887">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="888">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="889">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="equal_const"
              c:identifier="vips_equal_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="685">Perform #VIPS_OPERATION_RELATIONAL_EQUAL on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="375"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="696">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="687">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="688">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="689">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="690">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="691">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="equal_const1"
              c:identifier="vips_equal_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="877">Perform #VIPS_OPERATION_RELATIONAL_EQUAL on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="403"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="887">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="879">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="880">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="881">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="882">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="exp" c:identifier="vips_exp" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="632">Perform #VIPS_OPERATION_MATH_EXP on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="281"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="640">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="634">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="635">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="636">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="exp10" c:identifier="vips_exp10" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="655">Perform #VIPS_OPERATION_MATH_EXP10 on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="284"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="663">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="657">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="658">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="659">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="extract_area"
              c:identifier="vips_extract_area"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/extract.c"
             line="241">Extract an area from an image. The area must fit within @in.

See also: vips_extract_bands(), vips_smartcrop().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="176"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/extract.c"
               line="255">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="243">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="244">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="left" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="245">left edge of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="top" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="246">top edge of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="247">width of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="248">height of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="249">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="extract_band"
              c:identifier="vips_extract_band"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/extract.c"
             line="458">Optional arguments:

* @n: number of bands to extract

Extract a band or bands from an image. Extracting out of range is an error.

See also: vips_extract_area().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="187"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/extract.c"
               line="473">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="460">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="461">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="band" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="462">band to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/extract.c"
                 line="463">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="falsecolour"
              c:identifier="vips_falsecolour"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/falsecolour.c"
             line="391">Force @in to 1 band, 8-bit, then transform to
a 3-band 8-bit image with a false colour
map. The map is supposed to make small differences in brightness more
obvious.

See also: vips_maplut().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="344"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/falsecolour.c"
               line="404">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/falsecolour.c"
                 line="393">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/falsecolour.c"
                 line="394">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/falsecolour.c"
                 line="395">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="fastcor" c:identifier="vips_fastcor" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/fastcor.c"
             line="229">Calculate a fast correlation surface.

@ref is placed at every position in @in and the sum of squares of
differences calculated.

The output
image is the same size as the input. Extra input edge pixels are made by
copying the existing edges outwards.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The output type is uint if both inputs are integer, float if both are float
or complex, and double if either is double or double complex.
In other words, the output type is just large enough to hold the whole
range of possible values.

See also: vips_spcor().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="81"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/fastcor.c"
               line="257">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/fastcor.c"
                 line="231">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ref" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/fastcor.c"
                 line="232">reference image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/fastcor.c"
                 line="233">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/fastcor.c"
                 line="234">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="fill_nearest"
              c:identifier="vips_fill_nearest"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/morphology/nearest.c"
             line="326">Optional arguments:

* @distance: output image of distance to nearest non-zero pixel

Fill outwards from every non-zero pixel in @in, setting pixels in @distance
and @value.

At the position of zero pixels in @in, @distance contains the distance to
the nearest non-zero pixel in @in, and @value contains the value of that
pixel.

@distance is a one-band float image. @value has the same number of bands and
format as @in.

See also: vips_hist_find_indexed().</doc>
        <source-position filename="libvips/include/vips/morphology.h"
                         line="66"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/morphology/nearest.c"
               line="348">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/nearest.c"
                 line="328">image to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/nearest.c"
                 line="329">image with zero pixels filled with the nearest non-zero pixel</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/nearest.c"
                 line="330">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="find_trim"
              c:identifier="vips_find_trim"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/find_trim.c"
             line="250">Optional arguments:

* @threshold: %gdouble, background / object threshold
* @background: #VipsArrayDouble, background colour
* @line_art: %gboolean, enable line art mode

Search @in for the bounding box of the non-background area.

Any alpha is flattened out, then the image is median-filtered (unless
@line_art is set, see below). The absolute difference from @background is
computed and binarized according to @threshold. Row and column sums of
the absolute difference are calculated from this binary image and searched
for the first row or column in each direction to obtain the bounding box.

If the image is entirely background, vips_find_trim() returns @width == 0
and @height == 0.

@background defaults to 255, or 65535 for 16-bit images. Set another value,
or use vips_getpoint() to pick a value from an edge. You'll need to flatten
before vips_getpoint() to get a correct background value.

@threshold defaults to 10.

The detector is designed for photographic or compressed images where there
is a degree of noise that needs filtering. If your images are synthetic
(eg. rendered from vector art, perhaps), set @line_art to disable this
filtering.

The image needs to be at least 3x3 pixels in size.

See also: vips_getpoint(), vips_extract_area(), vips_smartcrop().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="547"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/find_trim.c"
               line="291">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/find_trim.c"
                 line="252">image to find_trim</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="left"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/find_trim.c"
                 line="253">output left edge</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="top"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/find_trim.c"
                 line="254">output top edge</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="width"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/find_trim.c"
                 line="255">output width</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="height"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/find_trim.c"
                 line="256">output height</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/find_trim.c"
                 line="257">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="fitssave" c:identifier="vips_fitssave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/fitssave.c"
             line="157">Write a VIPS image to a file in FITS format.

See also: vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="635"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/fitssave.c"
               line="167">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/fitssave.c"
                 line="159">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/fitssave.c"
                 line="160">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/fitssave.c"
                 line="161">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="flatten" c:identifier="vips_flatten" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/flatten.c"
             line="446">Optional arguments:

* @background: #VipsArrayDouble colour for new pixels
* @max_alpha: %gdouble, maximum value for alpha

Take the last band of @in as an alpha and use it to blend the
remaining channels with @background.

The alpha channel is 0 - @max_alpha, where @max_alpha means 100% image
and 0 means 100% background. @background defaults to zero (black).

@max_alpha has the default value 255, or 65535 for images tagged as
#VIPS_INTERPRETATION_RGB16 or
#VIPS_INTERPRETATION_GREY16.

Useful for flattening PNG images to RGB.

Non-complex images only.

See also: vips_premultiply(), vips_pngload().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="324"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/flatten.c"
               line="473">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/flatten.c"
                 line="448">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/flatten.c"
                 line="449">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/flatten.c"
                 line="450">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="flip" c:identifier="vips_flip" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/flip.c"
             line="258">Flips an image left-right or up-down.

See also: vips_rot().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="162"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/flip.c"
               line="269">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/flip.c"
                 line="260">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/flip.c"
                 line="261">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="direction" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/flip.c"
                 line="262">flip horizontally or vertically</doc>
            <type name="Direction" c:type="VipsDirection"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/flip.c"
                 line="263">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="float2rad"
              c:identifier="vips_float2rad"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/float2rad.c"
             line="227">Convert a three-band float image to Radiance 32-bit packed format.

See also: vips_rad2float(), #VIPS_CODING_RAD, vips_LabQ2Lab().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="126"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/float2rad.c"
               line="237">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/float2rad.c"
                 line="229">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/float2rad.c"
                 line="230">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/float2rad.c"
                 line="231">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="floor" c:identifier="vips_floor" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/round.c"
             line="232">Round to an integral value with #VIPS_OPERATION_ROUND_FLOOR. See
vips_round().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="249"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/round.c"
               line="241">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="234">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="235">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="236">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="foreign_load_invalidate"
              c:identifier="vips_foreign_load_invalidate">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="1291">Loaders can call this on the image they are making if they see a read error
from the load library. It signals "invalidate" on the load operation and
will cause it to be dropped from cache.

If we know a file will cause a read error, we don't want to cache the
failing operation, we want to make sure the image will really be opened
again if our caller tries again. For example, a broken file might be
replaced by a working one.</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="295"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="1293">image to invalidate</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="free_buffer" c:identifier="vips_image_free_buffer">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3889">Free the externally allocated buffer found in the input image. This function
is intended to be used with g_signal_connect.</doc>
        <source-position filename="libvips/include/vips/image.h" line="604"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3891">the image that contains the buffer</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buffer"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3892">the original buffer that was stolen</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </method>
      <method name="freqmult" c:identifier="vips_freqmult" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/freqfilt/freqmult.c"
             line="141">Multiply @in by @mask in Fourier space.

@in is transformed to Fourier space, multiplied with @mask, then
transformed back to real space. If @in is already a complex image, just
multiply then inverse transform.

See also: vips_invfft(), vips_mask_ideal().</doc>
        <source-position filename="libvips/include/vips/freqfilt.h" line="49"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/freqfilt/freqmult.c"
               line="156">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/freqmult.c"
                 line="143">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/freqmult.c"
                 line="144">mask image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/freqmult.c"
                 line="145">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/freqmult.c"
                 line="146">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="fwfft" c:identifier="vips_fwfft" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/freqfilt/fwfft.c"
             line="380">Transform an image to Fourier space.

VIPS uses the fftw Fourier Transform library. If this library was not
available when VIPS was configured, these functions will fail.

See also: vips_invfft().</doc>
        <source-position filename="libvips/include/vips/freqfilt.h" line="42"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/freqfilt/fwfft.c"
               line="393">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/fwfft.c"
                 line="382">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/fwfft.c"
                 line="383">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/fwfft.c"
                 line="384">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="gamma" c:identifier="vips_gamma" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/gamma.c"
             line="161">Optional arguments:

* @exponent: gamma, default 1.0 / 2.4

Calculate @in ** (1 / @exponent), normalising to the maximum range of the
input type. For float types use 1.0 as the maximum.

See also: vips_identity(), vips_pow_const1(), vips_maplut()</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="347"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/gamma.c"
               line="176">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/gamma.c"
                 line="163">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/gamma.c"
                 line="164">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/gamma.c"
                 line="165">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="gaussblur"
              c:identifier="vips_gaussblur"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/gaussblur.c"
             line="173">Optional arguments:

* @precision: #VipsPrecision, precision for blur, default int
* @min_ampl: minimum amplitude, default 0.2

This operator runs vips_gaussmat() and vips_convsep() for you on an image.
Set @min_ampl smaller to generate a larger, more accurate mask. Set @sigma
larger to make the blur more blurry.

See also: vips_gaussmat(), vips_convsep().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="71"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/gaussblur.c"
               line="191">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/gaussblur.c"
                 line="175">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/gaussblur.c"
                 line="176">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="sigma" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/gaussblur.c"
                 line="177">how large a mask to use</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/gaussblur.c"
                 line="178">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="get" c:identifier="vips_image_get">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1295">Fill @value_copy with a copy of the header field. @value_copy must be zeroed
but uninitialised.

This will return -1 and add a message to the error buffer if the field
does not exist. Use vips_image_get_typeof() to test for the
existence of a field first if you are not certain it will be there.

For example, to read a double from an image (though of course you would use
vips_image_get_double() in practice):

|[
GValue value = G_VALUE_INIT;
double d;

if (vips_image_get(image, name, &amp;value))
    return -1;

if (G_VALUE_TYPE(&amp;value) != G_TYPE_DOUBLE) {
    vips_error("mydomain",
        _("field \"%s\" is of type %s, not double"),
        name,
        g_type_name(G_VALUE_TYPE(&amp;value)));
    g_value_unset(&amp;value);
    return -1;
}

d = g_value_get_double(&amp;value);
g_value_unset(&amp;value);
]|

See also: vips_image_get_typeof(), vips_image_get_double().</doc>
        <source-position filename="libvips/include/vips/header.h" line="248"/>
        <return-value transfer-ownership="none" skip="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1333">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1297">image to get the field from from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1298">the name to fetch</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="value_copy"
                     direction="out"
                     caller-allocates="1"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1299">the %GValue is copied into this</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_area" c:identifier="vips_image_get_area">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1627">Gets @data from @image under the name @name. A convenience
function over vips_image_get(). Use vips_image_get_typeof() to test for
the existence of a piece of metadata.

See also: vips_image_set_area(), vips_image_get(),
vips_image_get_typeof()</doc>
        <source-position filename="libvips/include/vips/header.h" line="268"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1640">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1629">image to get the metadata from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1630">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="data"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     nullable="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1631">return metadata value</doc>
            <type name="gpointer" c:type="void**"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_array_double"
              c:identifier="vips_image_get_array_double">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="2105">Gets @out from @im under the name @name.
The field must be of type
#VIPS_TYPE_ARRAY_INT.

Do not free @out. @out is valid as long as @image is valid.

Use vips_image_get_typeof() to test for the
existence of a piece of metadata.

See also: vips_image_get(), vips_image_set_image()</doc>
        <source-position filename="libvips/include/vips/header.h" line="310"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="2123">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2107">image to get the metadata from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2108">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2109">return pointer to array</doc>
            <array length="2" zero-terminated="0" c:type="double**">
              <type name="gdouble" c:type="double*"/>
            </array>
          </parameter>
          <parameter name="n"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     optional="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2110">return the number of elements here, optionally</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_array_int" c:identifier="vips_image_get_array_int">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="2047">Gets @out from @im under the name @name.
The field must be of type
#VIPS_TYPE_ARRAY_INT.

Do not free @out. @out is valid as long as @image is valid.

Use vips_image_get_typeof() to test for the
existence of a piece of metadata.

See also: vips_image_get(), vips_image_set_image()</doc>
        <source-position filename="libvips/include/vips/header.h" line="307"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="2065">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2049">image to get the metadata from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2050">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2051">return pointer to array</doc>
            <array length="2" zero-terminated="0" c:type="int**">
              <type name="gint" c:type="int*"/>
            </array>
          </parameter>
          <parameter name="n"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     optional="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2052">return the number of elements here, optionally</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_as_string" c:identifier="vips_image_get_as_string">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1924">Returns @name from @image in @out.
This function will read any field, returning it as a printable string.
You need to free the string with g_free() when you are done with it.

This will base64-encode BLOBs, for example. Use vips_buf_appendgv() to
make a string that's for humans.

See also: vips_image_get(), vips_image_get_typeof(), vips_buf_appendgv().</doc>
        <source-position filename="libvips/include/vips/header.h" line="251"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1939">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1926">image to get the header field from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1927">field name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1928">return field value as string</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_bands"
              c:identifier="vips_image_get_bands"
              glib:get-property="bands">
        <source-position filename="libvips/include/vips/header.h" line="194"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="418">the number of bands (channels) in the image.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="416">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_blob" c:identifier="vips_image_get_blob">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1720">Gets @data from @image under the name @name, optionally returns its
length in @length. Use vips_image_get_typeof() to test for the existence
of a piece of metadata.

See also: vips_image_get(), vips_image_get_typeof(), vips_blob_get(),</doc>
        <source-position filename="libvips/include/vips/header.h" line="278"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1733">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1722">image to get the metadata from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1723">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="data"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1724">pointer to area of memory</doc>
            <array length="2" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="length"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1725">return the blob length here, optionally</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_coding"
              c:identifier="vips_image_get_coding"
              glib:get-property="coding">
        <source-position filename="libvips/include/vips/header.h" line="202"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="568">the image coding</doc>
          <type name="Coding" c:type="VipsCoding"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="566">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_concurrency" c:identifier="vips_image_get_concurrency">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="961">Fetch and sanity-check #VIPS_CONCURRENCY. Default to 1 if not present or
crazy.</doc>
        <source-position filename="libvips/include/vips/header.h" line="234"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="968">the suggested concurrency for this image</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="963">image to get from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="default_concurrency" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_data" c:identifier="vips_image_get_data">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1049">Return a pointer to the image's pixel data, if possible. This can involve
allocating large amounts of memory and performing a long computation. Image
pixels are laid out in band-packed rows.

Since this function modifies @image, it is not threadsafe. Only call it on
images which you are sure have not been shared with another thread.

See also: vips_image_wio_input(), vips_image_copy_memory().</doc>
        <source-position filename="libvips/include/vips/header.h" line="236"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1062">a pointer to pixel data, if possible.</doc>
          <type name="gpointer" c:type="void*"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1051">image to get data for</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_double" c:identifier="vips_image_get_double">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1800">Gets @out from @im under the name @name.
The value will be transformed into
a double, if possible.

See also: vips_image_get(), vips_image_get_typeof()</doc>
        <source-position filename="libvips/include/vips/header.h" line="286"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1812">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1802">image to get the header field from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1803">field name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1804">return field value</doc>
            <type name="gdouble" c:type="double*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_fields" c:identifier="vips_image_get_fields">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1551">Get a %NULL-terminated array listing all the metadata field names on @image.
Free the return result with g_strfreev().

This is handy for language bindings. From C, it's usually more convenient to
use vips_image_map().</doc>
        <source-position filename="libvips/include/vips/header.h" line="262"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1561">metadata fields in image, as a %NULL-terminated
array.</doc>
          <array c:type="gchar**">
            <type name="utf8"/>
          </array>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1553">image to get fields from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_filename"
              c:identifier="vips_image_get_filename"
              glib:get-property="filename">
        <source-position filename="libvips/include/vips/header.h" line="216"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="844">the name of the file the image was loaded from, or NULL if there
is no filename.</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="842">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_format"
              c:identifier="vips_image_get_format"
              glib:get-property="format">
        <source-position filename="libvips/include/vips/header.h" line="196"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="430">the format of each band element.</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="428">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_height"
              c:identifier="vips_image_get_height"
              glib:get-property="height">
        <source-position filename="libvips/include/vips/header.h" line="192"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="406">the number of pixels down the image.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="404">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_history" c:identifier="vips_image_get_history">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="2259">This function reads the image history as a C string. The string is owned
by VIPS and must not be freed.

VIPS tracks the history of each image, that is, the sequence of operations
that generated that image. Applications built on VIPS need to call
vips_image_history_printf() for each action they perform, setting the
command-line equivalent for the action.

See also: vips_image_history_printf().</doc>
        <source-position filename="libvips/include/vips/header.h" line="323"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="2273">The history of @image as a C string. Do not free!</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2261">get history from here</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_image" c:identifier="vips_image_get_image">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1994">Gets @out from @im under the name @name.
The field must be of type
#VIPS_TYPE_IMAGE. You must unref @out with g_object_unref().

Use vips_image_get_typeof() to test for the
existence of a piece of metadata.

See also: vips_image_get(), vips_image_set_image()</doc>
        <source-position filename="libvips/include/vips/header.h" line="299"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="2009">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1996">image to get the metadata from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1997">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1998">return metadata value</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_int" c:identifier="vips_image_get_int">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1750">Gets @out from @im under the name @name.
The value will be transformed into
an int, if possible.

See also: vips_image_get(), vips_image_get_typeof()</doc>
        <source-position filename="libvips/include/vips/header.h" line="282"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1762">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1752">image to get the header field from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1753">field name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1754">return field value</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_interpretation"
              c:identifier="vips_image_get_interpretation"
              glib:get-property="interpretation">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="576">Return the #VipsInterpretation set in the image header.
Use vips_image_guess_interpretation() if you want a sanity-checked value.</doc>
        <source-position filename="libvips/include/vips/header.h" line="204"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="583">the #VipsInterpretation from the image header.</doc>
          <type name="Interpretation" c:type="VipsInterpretation"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="578">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_mode"
              c:identifier="vips_image_get_mode"
              glib:get-property="mode">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="853">Image modes are things like `"t"`, meaning a memory buffer, and `"p"`
meaning a delayed computation.</doc>
        <source-position filename="libvips/include/vips/header.h" line="218"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="860">the image mode.</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="855">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_n_pages" c:identifier="vips_image_get_n_pages">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="935">Fetch and sanity-check #VIPS_META_N_PAGES. Default to 1 if not present or
crazy.

This is the number of pages in the image file, not the number of pages that
have been loaded into @image.</doc>
        <source-position filename="libvips/include/vips/header.h" line="226"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="945">the number of pages in the image file</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="937">image to get from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_n_subifds" c:identifier="vips_image_get_n_subifds">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="985">Fetch and sanity-check #VIPS_META_N_SUBIFDS. Default to 0 if not present or
crazy.</doc>
        <source-position filename="libvips/include/vips/header.h" line="228"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="992">the number of subifds in the image file</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="987">image to get from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_offset" c:identifier="vips_image_get_offset">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="889">Matrix images can have an optional `offset` field for use by integer
convolution.</doc>
        <source-position filename="libvips/include/vips/header.h" line="222"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="896">the offset.</doc>
          <type name="gdouble" c:type="double"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="891">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_orientation" c:identifier="vips_image_get_orientation">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1008">Fetch and sanity-check #VIPS_META_ORIENTATION. Default to 1 (no rotate,
no flip) if not present or crazy.</doc>
        <source-position filename="libvips/include/vips/header.h" line="230"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1015">the image orientation.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1010">image to get from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_orientation_swap"
              c:identifier="vips_image_get_orientation_swap">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1032">Return %TRUE if applying the orientation would swap width and height.</doc>
        <source-position filename="libvips/include/vips/header.h" line="232"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1038">if width/height will swap</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1034">image to get from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_page_height" c:identifier="vips_image_get_page_height">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="910">Multi-page images can have a page height. Fetch it, and sanity check it. If
page-height is not set, it defaults to the image height.</doc>
        <source-position filename="libvips/include/vips/header.h" line="224"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="917">the page height.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="912">image to get from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_scale" c:identifier="vips_image_get_scale">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="868">Matrix images can have an optional `scale` field for use by integer
convolution.</doc>
        <source-position filename="libvips/include/vips/header.h" line="220"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="875">the scale.</doc>
          <type name="gdouble" c:type="double"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="870">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_string" c:identifier="vips_image_get_string">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1850">Gets @out from @im under the name @name.
The field must be of type
G_TYPE_STRING, VIPS_TYPE_REF_STRING.

Do not free @out.

Use vips_image_get_as_string() to fetch any field as a string.

See also: vips_image_get(), vips_image_get_typeof()</doc>
        <source-position filename="libvips/include/vips/header.h" line="291"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1866">0 on success, -1 otherwise.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1852">image to get the header field from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1853">field name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1854">return field value</doc>
            <type name="utf8" c:type="const char**"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_typeof" c:identifier="vips_image_get_typeof">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1385">Read the %GType for a header field. Returns zero if there is no
field of that name.

See also: vips_image_get().</doc>
        <source-position filename="libvips/include/vips/header.h" line="254"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1395">the %GType of the field, or zero if there is no
field of that name.</doc>
          <type name="GType" c:type="GType"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1387">image to test</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1388">the name to search for</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_width"
              c:identifier="vips_image_get_width"
              glib:get-property="width">
        <source-position filename="libvips/include/vips/header.h" line="190"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="394">the number of pixels across the image.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="392">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_xoffset"
              c:identifier="vips_image_get_xoffset"
              glib:get-property="xoffset">
        <source-position filename="libvips/include/vips/header.h" line="212"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="820">the horizontal position of the image origin, in pixels.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="818">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_xres"
              c:identifier="vips_image_get_xres"
              glib:get-property="xres">
        <source-position filename="libvips/include/vips/header.h" line="208"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="796">the horizontal image resolution in pixels per millimeter.</doc>
          <type name="gdouble" c:type="double"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="794">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_yoffset"
              c:identifier="vips_image_get_yoffset"
              glib:get-property="yoffset">
        <source-position filename="libvips/include/vips/header.h" line="214"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="832">the vertical position of the image origin, in pixels.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="830">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_yres"
              c:identifier="vips_image_get_yres"
              glib:get-property="yres">
        <source-position filename="libvips/include/vips/header.h" line="210"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="808">the vertical image resolution in pixels per millimeter.</doc>
          <type name="gdouble" c:type="double"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="806">image to get from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="getpoint" c:identifier="vips_getpoint" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/getpoint.c"
             line="192">Reads a single pixel on an image.

The pixel values are returned in @vector, the length of the
array in @n. You must free the array with g_free() when you are done with
it.

The result array has an element for each band. If @unpack_complex is set,
pixels in complex images are returned as double-length arrays.

See also: vips_draw_point().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="551"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/getpoint.c"
               line="212">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/getpoint.c"
                 line="194">image to read from</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="vector"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/getpoint.c"
                 line="195">output pixel value here</doc>
            <array length="1" zero-terminated="0" c:type="double**">
              <type name="gdouble" c:type="double*"/>
            </array>
          </parameter>
          <parameter name="n"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/getpoint.c"
                 line="196">length of output vector</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/getpoint.c"
                 line="197">position to read</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/getpoint.c"
                 line="198">position to read</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/getpoint.c"
                 line="199">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="gifsave" c:identifier="vips_gifsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/cgifsave.c"
             line="1120">Optional arguments:

* @dither: %gdouble, quantisation dithering level
* @effort: %gint, quantisation CPU effort
* @bitdepth: %gint, number of bits per pixel
* @interframe_maxerror: %gdouble, maximum inter-frame error for transparency
* @reuse: %gboolean, reuse palette from input
* @interlace: %gboolean, write an interlaced (progressive) GIF
* @interpalette_maxerror: %gdouble, maximum inter-palette error for palette
  reusage

Write to a file in GIF format.

Use @dither to set the degree of Floyd-Steinberg dithering
and @effort to control the CPU effort (1 is the fastest,
10 is the slowest, 7 is the default).

Use @bitdepth (from 1 to 8, default 8) to control the number
of colours in the palette. The first entry in the palette is
always reserved for transparency. For example, a bitdepth of
4 will allow the output to contain up to 15 colours.

Use @interframe_maxerror to set the threshold below which pixels are
considered equal.
Pixels which don't change from frame to frame can be made transparent,
improving the compression rate. Default 0.

Use @interpalette_maxerror to set the threshold below which the
previously generated palette will be reused.

If @reuse is TRUE, the GIF will be saved with a single global
palette taken from the metadata in @in, and no new palette optimisation
will be done.

If @interlace is TRUE, the GIF file will be interlaced (progressive GIF).
These files may be better for display over a slow network
connection, but need more memory to encode.

See also: vips_image_new_from_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="839"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/cgifsave.c"
               line="1166">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1122">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1123">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1124">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="gifsave_buffer"
              c:identifier="vips_gifsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/cgifsave.c"
             line="1181">Optional arguments:

* @dither: %gdouble, quantisation dithering level
* @effort: %gint, quantisation CPU effort
* @bitdepth: %gint, number of bits per pixel
* @interframe_maxerror: %gdouble, maximum inter-frame error for transparency
* @reuse: %gboolean, reuse palette from input
* @interlace: %gboolean, write an interlaced (progressive) GIF
* @interpalette_maxerror: %gdouble, maximum inter-palette error for palette
  reusage

As vips_gifsave(), but save to a memory buffer.

The address of the buffer is returned in @buf, the length of the buffer in
@len. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_gifsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="842"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/cgifsave.c"
               line="1207">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1183">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1184">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1185">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1186">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="gifsave_target"
              c:identifier="vips_gifsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/cgifsave.c"
             line="1237">Optional arguments:

* @dither: %gdouble, quantisation dithering level
* @effort: %gint, quantisation CPU effort
* @bitdepth: %gint, number of bits per pixel
* @interframe_maxerror: %gdouble, maximum inter-frame error for transparency
* @reuse: %gboolean, reuse palette from input
* @interlace: %gboolean, write an interlaced (progressive) GIF
* @interpalette_maxerror: %gdouble, maximum inter-palette error for palette
  reusage

As vips_gifsave(), but save to a target.

See also: vips_gifsave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="845"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/cgifsave.c"
               line="1258">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1239">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1240">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/cgifsave.c"
                 line="1241">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="globalbalance"
              c:identifier="vips_globalbalance"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/mosaicing/global_balance.c"
             line="1956">Optional arguments:

* @gamma: gamma of source images
* @int_output: %TRUE for integer image output

vips_globalbalance() can be used to remove contrast differences in
an assembled mosaic.

It reads the History field attached to @in and builds a list of the source
images that were used to make the mosaic and the position that each ended
up at in the final image.

It opens each of the source images in turn and extracts all parts which
overlap with any of the other images. It finds the average values in the
overlap areas and uses least-mean-square to find a set of correction
factors which will minimise overlap differences. It uses @gamma to
gamma-correct the source images before calculating the factors. A value of
1.0 will stop this.

Each of the source images is transformed with the appropriate correction
factor, then the mosaic is reassembled. @out is #VIPS_FORMAT_FLOAT, but
if @int_output is set, the output image is the same format as the input
images.

There are some conditions that must be met before this operation can work:
the source images must all be present under the filenames recorded in the
history on @in, and the mosaic must have been built using only operations in
this package.

See also: vips_remosaic().</doc>
        <source-position filename="libvips/include/vips/mosaicing.h"
                         line="64"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/global_balance.c"
               line="1993">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/global_balance.c"
                 line="1958">mosaic to rebuild</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/global_balance.c"
                 line="1959">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/global_balance.c"
                 line="1960">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="grid" c:identifier="vips_grid" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/grid.c"
             line="234">Chop a tall thin image up into a set of tiles, lay the tiles out in a grid.

The input image should be a very tall, thin image containing a list of
smaller images. Volumetric or time-sequence images are often laid out like
this. This image is chopped into a series of tiles, each @tile_height
pixels high and the width of @in. The tiles are then rearranged into a grid
@across tiles across and @down tiles down in row-major order.

Supplying @tile_height, @across and @down is not strictly necessary, we
only really need two of these. Requiring three is a double-check that the
image has the expected geometry.

See also: vips_embed(), vips_insert(), vips_join().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="193"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/grid.c"
               line="257">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/grid.c"
                 line="236">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/grid.c"
                 line="237">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="tile_height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/grid.c"
                 line="238">chop into tiles this high</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="across" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/grid.c"
                 line="239">tiles across</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="down" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/grid.c"
                 line="240">tiles down</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/grid.c"
                 line="241">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="guess_format" c:identifier="vips_image_guess_format">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="479">Return the #VipsBandFormat for an image, guessing a sane value if
the set value looks crazy.

For example, for a float image tagged as rgb16, we'd return ushort.</doc>
        <source-position filename="libvips/include/vips/header.h" line="200"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="488">a sensible #VipsBandFormat for the image.</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="481">image to guess for</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="guess_interpretation"
              c:identifier="vips_image_guess_interpretation">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="663">Return the #VipsInterpretation for an image, guessing a sane value if
the set value looks crazy.</doc>
        <source-position filename="libvips/include/vips/header.h" line="206"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="670">a sensible #VipsInterpretation for the image.</doc>
          <type name="Interpretation" c:type="VipsInterpretation"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="665">image to guess for</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="hasalpha" c:identifier="vips_image_hasalpha">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3077">Look at an image's interpretation and see if it has extra alpha bands. For
example, a 4-band #VIPS_INTERPRETATION_sRGB would, but a six-band
#VIPS_INTERPRETATION_MULTIBAND would not.

Return %TRUE if @image has an alpha channel.</doc>
        <source-position filename="libvips/include/vips/image.h" line="541"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3079">image to check</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="heifsave" c:identifier="vips_heifsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2354">Optional arguments:

* @Q: %gint, quality factor
* @bitdepth: %gint, set write bit depth to 8, 10, or 12 bits
* @lossless: %gboolean, enable lossless encoding
* @compression: #VipsForeignHeifCompression, write with this compression
* @effort: %gint, encoding effort
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode
* @encoder: #VipsForeignHeifEncoder, select encoder to use

Write a VIPS image to a file in HEIF format.

Use @Q to set the compression factor. Default 50, which seems to be roughly
what the iphone uses. Q 30 gives about the same quality as JPEG Q 75.

Set @lossless %TRUE to switch to lossless compression.

Use @compression to set the compression format e.g. HEVC, AVC, AV1 to use. It defaults to AV1
if the target filename ends with ".avif", otherwise HEVC.

Use @effort to control the CPU effort spent improving compression.
This is currently only applicable to AV1 encoders. Defaults to 4, 0 is
fastest, 9 is slowest.

Chroma subsampling is normally automatically disabled for Q &gt;= 90. You can
force the subsampling mode with @subsample_mode.

Use @bitdepth to set the bitdepth of the output file. HEIC supports at
least 8, 10 and 12 bits; other codecs may support more or fewer options.

Use @encoder to set the encode library to use, e.g. aom, SVT-AV1, rav1e etc.

See also: vips_image_write_to_file(), vips_heifload().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="858"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2394">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2356">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2357">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2358">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="heifsave_buffer"
              c:identifier="vips_heifsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2409">Optional arguments:

* @Q: %gint, quality factor
* @bitdepth: %gint, set write bit depth to 8, 10, or 12 bits
* @lossless: %gboolean, enable lossless encoding
* @compression: #VipsForeignHeifCompression, write with this compression
* @effort: %gint, encoding effort
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode
* @encoder: #VipsForeignHeifEncoder, select encoder to use

As vips_heifsave(), but save to a memory buffer.

The address of the buffer is returned in @obuf, the length of the buffer in
@olen. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_heifsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="861"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2434">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2411">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2412">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2413">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2414">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="heifsave_target"
              c:identifier="vips_heifsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2464">Optional arguments:

* @Q: %gint, quality factor
* @bitdepth: %gint, set write bit depth to 8, 10, or 12 bits
* @lossless: %gboolean, enable lossless encoding
* @compression: #VipsForeignHeifCompression, write with this compression
* @effort: %gint, encoding effort
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode
* @encoder: #VipsForeignHeifEncoder, select encoder to use

As vips_heifsave(), but save to a target.

See also: vips_heifsave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="864"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2484">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2466">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2467">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2468">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_cum" c:identifier="vips_hist_cum" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/hist_cum.c"
             line="169">Form cumulative histogram.

See also: vips_hist_norm().</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="51"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/hist_cum.c"
               line="179">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_cum.c"
                 line="171">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_cum.c"
                 line="172">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_cum.c"
                 line="173">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_entropy"
              c:identifier="vips_hist_entropy"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/hist_entropy.c"
             line="129">Estimate image entropy from a histogram. Entropy is calculated as:

|[
-sum(p * log2(p))
]|

where p is histogram-value / sum-of-histogram-values.</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="73"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/hist_entropy.c"
               line="143">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_entropy.c"
                 line="131">input histogram</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_entropy.c"
                 line="132">image entropy</doc>
            <type name="gdouble" c:type="double*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_entropy.c"
                 line="133">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_equal"
              c:identifier="vips_hist_equal"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/hist_equal.c"
             line="139">Optional arguments:

* @band: band to equalise

Histogram-equalise @in. Equalise using band @bandno, or if @bandno is -1,
equalise bands independently. The output format is always the same as the
input format.

See also:</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="57"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/hist_equal.c"
               line="155">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_equal.c"
                 line="141">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_equal.c"
                 line="142">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_equal.c"
                 line="143">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_find"
              c:identifier="vips_hist_find"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/hist_find.c"
             line="450">Optional arguments:

* @band: band to equalise

Find the histogram of @in. Find the histogram for band @band (producing a
one-band histogram), or for all bands (producing an n-band histogram) if
@band is -1.

char and uchar images are cast to uchar before histogramming, all other
image types are cast to ushort.

See also: vips_hist_find_ndim(), vips_hist_find_indexed().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="554"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/hist_find.c"
               line="469">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find.c"
                 line="452">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find.c"
                 line="453">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find.c"
                 line="454">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_find_indexed"
              c:identifier="vips_hist_find_indexed"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/hist_find_indexed.c"
             line="494">Optional arguments:

* @combine: #VipsCombine, combine bins like this

Make a histogram of @in, but use image @index to pick the bins. In other
words, element zero in @out contains the combination of all the pixels in @in
whose corresponding pixel in @index is zero.

char and uchar @index images are cast to uchar before histogramming, all
other image types are cast to ushort. @index must have just one band.

@in must be non-complex.

@out always has the same size and format as @in.

Normally, bins are summed, but you can use @combine to set other combine
modes.

This operation is useful in conjunction with vips_labelregions(). You can
use it to find the centre of gravity of blobs in an image, for example.

See also: vips_hist_find(), vips_labelregions().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="560"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/hist_find_indexed.c"
               line="524">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find_indexed.c"
                 line="496">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find_indexed.c"
                 line="497">input index #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find_indexed.c"
                 line="498">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find_indexed.c"
                 line="499">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_find_ndim"
              c:identifier="vips_hist_find_ndim"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/hist_find_ndim.c"
             line="332">Optional arguments:

* @bins: number of bins to make on each axis

Make a one, two or three dimensional histogram of a 1, 2 or
3 band image. Divide each axis into @bins bins .. ie.
output is 1 x bins, bins x bins, or bins x bins x bins bands.
@bins defaults to 10.

char and uchar images are cast to uchar before histogramming, all other
image types are cast to ushort.

See also: vips_hist_find(), vips_hist_find_indexed().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="557"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/hist_find_ndim.c"
               line="352">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find_ndim.c"
                 line="334">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find_ndim.c"
                 line="335">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hist_find_ndim.c"
                 line="336">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_ismonotonic"
              c:identifier="vips_hist_ismonotonic"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/hist_ismonotonic.c"
             line="136">Test @in for monotonicity. @out is set non-zero if @in is monotonic.</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="70"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/hist_ismonotonic.c"
               line="144">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_ismonotonic.c"
                 line="138">lookup-table to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_ismonotonic.c"
                 line="139">set non-zero if @in is monotonic</doc>
            <type name="gboolean" c:type="gboolean*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_ismonotonic.c"
                 line="140">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_local"
              c:identifier="vips_hist_local"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/hist_local.c"
             line="399">Optional arguments:

* @max_slope: maximum brightening

Performs local histogram equalisation on @in using a
window of size @width by @height centered on the input pixel.

The output image is the same size as the input image. The edge pixels are
created by mirroring the input image outwards.

If @max_slope is greater than 0, it sets the maximum value for the slope of
the cumulative histogram, that is, the maximum brightening that is
performed. A value of 3 is often used. Local histogram equalization with
contrast limiting is usually called CLAHE.

See also: vips_hist_equal().</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="66"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/hist_local.c"
               line="424">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_local.c"
                 line="401">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_local.c"
                 line="402">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_local.c"
                 line="403">width of region</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_local.c"
                 line="404">height of region</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_local.c"
                 line="405">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_match"
              c:identifier="vips_hist_match"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/hist_match.c"
             line="178">Adjust @in to match @ref. If @in and @ref are normalised
cumulative histograms, @out will be a LUT that adjusts the PDF of the image
from which @in was made to match the PDF of @ref's image.

See also: vips_maplut(), vips_hist_find(), vips_hist_norm(),
vips_hist_cum().</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="63"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/hist_match.c"
               line="192">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_match.c"
                 line="180">input histogram</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ref" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_match.c"
                 line="181">reference histogram</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_match.c"
                 line="182">output histogram</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_match.c"
                 line="183">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_norm"
              c:identifier="vips_hist_norm"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/hist_norm.c"
             line="158">Normalise histogram. The maximum of each band becomes equal to the maximum
index, so for example the max for a uchar image becomes 255.
Normalise each band separately.

See also: vips_hist_cum().</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="54"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/hist_norm.c"
               line="170">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_norm.c"
                 line="160">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_norm.c"
                 line="161">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_norm.c"
                 line="162">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hist_plot"
              c:identifier="vips_hist_plot"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/hist_plot.c"
             line="350">Plot a 1 by any or any by 1 image file as a max by any or
any by max image using these rules:

&lt;emphasis&gt;unsigned char&lt;/emphasis&gt; max is always 256

&lt;emphasis&gt;other unsigned integer types&lt;/emphasis&gt; output 0 - maximum
value of @in.

&lt;emphasis&gt;signed int types&lt;/emphasis&gt; min moved to 0, max moved to max + min.

&lt;emphasis&gt;float types&lt;/emphasis&gt; min moved to 0, max moved to any
(square output)</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="60"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/hist_plot.c"
               line="369">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_plot.c"
                 line="352">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_plot.c"
                 line="353">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/hist_plot.c"
                 line="354">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="history_args" c:identifier="vips_image_history_args">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="2223">Formats the name/argv as a single string and calls
vips_image_history_printf(). A
convenience function for command-line prorams.

See also: vips_image_get_history().</doc>
        <source-position filename="libvips/include/vips/header.h" line="320"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="2236">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2225">image to attach history line to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2226">program name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="argc" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2227">number of program arguments</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="argv" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2228">program arguments</doc>
            <array length="1" zero-terminated="0" c:type="char**">
              <type name="utf8"/>
            </array>
          </parameter>
        </parameters>
      </method>
      <method name="history_printf"
              c:identifier="vips_image_history_printf"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="2163">Add a line to the image history. The @format and arguments are expanded, the
date and time is appended prefixed with a hash character, and the whole
string is appended to the image history and terminated with a newline.

For example:

|[
vips_image_history_printf(image, "vips invert %s %s",
    in-&gt;filename, out-&gt;filename);
]|

Might add the string

|[
"vips invert /home/john/fred.v /home/john/jim.v # Fri Apr 3 23:30:35 2009\n"
]|

VIPS operations don't add history lines for you because a single action at
the application level might involve many VIPS operations. History must be
recorded by the application.</doc>
        <source-position filename="libvips/include/vips/header.h" line="317"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="2190">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2165">add history line to this image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2166">printf() format string</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2167">arguments to format string</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hough_circle"
              c:identifier="vips_hough_circle"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/hough_circle.c"
             line="262">Optional arguments:

* @scale: scale down dimensions by this much
* @min_radius: smallest radius to search for
* @max_radius: largest radius to search for

Find the circular Hough transform of an image. @in must be one band, with
non-zero pixels for image edges. @out is three-band, with the third channel
representing the detected circle radius. The operation scales the number of
votes by circle circumference so circles of differing size are given equal
weight.

The output pixel at (x, y, band) is the strength of the circle centred on
(x, y) and with radius (band).

Use @max_radius and @min_radius to set the range of radii to search for.

Use @scale to set how @in coordinates are scaled to @out coordinates. A
@scale of 3, for example, will make @out 1/3rd of the width and height of
@in, and reduce the number of radii tested (and hence the number of bands
int @out) by a factor of three as well.

See also: vips_hough_line().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="567"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/hough_circle.c"
               line="292">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hough_circle.c"
                 line="264">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hough_circle.c"
                 line="265">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hough_circle.c"
                 line="266">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="hough_line"
              c:identifier="vips_hough_line"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/hough_line.c"
             line="168">Optional arguments:

* @width: horizontal size of parameter space
* @height: vertical size of parameter space

Find the line Hough transform for @in. @in must have one band. @out has one
band, with pixels being the number of votes for that line. The X dimension
of @out is the line angle in 0 - 180 degrees, the Y dimension is the
distance of the closest part of that line to the origin in the top-left.

Use @width @height to set the size of the parameter space image (@out),
that is, how accurate the line determination should be.

See also: vips_hough_circle().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="564"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/hough_line.c"
               line="189">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hough_line.c"
                 line="170">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hough_line.c"
                 line="171">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/hough_line.c"
                 line="172">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="icc_ac2rc" c:identifier="vips_icc_ac2rc">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="1281">Transform an image from absolute to relative colorimetry using the
MediaWhitePoint stored in the ICC profile.

See also: vips_icc_transform(), vips_icc_import().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="223"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/icc_transform.c"
               line="1292">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1283">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1284">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="profile_filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1285">use this profile</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="icc_export"
              c:identifier="vips_icc_export"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="1476">Optional arguments:

* @pcs: #VipsPCS,  use XYZ or LAB PCS
* @intent: #VipsIntent, transform with this intent
* @black_point_compensation: %gboolean, enable black point compensation
* @output_profile: %gchararray, get the output profile from here
* @depth: %gint, depth of output image in bits

Export an image from D65 LAB to device space with an ICC profile.
If @pcs is
set to #VIPS_PCS_XYZ, use CIE XYZ PCS instead.
If @output_profile is not set, use the embedded profile, if any.
If @output_profile is set, export with that and attach it to the output
image.

If @black_point_compensation is set, LCMS black point compensation is
enabled.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="220"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/icc_transform.c"
               line="1500">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1478">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1479">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1480">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="icc_import"
              c:identifier="vips_icc_import"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="1427">Optional arguments:

* @pcs: #VipsPCS,  use XYZ or LAB PCS
* @intent: #VipsIntent, transform with this intent
* @black_point_compensation: %gboolean, enable black point compensation
* @embedded: %gboolean, use profile embedded in input image
* @input_profile: %gchararray, get the input profile from here

Import an image from device space to D65 LAB with an ICC profile. If @pcs is
set to #VIPS_PCS_XYZ, use CIE XYZ PCS instead.

The input profile is searched for in three places:

  1. If @embedded is set, libvips will try to use any profile in the input
  image metadata. You can test for the presence of an embedded profile
  with vips_image_get_typeof() with #VIPS_META_ICC_NAME as an argument.
  This will return %GType 0 if there is no profile.

  2. Otherwise, if @input_profile is set, libvips will try to load a
  profile from the named file. This can aslso be the name of one of the
  built-in profiles.

  3. Otherwise, libvips will try to pick a compatible profile from the set
  of built-in profiles.

If @black_point_compensation is set, LCMS black point compensation is
enabled.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="217"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/icc_transform.c"
               line="1461">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1429">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1430">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1431">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="icc_transform"
              c:identifier="vips_icc_transform"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="1515">Optional arguments:

* @pcs: #VipsPCS,  use XYZ or LAB PCS
* @intent: #VipsIntent, transform with this intent
* @black_point_compensation: %gboolean, enable black point compensation
* @embedded: %gboolean, use profile embedded in input image
* @input_profile: %gchararray, get the input profile from here
* @depth: %gint, depth of output image in bits

Transform an image with a pair of ICC profiles. The input image is moved to
profile-connection space with the input profile and then to the output
space with the output profile.

The input profile is searched for in three places:

  1. If @embedded is set, libvips will try to use any profile in the input
  image metadata. You can test for the presence of an embedded profile
  with vips_image_get_typeof() with #VIPS_META_ICC_NAME as an argument.
  This will return %GType 0 if there is no profile.

  2. Otherwise, if @input_profile is set, libvips will try to load a
  profile from the named file. This can aslso be the name of one of the
  built-in profiles.

  3. Otherwise, libvips will try to pick a compatible profile from the set
  of built-in profiles.

If @black_point_compensation is set, LCMS black point compensation is
enabled.

@depth defaults to 8, or 16 if @in is a 16-bit image.

The output image has the output profile attached to the #VIPS_META_ICC_NAME
field.

Use vips_icc_import() and vips_icc_export() to do either the first or
second half of this operation in isolation.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="213"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/icc_transform.c"
               line="1560">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1517">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1518">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="output_profile" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1519">get the output profile from here</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/icc_transform.c"
                 line="1520">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="imag" c:identifier="vips_imag" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="844">Perform #VIPS_OPERATION_COMPLEXGET_IMAG on an image. See vips_complexget().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="341"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="852">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="846">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="847">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="848">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="init_fields" c:identifier="vips_image_init_fields">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1073">A convenience function to set the header fields after creating an image.
Normally you copy the fields from your input images with
vips_image_pipelinev() and then make
any adjustments you need, but if you are creating an image from scratch,
for example vips_black() or vips_jpegload(), you do need to set all the
fields yourself.

See also: vips_image_pipelinev().</doc>
        <source-position filename="libvips/include/vips/header.h" line="239"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1075">image to init</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="xsize" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1076">image width</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="ysize" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1077">image height</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="bands" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1078">image bands</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="format" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1079">band format</doc>
            <type name="BandFormat" c:type="VipsBandFormat"/>
          </parameter>
          <parameter name="coding" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1080">image coding</doc>
            <type name="Coding" c:type="VipsCoding"/>
          </parameter>
          <parameter name="interpretation" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1081">image type</doc>
            <type name="Interpretation" c:type="VipsInterpretation"/>
          </parameter>
          <parameter name="xres" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1082">horizontal resolution, pixels per millimetre</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="yres" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1083">vertical resolution, pixels per millimetre</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </method>
      <method name="inplace" c:identifier="vips_image_inplace">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3556">Gets @image ready for an in-place operation, such as vips_draw_circle().
After calling this function you can both read and write the image with
VIPS_IMAGE_ADDR().

This method is called for you by the base class of the draw operations,
there's no need to call it yourself.

Since this function modifies @image, it is not thread-safe. Only call it on
images which you are sure have not been shared with another thread.
All in-place operations are inherently not thread-safe, so you need to take
great care in any case.

See also: vips_draw_circle(), vips_image_wio_input().</doc>
        <source-position filename="libvips/include/vips/image.h" line="552"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3574">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3558">image to make read-write</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="insert" c:identifier="vips_insert" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/insert.c"
             line="514">Optional arguments:

* @expand: expand output to hold whole of both images
* @background: colour for new pixels

Insert @sub into @main at position @x, @y.

Normally @out shows the whole of @main. If @expand is #TRUE then @out is
made large enough to hold all of @main and @sub.
Any areas of @out not coming from
either @main or @sub are set to @background (default 0).

If @sub overlaps @main,
@sub will appear on top of @main.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common type (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;).

See also: vips_join(), vips_embed(), vips_extract_area().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="165"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/insert.c"
               line="549">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="main" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/insert.c"
                 line="516">big image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="sub" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/insert.c"
                 line="517">small image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/insert.c"
                 line="518">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/insert.c"
                 line="519">left position of @sub</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/insert.c"
                 line="520">top position of @sub</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/insert.c"
                 line="521">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="invalidate_all" c:identifier="vips_image_invalidate_all">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1393">Invalidate all pixel caches on @image and any downstream images, that
is, images which depend on this image. Additionally, all operations which
depend upon this image are dropped from the VIPS operation cache.

You should call this function after
destructively modifying an image with something like vips_draw_circle().

The #VipsImage::invalidate signal is emitted for all invalidated images.

See also: vips_region_invalidate().</doc>
        <source-position filename="libvips/include/vips/image.h" line="439"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1395">#VipsImage to invalidate</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="invert" c:identifier="vips_invert" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/invert.c"
             line="190">For unsigned formats, this operation calculates (max - @in), eg. (255 -
@in) for uchar. For signed and float formats, this operation calculates (-1
@in).

For complex images, only the real part is inverted. See also vips_conj().

See also: vips_linear().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="228"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/invert.c"
               line="204">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/invert.c"
                 line="192">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/invert.c"
                 line="193">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/invert.c"
                 line="194">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="invertlut"
              c:identifier="vips_invertlut"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/create/invertlut.c"
             line="307">Optional arguments:

* @size: generate this much

Given a mask of target values and real values, generate a LUT which
will map reals to targets. Handy for linearising images from
measurements of a colour chart. All values in [0,1]. Piecewise linear
interpolation, extrapolate head and tail to 0 and 1.

Eg. input like this:

  &lt;tgroup cols='4' align='left' colsep='1' rowsep='1'&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;4&lt;/entry&gt;
        &lt;entry&gt;3&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;0.1&lt;/entry&gt;
        &lt;entry&gt;0.2&lt;/entry&gt;
        &lt;entry&gt;0.3&lt;/entry&gt;
        &lt;entry&gt;0.1&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;0.2&lt;/entry&gt;
        &lt;entry&gt;0.4&lt;/entry&gt;
        &lt;entry&gt;0.4&lt;/entry&gt;
        &lt;entry&gt;0.2&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;0.7&lt;/entry&gt;
        &lt;entry&gt;0.5&lt;/entry&gt;
        &lt;entry&gt;0.6&lt;/entry&gt;
        &lt;entry&gt;0.3&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;

Means a patch with 10% reflectance produces an image with 20% in
channel 1, 30% in channel 2, and 10% in channel 3, and so on.

Inputs don't need to be sorted (we do that). Generate any precision
LUT, default to 256 elements.

It won't work too well for non-monotonic camera responses
(we should fix this). Interpolation is simple piecewise linear; we ought to
do something better really.

See also: vips_buildlut().</doc>
        <source-position filename="libvips/include/vips/create.h" line="101"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/invertlut.c"
               line="363">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/create/invertlut.c"
                 line="309">input mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/create/invertlut.c"
                 line="310">output LUT</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/create/invertlut.c"
                 line="311">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="invfft" c:identifier="vips_invfft" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/freqfilt/invfft.c"
             line="283">Optional arguments:

* @real: only output the real part

Transform an image from Fourier space to real space. The result is complex.
If you are OK with a real result, set @real, it's quicker.

VIPS uses the fftw Fourier Transform library. If this library was not
available when VIPS was configured, these functions will fail.

See also: vips_fwfft().</doc>
        <source-position filename="libvips/include/vips/freqfilt.h" line="45"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/freqfilt/invfft.c"
               line="301">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/invfft.c"
                 line="285">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/invfft.c"
                 line="286">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/invfft.c"
                 line="287">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="isMSBfirst" c:identifier="vips_image_isMSBfirst">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3017">Return %TRUE if @image is in most-significant-
byte first form. This is the byte order used on the SPARC
architecture and others.</doc>
        <source-position filename="libvips/include/vips/image.h" line="535"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3019">image to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="is_sequential" c:identifier="vips_image_is_sequential">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1457">TRUE if any of the images upstream from @image were opened in sequential
mode. Some operations change behaviour slightly in sequential mode to
optimize memory behaviour.</doc>
        <source-position filename="libvips/include/vips/image.h" line="445"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1465">%TRUE if @image is in sequential mode.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1459">#VipsImage to minimise</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="isfile" c:identifier="vips_image_isfile">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3034">Return %TRUE if @image represents a file on disc in some way.</doc>
        <source-position filename="libvips/include/vips/image.h" line="537"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3036">image to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="iskilled" c:identifier="vips_image_iskilled">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1632">If @image has been killed (see vips_image_set_kill()), set an error message,
clear the #VipsImage.kill flag and return %TRUE. Otherwise return %FALSE.

Handy for loops which need to run sets of threads which can fail.

See also: vips_image_set_kill().</doc>
        <source-position filename="libvips/include/vips/image.h" line="450"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1643">%TRUE if @image has been killed.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1634">image to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="ispartial" c:identifier="vips_image_ispartial">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3062">Return %TRUE if @im represents a partial image (a delayed calculation).</doc>
        <source-position filename="libvips/include/vips/image.h" line="539"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3064">image to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="jp2ksave" c:identifier="vips_jp2ksave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/jp2ksave.c"
             line="1440">Optional arguments:

* @Q: %gint, quality factor
* @lossless: %gboolean, enables lossless compression
* @tile_width: %gint for tile size
* @tile_height: %gint for tile size
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode

Write a VIPS image to a file in JPEG2000 format.
The saver supports 8, 16 and 32-bit int pixel
values, signed and unsigned. It supports greyscale, RGB, CMYK and
multispectral images.

Use @Q to set the compression quality factor. The default value
produces file with approximately the same size as regular JPEG Q 75.

Set @lossless to enable lossless compression.

Use @tile_width and @tile_height to set the tile size. The default is 512.

Chroma subsampling is normally disabled for compatibility. Set
@subsample_mode to auto to enable chroma subsample for Q &lt; 90. Subsample
mode uses YCC rather than RGB colourspace, and many jpeg2000 decoders do
not support this.

This operation always writes a pyramid.

See also: vips_image_write_to_file(), vips_jp2kload().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="887"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2ksave.c"
               line="1475">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1442">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1443">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1444">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jp2ksave_buffer"
              c:identifier="vips_jp2ksave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/jp2ksave.c"
             line="1490">Optional arguments:

* @Q: %gint, quality factor
* @lossless: %gboolean, enables lossless compression
* @tile_width: %gint for tile size
* @tile_height: %gint for tile size
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode

As vips_jp2ksave(), but save to a target.

See also: vips_jp2ksave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="890"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2ksave.c"
               line="1509">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1492">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1493">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1494">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1495">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jp2ksave_target"
              c:identifier="vips_jp2ksave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/jp2ksave.c"
             line="1539">Optional arguments:

* @Q: %gint, quality factor
* @lossless: %gboolean, enables lossless compression
* @tile_width: %gint for tile size
* @tile_height: %gint for tile size
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode

As vips_jp2ksave(), but save to a target.

See also: vips_jp2ksave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="893"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2ksave.c"
               line="1557">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1541">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1542">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jp2ksave.c"
                 line="1543">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jpegsave" c:identifier="vips_jpegsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/jpegsave.c"
             line="522">Optional arguments:

* @Q: %gint, quality factor
* @optimize_coding: %gboolean, compute optimal Huffman coding tables
* @interlace: %gboolean, write an interlaced (progressive) jpeg
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode
* @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block
* @overshoot_deringing: %gboolean, overshoot samples with extreme values
* @optimize_scans: %gboolean, split DCT coefficients into separate scans
* @quant_table: %gint, quantization table index
* @restart_interval: %gint, restart interval in mcu

Write a VIPS image to a file as JPEG.

Use @Q to set the JPEG compression factor. Default 75.

If @optimize_coding is set, the Huffman tables are optimized. This is
slightly slower and produces slightly smaller files.

If @interlace is set, the jpeg files will be interlaced (progressive jpeg,
in jpg parlance). These files may be better for display over a slow network
connection, but need much more memory to encode and decode.

Chroma subsampling is normally automatically disabled for Q &gt;= 90. You can
force the subsampling mode with @subsample_mode.

If @trellis_quant is set and the version of libjpeg supports it
(e.g. mozjpeg &gt;= 3.0), apply trellis quantisation to each 8x8 block.
Reduces file size but increases compression time.

If @overshoot_deringing is set and the version of libjpeg supports it
(e.g. mozjpeg &gt;= 3.0), apply overshooting to samples with extreme values
for example 0 and 255 for 8-bit. Overshooting may reduce ringing artifacts
from compression, in particular in areas where black text appears on a
white background.

If @optimize_scans is set and the version of libjpeg supports it
(e.g. mozjpeg &gt;= 3.0), split the spectrum of DCT coefficients into
separate scans. Reduces file size but increases compression time.

If @quant_table is set and the version of libjpeg supports it
(e.g. mozjpeg &gt;= 3.0) it selects the quantization table to use:

* 0 — Tables from JPEG Annex K (vips and libjpeg default)
* 1 — Flat table
* 2 — Table tuned for MSSIM on Kodak image set
* 3 — Table from ImageMagick by N. Robidoux (current mozjpeg default)
* 4 — Table tuned for PSNR-HVS-M on Kodak image set
* 5 — Table from Relevance of Human Vision to JPEG-DCT Compression (1992)
* 6 — Table from DCTune Perceptual Optimization of Compressed Dental
  X-Rays (1997)
* 7 — Table from A Visual Detection Model for DCT Coefficient
  Quantization (1993)
* 8 — Table from An Improved Detection Model for DCT Coefficient
  Quantization (1993)

Quantization table 0 is the default in vips and libjpeg(-turbo), but it
tends to favor detail over color accuracy, producing colored patches and
stripes as well as heavy banding in flat areas at high compression ratios.
Quantization table 2 is a good candidate to try if the default quantization
table produces banding or color shifts and is well suited for hires images.
Quantization table 3 is the default in mozjpeg and has been tuned to produce
good results at the default quality setting; banding at high compression.
Quantization table 4 is the most accurate at the cost of compression ratio.
Tables 5-7 are based on older research papers, but generally achieve worse
compression ratios and/or quality than 2 or 4.

For maximum compression with mozjpeg, a useful set of options is `strip,
optimize-coding, interlace, optimize-scans, trellis-quant, quant_table=3`.

By default, the output stream won't have restart markers.  If a non-zero
restart_interval is specified, a restart marker will be added after each
specified number of MCU blocks.  This makes the stream more recoverable
if there are transmission errors, but also allows for some decoders to read
part of the JPEG without decoding the whole stream.

The image is automatically converted to RGB, Monochrome or CMYK before
saving.

EXIF data is constructed from #VIPS_META_EXIF_NAME, then
modified with any other related tags on the image before being written to
the file. #VIPS_META_RESOLUTION_UNIT is used to set the EXIF resolution
unit. #VIPS_META_ORIENTATION is used to set the EXIF orientation tag.

IPTC as #VIPS_META_IPTC_NAME and XMP as #VIPS_META_XMP_NAME
are coded and attached.

See also: vips_jpegsave_buffer(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="491"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegsave.c"
               line="617">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="524">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="525">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="526">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jpegsave_buffer"
              c:identifier="vips_jpegsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/jpegsave.c"
             line="669">Optional arguments:

* @Q: %gint, quality factor
* @optimize_coding: %gboolean, compute optimal Huffman coding tables
* @interlace: %gboolean, write an interlaced (progressive) jpeg
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode
* @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block
* @overshoot_deringing: %gboolean, overshoot samples with extreme values
* @optimize_scans: %gboolean, split DCT coefficients into separate scans
* @quant_table: %gint, quantization table index
* @restart_interval: %gint, restart interval in mcu

As vips_jpegsave(), but save to a memory buffer.

The address of the buffer is returned in @obuf, the length of the buffer in
@olen. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_jpegsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="494"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegsave.c"
               line="696">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="671">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="672">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="673">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="674">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jpegsave_mime"
              c:identifier="vips_jpegsave_mime"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/jpegsave.c"
             line="726">Optional arguments:

* @Q: %gint, quality factor
* @optimize_coding: %gboolean, compute optimal Huffman coding tables
* @interlace: %gboolean, write an interlaced (progressive) jpeg
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode
* @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block
* @overshoot_deringing: %gboolean, overshoot samples with extreme values
* @optimize_scans: %gboolean, split DCT coefficients into separate scans
* @quant_table: %gint, quantization table index
* @restart_interval: %gint, restart interval in mcu

As vips_jpegsave(), but save as a mime jpeg on stdout.

See also: vips_jpegsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="497"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegsave.c"
               line="747">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="728">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="729">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jpegsave_target"
              c:identifier="vips_jpegsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/jpegsave.c"
             line="632">Optional arguments:

* @Q: %gint, quality factor
* @optimize_coding: %gboolean, compute optimal Huffman coding tables
* @interlace: %gboolean, write an interlaced (progressive) jpeg
* @subsample_mode: #VipsForeignSubsample, chroma subsampling mode
* @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block
* @overshoot_deringing: %gboolean, overshoot samples with extreme values
* @optimize_scans: %gboolean, split DCT coefficients into separate scans
* @quant_table: %gint, quantization table index
* @restart_interval: %gint, restart interval in mcu

As vips_jpegsave(), but save to a target.

See also: vips_jpegsave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="488"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegsave.c"
               line="654">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="634">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="635">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/jpegsave.c"
                 line="636">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jxlsave" c:identifier="vips_jxlsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2581">Optional arguments:

* @tier: %gint, decode speed tier
* @distance: %gdouble, maximum encoding error
* @effort: %gint, encoding effort
* @lossless: %gboolean, enables lossless compression
* @Q: %gint, quality setting

Write a VIPS image to a file in JPEG-XL format.

The JPEG-XL loader and saver are experimental features and may change
in future libvips versions.

@tier sets the overall decode speed the encoder will target. Minimum is 0
(highest quality), and maximum is 4 (lowest quality). Default is 0.

@distance sets the target maximum encoding error. Minimum is 0
(highest quality), and maximum is 15 (lowest quality). Default is 1.0
(visually lossless).

As a convenience, you can also use @Q to set @distance. @Q uses
approximately the same scale as regular JPEG.

Set @lossless to enable lossless compression.</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="906"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2612">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2583">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2584">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2585">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jxlsave_buffer"
              c:identifier="vips_jxlsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2627">Optional arguments:

* @tier: %gint, decode speed tier
* @distance: %gdouble, maximum encoding error
* @effort: %gint, encoding effort
* @lossless: %gboolean, enables lossless compression
* @Q: %gint, quality setting

As vips_jxlsave(), but save to a memory buffer.

See also: vips_jxlsave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="909"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2646">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2629">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2630">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2631">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2632">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="jxlsave_target"
              c:identifier="vips_jxlsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2676">Optional arguments:

* @tier: %gint, decode speed tier
* @distance: %gdouble, maximum encoding error
* @effort: %gint, encoding effort
* @lossless: %gboolean, enables lossless compression
* @Q: %gint, quality setting

As vips_jxlsave(), but save to a target.

See also: vips_jxlsave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="912"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2694">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2678">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2679">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/foreign.c"
                 line="2680">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="labelregions"
              c:identifier="vips_labelregions"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/morphology/labelregions.c"
             line="142">Optional arguments:

* @segments: return number of regions found here

Repeatedly scans @in for regions of 4-connected pixels
with the same pixel value. Every time a region is discovered, those
pixels are marked in @mask with a unique serial number. Once all pixels
have been labelled, the operation returns, setting @segments to the number
of discrete regions which were detected.

@mask is always a 1-band #VIPS_FORMAT_INT image of the same dimensions as
@in.

This operation is useful for, for example, blob counting. You can use the
morphological operators to detect and isolate a series of objects, then use
vips_labelregions() to number them all.

Use vips_hist_find_indexed() to (for example) find blob coordinates.

See also: vips_hist_find_indexed().</doc>
        <source-position filename="libvips/include/vips/morphology.h"
                         line="63"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/morphology/labelregions.c"
               line="169">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/labelregions.c"
                 line="144">image to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/labelregions.c"
                 line="145">write labelled regions here</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/labelregions.c"
                 line="146">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="less_const"
              c:identifier="vips_less_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="740">Perform #VIPS_OPERATION_RELATIONAL_LESS on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="383"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="751">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="742">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="743">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="744">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="745">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="746">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="less_const1"
              c:identifier="vips_less_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="929">Perform #VIPS_OPERATION_RELATIONAL_LESS on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="409"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="939">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="931">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="932">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="933">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="934">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="lesseq_const"
              c:identifier="vips_lesseq_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="767">Perform #VIPS_OPERATION_RELATIONAL_LESSEQ on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="387"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="778">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="769">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="770">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="771">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="772">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="773">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="lesseq_const1"
              c:identifier="vips_lesseq_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="955">Perform #VIPS_OPERATION_RELATIONAL_LESSEQ on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="412"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="965">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="957">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="958">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="959">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="960">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="linear" c:identifier="vips_linear" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/linear.c"
             line="499">Optional arguments:

* @uchar: output uchar pixels

Pass an image through a linear transform, ie. (@out = @in * @a + @b). Output
is float for integer input, double for double input, complex for
complex input and double complex for double complex input. Set @uchar to
output uchar pixels.

If the arrays of constants have just one element, that constant is used for
all image bands. If the arrays have more than one element and they have
the same number of elements as there are bands in the image, then
one array element is used for each band. If the arrays have more than one
element and the image only has a single band, the result is a many-band
image where each band corresponds to one array element.

See also: vips_linear1(), vips_add().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="210"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/linear.c"
               line="526">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="501">image to transform</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="502">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="a" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="503">array of constants for multiplication</doc>
            <array length="3" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="504">array of constants for addition</doc>
            <array length="3" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="505">length of constant arrays</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="506">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="linear1" c:identifier="vips_linear1" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/linear.c"
             line="542">Optional arguments:

* @uchar: output uchar pixels

Run vips_linear() with a single constant.

See also: vips_linear().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="214"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/linear.c"
               line="558">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="544">image to transform</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="545">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="a" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="546">constant for multiplication</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="547">constant for addition</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/linear.c"
                 line="548">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="linecache"
              c:identifier="vips_linecache"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/tilecache.c"
             line="992">Optional arguments:

* @access: hint expected access pattern #VipsAccess
* @tile_height: height of tiles in cache
* @threaded: allow many threads

This operation behaves rather like vips_copy() between images
@in and @out, except that it keeps a cache of computed scanlines.

The number of lines cached is enough for a small amount of non-local
access.

Each cache tile is made with a single call to
vips_region_prepare().

When the cache fills, a tile is chosen for reuse. If @access is
#VIPS_ACCESS_RANDOM, then the least-recently-used tile is reused. If
@access is #VIPS_ACCESS_SEQUENTIAL, then
the top-most tile is reused. @access defaults to #VIPS_ACCESS_RANDOM.

@tile_height can be used to set the size of the strips that
vips_linecache() uses. The default is 1 (a single scanline).

Normally, only a single thread at once is allowed to calculate tiles. If
you set @threaded to %TRUE, vips_linecache() will allow many threads to
calculate tiles at once and share the cache between them.

See also: vips_cache(), vips_tilecache().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="144"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/tilecache.c"
               line="1027">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/tilecache.c"
                 line="994">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/tilecache.c"
                 line="995">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/tilecache.c"
                 line="996">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="log" c:identifier="vips_log" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="586">Perform #VIPS_OPERATION_MATH_LOG on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="287"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="594">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="588">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="589">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="590">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="log10" c:identifier="vips_log10" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="609">Perform #VIPS_OPERATION_MATH_LOG10 on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="290"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="617">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="611">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="612">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="613">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="lshift_const"
              c:identifier="vips_lshift_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="741">Perform #VIPS_OPERATION_BOOLEAN_LSHIFT on an image and an array of constants.
See vips_boolean_const().

See also: vips_boolean(), vips_boolean_const1().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="458"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="754">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="743">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="744">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="745">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="746">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="747">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="lshift_const1"
              c:identifier="vips_lshift_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="912">Perform #VIPS_OPERATION_BOOLEAN_LSHIFT on an image and a constant.
See vips_boolean_const1().

See also: vips_boolean(), vips_boolean_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="479"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="924">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="914">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="915">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="916">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="917">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="magicksave"
              c:identifier="vips_magicksave"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/magicksave.c"
             line="57">Optional arguments:

* @quality: %gint, quality factor
* @format: %gchararray, format to save as
* @optimize_gif_frames: %gboolean, apply GIF frames optimization
* @optimize_gif_transparency: %gboolean, apply GIF transparency optimization
* @bitdepth: %gint, number of bits per pixel

Write an image using libMagick.

Use @quality to set the quality factor. Default 0.

Use @format to explicitly set the save format, for example, "BMP". Otherwise
the format is guessed from the filename suffix.

If @optimize_gif_frames is set, GIF frames are cropped to the smallest size
while preserving the results of the GIF animation. This takes some time for
computation but saves some time on encoding and produces smaller files in
some cases.

If @optimize_gif_transparency is set, pixels that don't change the image
through animation are made transparent. This takes some time for computation
but saves some time on encoding and produces smaller files in some cases.

@bitdepth specifies the number of bits per pixel. The image will be quantized
and dithered if the value is within the valid range (1 to 8).

See also: vips_magicksave_buffer(), vips_magickload().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="692"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/magicksave.c"
               line="92">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/magicksave.c"
                 line="59">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/magicksave.c"
                 line="60">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/magicksave.c"
                 line="61">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="magicksave_buffer"
              c:identifier="vips_magicksave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/magicksave.c"
             line="107">Optional arguments:

* @quality: %gint, quality factor
* @format: %gchararray, format to save as
* @optimize_gif_frames: %gboolean, apply GIF frames optimization
* @optimize_gif_transparency: %gboolean, apply GIF transparency optimization
* @bitdepth: %gint, number of bits per pixel

As vips_magicksave(), but save to a memory buffer.

The address of the buffer is returned in @obuf, the length of the buffer in
@olen. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_magicksave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="695"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/magicksave.c"
               line="130">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/magicksave.c"
                 line="109">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/magicksave.c"
                 line="110">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/magicksave.c"
                 line="111">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/magicksave.c"
                 line="112">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="map" c:identifier="vips_image_map">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1488">This function calls @fn for every header field, including every item of
metadata.

Like all _map functions, the user function should return %NULL to continue
iteration, or a non-%NULL pointer to indicate early termination.

See also: vips_image_get_typeof(), vips_image_get().</doc>
        <source-position filename="libvips/include/vips/header.h" line="260"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1502">%NULL on success, the failing pointer otherwise.</doc>
          <type name="gpointer" c:type="void*"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1490">image to map over</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="fn" transfer-ownership="none" scope="call">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1491">function to call for each header field</doc>
            <type name="ImageMapFn" c:type="VipsImageMapFn"/>
          </parameter>
          <parameter name="a"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1492">user data for function</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </method>
      <method name="mapim" c:identifier="vips_mapim" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/mapim.c"
             line="596">Optional arguments:

* @interpolate: interpolate pixels with this
* @extend: #VipsExtend how to generate new pixels
* @background: #VipsArrayDouble colour for new pixels
* @premultiplied: %gboolean, images are already premultiplied

This operator resamples @in using @index to look up pixels. @out is
the same size as @index, with each pixel being fetched from that position in
@in. That is:

|[
out[x, y] = in[index[x, y]]
]|

If @index has one band, that band must be complex. Otherwise, @index must
have two bands of any format.

Coordinates in @index are in pixels, with (0, 0) being the top-left corner
of @in, and with y increasing down the image. Use vips_xyz() to build index
images.

@interpolate defaults to bilinear.

By default, new pixels are filled with @background. This defaults to
zero (black). You can set other extend types with @extend. #VIPS_EXTEND_COPY
is better for image upsizing.

Image are normally treated as unpremultiplied, so this operation can be used
directly on PNG images. If your images have been through vips_premultiply(),
set @premultiplied.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

See vips_maplut() for a 1D equivalent of this operation.

See also: vips_xyz(), vips_affine(), vips_resize(),
vips_maplut(), #VipsInterpolate.</doc>
        <source-position filename="libvips/include/vips/resample.h"
                         line="112"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/mapim.c"
               line="643">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/mapim.c"
                 line="598">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/mapim.c"
                 line="599">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/mapim.c"
                 line="600">index image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/mapim.c"
                 line="601">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="maplut" c:identifier="vips_maplut" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/maplut.c"
             line="775">Optional arguments:

* @band: apply one-band @lut to this band of @in

Map an image through another image acting as a LUT (Look Up Table).
The lut may have any type and the output image will be that type.

The input image will be cast to one of the unsigned integer types, that is,
VIPS_FORMAT_UCHAR, VIPS_FORMAT_USHORT or VIPS_FORMAT_UINT.

If @lut is too small for the input type (for example, if @in is
VIPS_FORMAT_UCHAR but @lut only has 100 elements), the lut is padded out
by copying the last element. Overflows are reported at the end of
computation.
If @lut is too large, extra values are ignored.

If @lut has one band and @band is -1 (the default), then all bands of @in
pass through @lut. If @band is &gt;= 0, then just that band of @in passes
through @lut and other bands are just copied.

If @lut
has same number of bands as @in, then each band is mapped
separately. If @in has one band, then @lut may have many bands and
the output will have the same number of bands as @lut.

See also: vips_hist_find(), vips_identity().</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="42"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/maplut.c"
               line="809">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/maplut.c"
                 line="777">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/maplut.c"
                 line="778">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="lut" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/maplut.c"
                 line="779">look-up table</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/maplut.c"
                 line="780">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="math" c:identifier="vips_math" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="279">Perform various functions in -lm, the maths library, on images.

Angles are expressed in degrees. The output type is float unless the
input is double, in which case the output is double.

Non-complex images only.

See also: vips_math2().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="259"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="295">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="281">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="282">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="math" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="283">math operation to perform</doc>
            <type name="OperationMath" c:type="VipsOperationMath"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="284">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="math2_const"
              c:identifier="vips_math2_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="504">This operation calculates various 2-ary maths operations on an image and
an array of constants and writes the result to @out.
The image may have any
non-complex format. @out is float except in the case that @in
is double, in which case @out is also double.

It detects division by zero, setting those pixels to zero in the output.
Beware: it does this silently!

If the array of constants has just one element, that constant is used for
all image bands. If the array has more than one element and they have
the same number of elements as there are bands in the image, then
one array element is used for each band. If the arrays have more than one
element and the image only has a single band, the result is a many-band
image where each band corresponds to one array element.

See also: vips_math2(), vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="499"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="531">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="506">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="507">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="math2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="508">math operation to perform</doc>
            <type name="OperationMath2" c:type="VipsOperationMath2"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="509">array of constants</doc>
            <array length="3" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="510">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="511">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="math2_const1"
              c:identifier="vips_math2_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="628">This operation calculates various 2-ary maths operations on an image and
a constant. See vips_math2_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="515"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="639">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="630">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="631">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="math2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="632">math operation to perform</doc>
            <type name="OperationMath2" c:type="VipsOperationMath2"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="633">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="634">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="matrixinvert"
              c:identifier="vips_matrixinvert"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/mosaicing/matrixinvert.c"
             line="460">This operation calculates the inverse of the matrix represented in @m.
The scale and offset members of the input matrix are ignored.

See also: vips_matrixload().</doc>
        <source-position filename="libvips/include/vips/mosaicing.h"
                         line="72"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/matrixinvert.c"
               line="471">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="m" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/matrixinvert.c"
                 line="462">matrix to invert</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/matrixinvert.c"
                 line="463">output matrix</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/matrixinvert.c"
                 line="464">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="matrixprint"
              c:identifier="vips_matrixprint"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/matrixsave.c"
             line="383">Print @in to %stdout in matrix format. See vips_matrixload() for a
description of the format.

See also: vips_matrixload().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="682"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixsave.c"
               line="393">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/matrixsave.c"
                 line="385">image to print</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/matrixsave.c"
                 line="386">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="matrixsave"
              c:identifier="vips_matrixsave"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/matrixsave.c"
             line="332">Write @in to @filename in matrix format. See vips_matrixload() for a
description of the format.

See also: vips_matrixload().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="676"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixsave.c"
               line="343">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/matrixsave.c"
                 line="334">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/matrixsave.c"
                 line="335">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/matrixsave.c"
                 line="336">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="matrixsave_target"
              c:identifier="vips_matrixsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/matrixsave.c"
             line="358">As vips_matrixsave(), but save to a target.

See also: vips_matrixsave().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="679"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixsave.c"
               line="368">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/matrixsave.c"
                 line="360">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/matrixsave.c"
                 line="361">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/matrixsave.c"
                 line="362">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="max" c:identifier="vips_max" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/max.c"
             line="507">Optional arguments:

* @x: horizontal position of maximum
* @y: vertical position of maximum
* @size: number of maxima to find
* @out_array: return array of maximum values
* @x_array: corresponding horizontal positions
* @y_array: corresponding vertical positions

This operation finds the maximum value in an image.

By default it finds the single largest value. If @size is set &gt;1, it will
find the @size largest values. It will stop searching early if has found
enough values.
Equal values will be sorted by y then x.

It operates on all
bands of the input image: use vips_stats() if you need to find an
maximum for each band.

For complex images, this operation finds the maximum modulus.

You can read out the position of the maximum with @x and @y. You can read
out arrays of the values and positions of the top @size maxima with
@out_array, @x_array and @y_array. These values are returned sorted from
largest to smallest.

If there are more than @size maxima, the maxima returned will be a random
selection of the maxima in the image.

See also: vips_min(), vips_stats().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="538"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/max.c"
               line="545">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/max.c"
                 line="509">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/max.c"
                 line="510">output pixel maximum</doc>
            <type name="gdouble" c:type="double*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/max.c"
                 line="511">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="measure" c:identifier="vips_measure" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/measure.c"
             line="254">Optional arguments:

* @left: area of image containing chart
* @top: area of image containing chart
* @width: area of image containing chart
* @height: area of image containing chart

Analyse a grid of colour patches, producing an array of patch averages.
The mask has a row for each measured patch and a column for each image
band. The operations issues a warning if any patch has a deviation more
than 20% of
the mean. Only the central 50% of each patch is averaged.

If the chart does not fill the whole image, use the optional @left, @top,
@width, @height arguments to indicate the
position of the chart.

See also: vips_avg(), vips_deviate().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="544"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/measure.c"
               line="281">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/measure.c"
                 line="256">image to measure</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/measure.c"
                 line="257">array of measurements</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="h" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/measure.c"
                 line="258">patches across chart</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="v" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/measure.c"
                 line="259">patches down chart</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/measure.c"
                 line="260">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="median" c:identifier="vips_median" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/morphology/rank.c"
             line="643">A convenience function equivalent to:

 vips_rank(in, out, size, size, (size * size) / 2);

See also: vips_rank().</doc>
        <source-position filename="libvips/include/vips/morphology.h"
                         line="56"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/morphology/rank.c"
               line="656">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="645">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="646">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="647">size of region</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="648">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="min" c:identifier="vips_min" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/min.c"
             line="507">Optional arguments:

* @x: horizontal position of minimum
* @y: vertical position of minimum
* @size: number of minima to find
* @out_array: return array of minimum values
* @x_array: corresponding horizontal positions
* @y_array: corresponding vertical positions

This operation finds the minimum value in an image.

By default it finds the single smallest value. If @size is set &gt;1, it will
find the @size smallest values. It will stop searching early if has found
enough values.
Equal values will be sorted by y then x.

It operates on all
bands of the input image: use vips_stats() if you need to find an
minimum for each band.

For complex images, this operation finds the minimum modulus.

You can read out the position of the minimum with @x and @y. You can read
out arrays of the values and positions of the top @size minima with
@out_array, @x_array and @y_array.
These values are returned sorted from
smallest to largest.

If there are more than @size minima, the minima returned will be a random
selection of the minima in the image.

See also: vips_min(), vips_stats().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="535"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/min.c"
               line="546">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/min.c"
                 line="509">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/min.c"
                 line="510">output pixel minimum</doc>
            <type name="gdouble" c:type="double*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/min.c"
                 line="511">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="minimise_all" c:identifier="vips_image_minimise_all">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1433">Minimise memory use on this image and any upstream images, that is, images
which this image depends upon. This function is called automatically at the
end of a computation, but it might be useful to call at other times.

The #VipsImage::minimise signal is emitted for all minimised images.</doc>
        <source-position filename="libvips/include/vips/image.h" line="442"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1435">#VipsImage to minimise</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="more_const"
              c:identifier="vips_more_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="794">Perform #VIPS_OPERATION_RELATIONAL_MORE on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="391"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="805">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="796">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="797">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="798">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="799">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="800">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="more_const1"
              c:identifier="vips_more_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="981">Perform #VIPS_OPERATION_RELATIONAL_MORE on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="415"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="991">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="983">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="984">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="985">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="986">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="moreeq_const"
              c:identifier="vips_moreeq_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="821">Perform #VIPS_OPERATION_RELATIONAL_MOREEQ on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="395"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="832">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="823">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="824">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="825">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="826">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="827">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="moreeq_const1"
              c:identifier="vips_moreeq_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="1007">Perform #VIPS_OPERATION_RELATIONAL_MOREEQ on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="418"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="1017">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="1009">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="1010">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="1011">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="1012">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="morph" c:identifier="vips_morph" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/morphology/morph.c"
             line="986">Performs a morphological operation on @in using @mask as a
structuring element.

The image should have 0 (black) for no object and 255
(non-zero) for an object. Note that this is the reverse of the usual
convention for these operations, but more convenient when combined with the
boolean operators. The output image is the same
size as the input image: edge pxels are made by expanding the input image
as necessary.

Mask coefficients can be either 0 (for object) or 255 (for background)
or 128 (for do not care).  The origin of the mask is at location
(m.xsize / 2, m.ysize / 2), integer division.  All algorithms have been
based on the book "Fundamentals of Digital Image Processing" by A. Jain,
pp 384-388, Prentice-Hall, 1989.

For #VIPS_OPERATION_MORPHOLOGY_ERODE,
the whole mask must match for the output pixel to be
set, that is, the result is the logical AND of the selected input pixels.

For #VIPS_OPERATION_MORPHOLOGY_DILATE,
the output pixel is set if any part of the mask
matches, that is, the result is the logical OR of the selected input pixels.

See the boolean operations vips_andimage(), vips_orimage() and
vips_eorimage()
for analogues of the usual set difference and set union operations.

Operations are performed using the processor's vector unit,
if possible. Disable this with `--vips-novector` or `VIPS_NOVECTOR` or
vips_vector_set_enabled()</doc>
        <source-position filename="libvips/include/vips/morphology.h"
                         line="48"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/morphology/morph.c"
               line="1026">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/morph.c"
                 line="988">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/morphology/morph.c"
                 line="989">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="mask" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/morph.c"
                 line="990">morphology with this mask</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="morph" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/morph.c"
                 line="991">operation to perform</doc>
            <type name="OperationMorphology" c:type="VipsOperationMorphology"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/morph.c"
                 line="992">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="msb" c:identifier="vips_msb" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/msb.c"
             line="266">Optional arguments:

* @band: %gint, msb just this band

Turn any integer image to 8-bit unsigned char by discarding all but the most
significant byte. Signed values are converted to unsigned by adding 128.

Use @band to make a one-band 8-bit image.

This operator also works for LABQ coding.

See also: vips_scale(), vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="266"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/msb.c"
               line="285">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/msb.c"
                 line="268">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/msb.c"
                 line="269">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/msb.c"
                 line="270">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="niftisave"
              c:identifier="vips_niftisave"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/niftisave.c"
             line="455">Write a VIPS image to a file in NIFTI format.

Use the various NIFTI suffixes to pick the nifti save format.

See also: vips_image_write_to_file(), vips_niftiload().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="874"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/niftisave.c"
               line="467">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/niftisave.c"
                 line="457">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/niftisave.c"
                 line="458">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/niftisave.c"
                 line="459">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="notequal_const"
              c:identifier="vips_notequal_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="712">Perform #VIPS_OPERATION_RELATIONAL_NOTEQ on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="379"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="723">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="714">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="715">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="716">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="717">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="718">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="notequal_const1"
              c:identifier="vips_notequal_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="903">Perform #VIPS_OPERATION_RELATIONAL_NOTEQ on an image and a constant. See
vips_relational_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="406"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="913">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="905">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="906">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="907">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="908">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="orimage_const"
              c:identifier="vips_orimage_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="681">Perform #VIPS_OPERATION_BOOLEAN_OR on an image and an array of constants.
See vips_boolean_const().

See also: vips_boolean(), vips_boolean_const1().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="450"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="694">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="683">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="684">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="685">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="686">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="687">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="orimage_const1"
              c:identifier="vips_orimage_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="856">Perform #VIPS_OPERATION_BOOLEAN_OR on an image and a constant.
See vips_boolean_const1().

See also: vips_boolean(), vips_boolean_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="473"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="868">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="858">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="859">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="860">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="861">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="percent" c:identifier="vips_percent" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/percent.c"
             line="134">vips_percent() returns (through the @threshold parameter) the threshold
below which there are @percent values of @in. For example:

|[
$ vips percent k2.jpg 90
214
]|

Means that 90% of pixels in `k2.jpg` have a value less than 214.

The function works for uchar and ushort images only.  It can be used
to threshold the scaled result of a filtering operation.

See also: vips_hist_find(), vips_profile().</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="45"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/percent.c"
               line="156">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/percent.c"
                 line="136">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="percent" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/percent.c"
                 line="137">threshold percentage</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="threshold"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/percent.c"
                 line="138">output threshold value</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/percent.c"
                 line="139">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="pio_input" c:identifier="vips_image_pio_input">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3616">Check that an image is readable with vips_region_prepare() and friends.
If it isn't, try to transform the image so that vips_region_prepare() can
work.

See also: vips_image_pio_output(), vips_region_prepare().</doc>
        <source-position filename="libvips/include/vips/image.h" line="548"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3626">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3618">image to check</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="pio_output" c:identifier="vips_image_pio_output">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3688">Check that an image is writeable with vips_image_generate(). If it isn't,
try to transform the image so that vips_image_generate() can work.

See also: vips_image_pio_input().</doc>
        <source-position filename="libvips/include/vips/image.h" line="550"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3697">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3690">image to check</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="pngsave" c:identifier="vips_pngsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/pngsave.c"
             line="451">Optional arguments:

* @compression: %gint, compression level
* @interlace: %gboolean, interlace image
* @filter: #VipsForeignPngFilter row filter flag(s)
* @palette: %gboolean, enable quantisation to 8bpp palette
* @Q: %gint, quality for 8bpp quantisation
* @dither: %gdouble, amount of dithering for 8bpp quantization
* @bitdepth: %gint, set write bit depth to 1, 2, 4, 8 or 16
* @effort: %gint, quantisation CPU effort

Write a VIPS image to a file as PNG.

@compression means compress with this much effort (0 - 9). Default 6.

Set @interlace to %TRUE to interlace the image with ADAM7
interlacing. Beware
than an interlaced PNG can be up to 7 times slower to write than a
non-interlaced image.

Use @filter to specify one or more filters, defaults to none,
see #VipsForeignPngFilter.

The image is automatically converted to RGB, RGBA, Monochrome or Mono +
alpha before saving. Images with more than one byte per band element are
saved as 16-bit PNG, others are saved as 8-bit PNG.

Set @palette to %TRUE to enable palette mode for RGB or RGBA images. A
palette will be computed with enough space for @bitdepth (1, 2, 4 or 8)
bits. Use @Q to set the optimisation effort, @dither to set the degree of
Floyd-Steinberg dithering and @effort to control the CPU effort
(1 is the fastest, 10 is the slowest, 7 is the default).
This feature requires libvips to be compiled with libimagequant.

The default @bitdepth is either 8 or 16 depending on the interpretation.
You can also set @bitdepth for mono and mono + alpha images, and the image
will be quantized.

XMP metadata is written to the XMP chunk. PNG comments are written to
separate text chunks.

See also: vips_image_new_from_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="732"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngsave.c"
               line="500">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="453">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="454">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="455">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="pngsave_buffer"
              c:identifier="vips_pngsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/pngsave.c"
             line="515">Optional arguments:

* @compression: %gint, compression level
* @interlace: %gboolean, interlace image
* @filter: #VipsForeignPngFilter row filter flag(s)
* @palette: %gboolean, enable quantisation to 8bpp palette
* @Q: %gint, quality for 8bpp quantisation
* @dither: %gdouble, amount of dithering for 8bpp quantization
* @bitdepth: %gint, set write bit depth to 1, 2, 4, 8 or 16
* @effort: %gint, quantisation CPU effort

As vips_pngsave(), but save to a memory buffer.

The address of the buffer is returned in @buf, the length of the buffer in
@len. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_pngsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="735"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngsave.c"
               line="541">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="517">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="518">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="519">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="520">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="pngsave_target"
              c:identifier="vips_pngsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/pngsave.c"
             line="571">Optional arguments:

* @compression: compression level
* @interlace: interlace image
* @filter: libpng row filter flag(s)
* @palette: enable quantisation to 8bpp palette
* @Q: quality for 8bpp quantisation
* @dither: amount of dithering for 8bpp quantization
* @bitdepth: %gint, set write bit depth to 1, 2, 4, 8 or 16
* @effort: %gint, quantisation CPU effort

As vips_pngsave(), but save to a target.

See also: vips_pngsave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="729"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngsave.c"
               line="592">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="573">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="574">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/pngsave.c"
                 line="575">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="polar" c:identifier="vips_polar" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="304">Perform #VIPS_OPERATION_COMPLEX_POLAR on an image. See vips_complex().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="316"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="312">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="306">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="307">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="308">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="pow_const"
              c:identifier="vips_pow_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="547">Perform #VIPS_OPERATION_MATH2_POW on an image and a constant. See
vips_math2_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="503"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="558">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="549">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="550">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="551">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="552">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="553">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="pow_const1"
              c:identifier="vips_pow_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="655">Perform #VIPS_OPERATION_MATH2_POW on an image and a constant. See
vips_math2_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="519"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="665">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="657">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="658">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="659">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="660">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="ppmsave" c:identifier="vips_ppmsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/ppmsave.c"
             line="791">Optional arguments:

* @format: #VipsForeignPpmFormat, format to save in
* @ascii: %gboolean, save as ASCII rather than binary
* @bitdepth: %gint, bitdepth to save at

Write a VIPS image to a file as PPM. It can write 1, 8, 16 or
32 bit unsigned integer images, float images, colour or monochrome,
stored as binary or ASCII.
Integer images of more than 8 bits can only be stored in ASCII.

When writing float (PFM) images the scale factor is set from the
"pfm-scale" metadata.

Set @ascii to %TRUE to write as human-readable ASCII. Normally data is
written in binary.

Set @bitdepth to 1 to write a one-bit image.

@format defaults to the sub-type for this filename suffix.

See also: vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="776"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/ppmsave.c"
               line="820">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/ppmsave.c"
                 line="793">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/ppmsave.c"
                 line="794">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/ppmsave.c"
                 line="795">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="ppmsave_target"
              c:identifier="vips_ppmsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/ppmsave.c"
             line="835">Optional arguments:

* @format: #VipsForeignPpmFormat, format to save in
* @ascii: %gboolean, save as ASCII rather than binary
* @bitdepth: %gint, bitdepth to save at

As vips_ppmsave(), but save to a target.

See also: vips_ppmsave().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="779"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/ppmsave.c"
               line="851">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/ppmsave.c"
                 line="837">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/ppmsave.c"
                 line="838">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/ppmsave.c"
                 line="839">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="premultiply"
              c:identifier="vips_premultiply"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/premultiply.c"
             line="280">Optional arguments:

* @max_alpha: %gdouble, maximum value for alpha

Premultiplies any alpha channel.
The final band is taken to be the alpha
and the bands are transformed as:

|[
  alpha = clip(0, in[in.bands - 1], @max_alpha);
  norm = alpha / @max_alpha;
  out = [in[0] * norm, ..., in[in.bands - 1] * norm, alpha];
]|

So for an N-band image, the first N - 1 bands are multiplied by the clipped
and normalised final band, the final band is clipped.
If there is only a single band,
the image is passed through unaltered.

The result is
#VIPS_FORMAT_FLOAT unless the input format is #VIPS_FORMAT_DOUBLE, in which
case the output is double as well.

@max_alpha has the default value 255, or 65535 for images tagged as
#VIPS_INTERPRETATION_RGB16 or
#VIPS_INTERPRETATION_GREY16.

Non-complex images only.

See also: vips_unpremultiply(), vips_flatten().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="330"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/premultiply.c"
               line="317">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/premultiply.c"
                 line="282">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/premultiply.c"
                 line="283">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/premultiply.c"
                 line="284">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="prewitt" c:identifier="vips_prewitt" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/edge.c"
             line="389">Prewitt edge detector.

uchar images are computed using a fast, low-precision path. Cast to float
for a high-precision implementation.

See also: vips_canny(), vips_sobel(), vips_prewitt(), vips_scharr().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="91"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/edge.c"
               line="402">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="391">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="392">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="393">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="print_field" c:identifier="vips_image_print_field">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1972">Prints field @name to stdout as ASCII. Handy for debugging.</doc>
        <source-position filename="libvips/include/vips/header.h" line="297"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1974">image to get the header field from</doc>
            <type name="Image" c:type="const VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1975">field name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="profile" c:identifier="vips_profile" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/profile.c"
             line="318">vips_profile() searches inward from the edge of @in and finds the
first non-zero pixel. Pixels in @columns have the distance from the top edge
to the first non-zero pixel in that column, @rows has the distance from the
left edge to the first non-zero pixel in that row.

See also: vips_project(), vips_hist_find().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="573"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/profile.c"
               line="332">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/profile.c"
                 line="320">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="columns"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/profile.c"
                 line="321">distances from top edge</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="rows"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/profile.c"
                 line="322">distances from left edge</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/profile.c"
                 line="323">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="project" c:identifier="vips_project" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/project.c"
             line="349">Find the horizontal and vertical projections of an image, ie. the sum
of every row of pixels, and the sum of every column of pixels. The output
format is uint, int or double, depending on the input format.

Non-complex images only.

See also: vips_hist_find(), vips_profile().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="570"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/project.c"
               line="364">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/project.c"
                 line="351">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="columns"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/project.c"
                 line="352">sums of columns</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="rows"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/project.c"
                 line="353">sums of rows</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/project.c"
                 line="354">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="quadratic"
              c:identifier="vips_quadratic"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/quadratic.c"
             line="362">Optional arguments:

* @interpolate: use this interpolator (default bilinear)

This operation is unfinished and unusable, sorry.

See also: vips_affine().</doc>
        <source-position filename="libvips/include/vips/resample.h"
                         line="116"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/quadratic.c"
               line="377">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/quadratic.c"
                 line="364">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/quadratic.c"
                 line="365">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="coeff" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/quadratic.c"
                 line="366">horizontal quadratic</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/quadratic.c"
                 line="367">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rad2float"
              c:identifier="vips_rad2float"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/rad2float.c"
             line="203">Unpack a RAD (#VIPS_CODING_RAD) image to a three-band float image.

See also: vips_float2rad(), vips_LabQ2LabS().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="123"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/rad2float.c"
               line="213">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/rad2float.c"
                 line="205">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/rad2float.c"
                 line="206">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/rad2float.c"
                 line="207">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="radsave" c:identifier="vips_radsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/radsave.c"
             line="287">Write a VIPS image in Radiance (HDR) format.

Sections of this reader from Greg Ward and Radiance with kind permission.

See also: vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="796"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radsave.c"
               line="299">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="289">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="290">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="291">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="radsave_buffer"
              c:identifier="vips_radsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/radsave.c"
             line="314">As vips_radsave(), but save to a memory buffer.

The address of the buffer is returned in @buf, the length of the buffer in
@len. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_radsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="799"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radsave.c"
               line="329">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="316">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="317">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="318">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="319">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="radsave_target"
              c:identifier="vips_radsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/radsave.c"
             line="359">As vips_radsave(), but save to a target.

See also: vips_radsave().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="802"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radsave.c"
               line="369">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="361">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="362">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/radsave.c"
                 line="363">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rank" c:identifier="vips_rank" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/morphology/rank.c"
             line="599">vips_rank() does rank filtering on an image. A window of size @width by
@height is passed over the image. At each position, the pixels inside the
window are sorted into ascending order and the pixel at position @index is
output. @index numbers from 0.

It works for any non-complex image type, with any number of bands.
The input is expanded by copying edge pixels before performing the
operation so that the output image has the same size as the input.
Edge pixels in the output image are therefore only approximate.

For a median filter with mask size m (3 for 3x3, 5 for 5x5, etc.) use

 vips_rank(in, out, m, m, m * m / 2);

The special cases n == 0 and n == m * m - 1 are useful dilate and
expand operators.

See also: vips_conv(), vips_median(), vips_spcor().</doc>
        <source-position filename="libvips/include/vips/morphology.h"
                         line="52"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/morphology/rank.c"
               line="627">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="601">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="602">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="603">width of region</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="604">height of region</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="605">select pixel</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/morphology/rank.c"
                 line="606">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rawsave" c:identifier="vips_rawsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/rawsave.c"
             line="326">Writes the pixels in @in to the file @filename with no header or other
metadata.

See also: vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="647"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawsave.c"
               line="337">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="328">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="329">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="330">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rawsave_buffer"
              c:identifier="vips_rawsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/rawsave.c"
             line="352">As vips_rawsave(), but save to a memory buffer.

The address of the buffer is returned in @buf, the length of the buffer in
@len. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_rawsave(), vips_image_write_to_memory(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="650"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawsave.c"
               line="367">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="354">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="355">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="356">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="357">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rawsave_target"
              c:identifier="vips_rawsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/rawsave.c"
             line="397">As vips_rawsave(), but save to a target.

See also: vips_rawsave().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="653"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawsave.c"
               line="407">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="399">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="400">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/rawsave.c"
                 line="401">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="real" c:identifier="vips_real" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="820">Perform #VIPS_OPERATION_COMPLEXGET_REAL on an image. See vips_complexget().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="338"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="828">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="822">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="823">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="824">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="recomb" c:identifier="vips_recomb" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/recomb.c"
             line="241">This operation recombines an image's bands. Each pixel in @in is treated as
an n-element vector, where n is the number of bands in @in, and multiplied by
the n x m matrix @m to produce the m-band image @out.

@out is always float, unless @in is double, in which case @out is double
too. No complex images allowed.

It's useful for various sorts of colour space conversions.

See also: vips_bandmean().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="312"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/recomb.c"
               line="259">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/recomb.c"
                 line="243">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/recomb.c"
                 line="244">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="m" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/recomb.c"
                 line="245">recombination matrix</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/recomb.c"
                 line="246">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rect" c:identifier="vips_rect" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="327">Perform #VIPS_OPERATION_COMPLEX_RECT on an image. See vips_complex().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="319"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="335">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="329">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="330">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/complex.c"
                 line="331">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="reduce" c:identifier="vips_reduce" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="263">Optional arguments:

* @kernel: #VipsKernel to use to interpolate (default: lanczos3)
* @gap: reducing gap to use (default: 0.0)

Reduce @in by a pair of factors with a pair of 1D kernels. This
will not work well for shrink factors greater than three.

Set @gap to speed up reducing by having vips_shrink() to shrink
with a box filter first. The bigger @gap, the closer the result
to the fair resampling. The smaller @gap, the faster resizing.
The default value is 0.0 (no optimization).

This is a very low-level operation: see vips_resize() for a more
convenient way to resize images.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

See also: vips_shrink(), vips_resize(), vips_affine().</doc>
        <source-position filename="libvips/include/vips/resample.h" line="71"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/reduce.c"
               line="292">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="265">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="266">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="hshrink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="267">horizontal shrink</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="vshrink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="268">vertical shrink</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="269">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="reduceh" c:identifier="vips_reduceh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="107">Optional arguments:

* @kernel: #VipsKernel to use to interpolate (default: lanczos3)
* @gap: reducing gap to use (default: 0.0)

Reduce @in horizontally by a float factor. The pixels in @out are
interpolated with a 1D mask generated by @kernel.

Set @gap to speed up reducing by having vips_shrinkh() to shrink
with a box filter first. The bigger @gap, the closer the result
to the fair resampling. The smaller @gap, the faster resizing.
The default value is 0.0 (no optimization).

This is a very low-level operation: see vips_resize() for a more
convenient way to resize images.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

See also: vips_shrink(), vips_resize(), vips_affine().</doc>
        <source-position filename="libvips/include/vips/resample.h" line="75"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/reduce.c"
               line="135">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="109">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="110">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="hshrink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="111">horizontal reduce</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="112">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="reducev" c:identifier="vips_reducev" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="76">Optional arguments:

* @kernel: #VipsKernel to use to interpolate (default: lanczos3)
* @gap: reducing gap to use (default: 0.0)

Reduce @in vertically by a float factor. The pixels in @out are
interpolated with a 1D mask generated by @kernel.

Set @gap to speed up reducing by having vips_shrinkv() to shrink
with a box filter first. The bigger @gap, the closer the result
to the fair resampling. The smaller @gap, the faster resizing.
The default value is 0.0 (no optimization).

This is a very low-level operation: see vips_resize() for a more
convenient way to resize images.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

See also: vips_shrink(), vips_resize(), vips_affine().</doc>
        <source-position filename="libvips/include/vips/resample.h" line="78"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/reduce.c"
               line="104">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="78">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="79">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="vshrink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="80">vertical reduce</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/reduce.c"
                 line="81">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="relational_const"
              c:identifier="vips_relational_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="646">Perform various relational operations on an image and an array of
constants.

The output type is always uchar, with 0 for FALSE and 255 for TRUE.

If the array of constants has just one element, that constant is used for
all image bands. If the array has more than one element and they have
the same number of elements as there are bands in the image, then
one array element is used for each band. If the arrays have more than one
element and the image only has a single band, the result is a many-band
image where each band corresponds to one array element.

See also: vips_boolean(), vips_relational().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="371"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="669">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="648">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="649">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="relational" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="650">relational operation to perform</doc>
            <type name="OperationRelational" c:type="VipsOperationRelational"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="651">array of constants</doc>
            <array length="3" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="652">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="653">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="relational_const1"
              c:identifier="vips_relational_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="848">Perform various relational operations on an image and a constant. See
vips_relational_const().

See also: vips_boolean(), vips_relational().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="399"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="861">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="850">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="851">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="relational" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="852">relational operation to perform</doc>
            <type name="OperationRelational" c:type="VipsOperationRelational"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="853">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/relational.c"
                 line="854">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="remainder_const"
              c:identifier="vips_remainder_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/remainder.c"
             line="387">This operation calculates @in % @c (remainder after division by an
array of constants)
and writes the result to @out.
The image may have any
non-complex format. For float formats, vips_remainder_const() calculates
@in - @c * floor (@in / @c).

If the array of constants has just one element, that constant is used for
all image bands. If the array has more than one element and they have
the same number of elements as there are bands in the image, then
one array element is used for each band. If the arrays have more than one
element and the image only has a single band, the result is a many-band
image where each band corresponds to one array element.

See also: vips_remainder(), vips_divide(), vips_round().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="220"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/remainder.c"
               line="411">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="389">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="390">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="391">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="392">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="393">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="remainder_const1"
              c:identifier="vips_remainder_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/remainder.c"
             line="427">This operation calculates @in % @c (remainder after division by a
constant)
and writes the result to @out.
The image may have any
non-complex format. For float formats, vips_remainder_const() calculates
@in - @c * floor (@in / @c).

If the array of constants has just one element, that constant is used for
all image bands. If the array has more than one element and they have
the same number of elements as there are bands in the image, then
one array element is used for each band. If the arrays have more than one
element and the image only has a single band, the result is a many-band
image where each band corresponds to one array element.

See also: vips_remainder(), vips_divide(), vips_round().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="224"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/remainder.c"
               line="450">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="429">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="430">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="431">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/remainder.c"
                 line="432">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="remosaic" c:identifier="vips_remosaic" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/mosaicing/remosaic.c"
             line="195">vips_remosaic() works rather as vips_globalbalance(). It takes apart the
mosaiced image @in and rebuilds it, substituting images.

Unlike vips_globalbalance(), images are substituted based on their file‐
names.  The  rightmost  occurrence  of the string @old_str is swapped
for @new_str, that file is opened, and that image substituted  for
the old image.

It's convenient for multispectral images. You can mosaic one band, then
use that mosaic as a template for mosaicing the others automatically.

See also: vips_globalbalance().</doc>
        <source-position filename="libvips/include/vips/mosaicing.h"
                         line="67"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/remosaic.c"
               line="216">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/remosaic.c"
                 line="197">mosaic to rebuild</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/remosaic.c"
                 line="198">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="old_str" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/remosaic.c"
                 line="199">gamma of source images</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="new_str" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/remosaic.c"
                 line="200">gamma of source images</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/mosaicing/remosaic.c"
                 line="201">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="remove" c:identifier="vips_image_remove">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1429">Find and remove an item of metadata. Return %FALSE if no metadata of that
name was found.

See also: vips_image_set(), vips_image_get_typeof().</doc>
        <source-position filename="libvips/include/vips/header.h" line="256"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="1439">%TRUE if an item of metadata of that name was found and removed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1431">image to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1432">the name to search for</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="reorder_margin_hint"
              c:identifier="vips_reorder_margin_hint">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/reorder.c"
             line="351">vips_reorder_margin_hint() sets a hint that @image contains a margin, that
is, that each vips_region_prepare() on @image will request a slightly larger
region from it's inputs. A good value for @margin is (width * height) for
the window the operation uses.

This information is used by vips_image_prepare_many() to attempt to reorder
computations to minimise recomputation.

See also: vips_image_prepare_many().</doc>
        <source-position filename="libvips/include/vips/image.h" line="601"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/reorder.c"
                 line="353">the image to hint on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="margin" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/reorder.c"
                 line="354">the size of the margin this operation has added</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="reorder_prepare_many"
              c:identifier="vips_reorder_prepare_many">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/reorder.c"
             line="317">vips_reorder_prepare_many() runs vips_region_prepare() on each region in
@regions, requesting the pixels in @r.

It tries to request the regions in the order which will cause least
recomputation. This can give a large speedup, in some cases.

See also: vips_region_prepare(), vips_reorder_margin_hint().</doc>
        <source-position filename="libvips/include/vips/image.h" line="598"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/reorder.c"
               line="331">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/reorder.c"
                 line="319">the image that's being written</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="regions" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/reorder.c"
                 line="320">the set of regions to prepare</doc>
            <array zero-terminated="0" c:type="VipsRegion**">
              <type name="Region" c:type="VipsRegion*"/>
            </array>
          </parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/reorder.c"
                 line="321">the #VipsRect to prepare on each region</doc>
            <type name="Rect" c:type="VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="replicate"
              c:identifier="vips_replicate"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/replicate.c"
             line="221">Repeats an image many times.

See also: vips_extract_area().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="190"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/replicate.c"
               line="233">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/replicate.c"
                 line="223">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/replicate.c"
                 line="224">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="across" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/replicate.c"
                 line="225">repeat input this many times across</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="down" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/replicate.c"
                 line="226">repeat input this many times down</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/replicate.c"
                 line="227">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="resize" c:identifier="vips_resize" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/resize.c"
             line="398">Optional arguments:

* @vscale: %gdouble vertical scale factor
* @kernel: #VipsKernel to reduce with
* @gap: reducing gap to use (default: 2.0)

Resize an image.

Set @gap to speed up downsizing by having vips_shrink() to shrink
with a box filter first. The bigger @gap, the closer the result
to the fair resampling. The smaller @gap, the faster resizing.
The default value is 2.0 (very close to fair resampling
while still being faster in many cases).

vips_resize() normally uses #VIPS_KERNEL_LANCZOS3 for the final reduce, you
can change this with @kernel. Downsizing is done with centre convention.

When upsizing (@scale &gt; 1), the operation uses vips_affine() with
a #VipsInterpolate selected depending on @kernel. It will use
#VipsInterpolateBicubic for #VIPS_KERNEL_CUBIC and above. It adds a
0.5 pixel displacement to the input pixels to get centre convention scaling.

vips_resize() normally maintains the image aspect ratio. If you set
@vscale, that factor is used for the vertical scale and @scale for the
horizontal.

If either axis would drop below 1px in size, the shrink in that dimension
is limited. This breaks the image aspect ratio, but prevents errors due to
fractional pixel sizes.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

This operation does not premultiply alpha. If your image has an alpha
channel, you should use vips_premultiply() on it first.

See also: vips_premultiply(), vips_shrink(), vips_reduce().</doc>
        <source-position filename="libvips/include/vips/resample.h"
                         line="108"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/resize.c"
               line="443">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/resize.c"
                 line="400">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/resize.c"
                 line="401">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="scale" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/resize.c"
                 line="402">scale factor</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/resize.c"
                 line="403">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rint" c:identifier="vips_rint" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/round.c"
             line="280">Round to an integral value with #VIPS_OPERATION_ROUND_RINT. See
vips_round().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="255"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/round.c"
               line="289">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="282">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="283">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="284">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rot" c:identifier="vips_rot" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/rot.c"
             line="389">Rotate @in by a multiple of 90 degrees.

Use vips_similarity() to rotate by an arbitrary angle. vips_rot45() is
useful for rotating convolution masks by 45 degrees.

See also: vips_flip(), vips_similarity(), vips_rot45().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="203"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/rot.c"
               line="403">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="391">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="392">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="angle" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="393">rotation angle</doc>
            <type name="Angle" c:type="VipsAngle"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="394">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rot180" c:identifier="vips_rot180" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/rot.c"
             line="443">Rotate @in by 180 degrees. A convenience function over vips_rot().

See also: vips_rot().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="209"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/rot.c"
               line="453">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="445">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="446">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="447">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rot270" c:identifier="vips_rot270" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/rot.c"
             line="468">Rotate @in by 270 degrees clockwise. A convenience function over vips_rot().

See also: vips_rot().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="212"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/rot.c"
               line="478">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="470">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="471">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot.c"
                 line="472">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rot45" c:identifier="vips_rot45" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/rot45.c"
             line="287">Optional arguments:

* @angle: #VipsAngle45 rotation angle

Rotate @in by a multiple of 45 degrees. Odd-length sides and square images
only.

This operation is useful for rotating convolution masks. Use
vips_similarity() to rotate images by arbitrary angles.

See also: vips_rot(), vips_similarity().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="215"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/rot45.c"
               line="305">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot45.c"
                 line="289">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot45.c"
                 line="290">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/rot45.c"
                 line="291">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rotate" c:identifier="vips_rotate" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/similarity.c"
             line="288">Optional arguments:

* @interpolate: #VipsInterpolate, interpolate pixels with this
* @background: #VipsArrayDouble colour for new pixels
* @idx: %gdouble, input horizontal offset
* @idy: %gdouble, input vertical offset
* @odx: %gdouble, output horizontal offset
* @ody: %gdouble, output vertical offset

This operator calls vips_affine() for you, calculating the matrix for the
affine transform from @scale and @angle. Other parameters are passed on to
vips_affine() unaltered.

See also: vips_affine(), #VipsInterpolate.</doc>
        <source-position filename="libvips/include/vips/resample.h"
                         line="100"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/similarity.c"
               line="310">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/similarity.c"
                 line="290">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/similarity.c"
                 line="291">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="angle" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/similarity.c"
                 line="292">%gdouble, rotate by this many degrees clockwise</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/similarity.c"
                 line="293">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="round" c:identifier="vips_round" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/round.c"
             line="200">Round to an integral value.

Copy for integer types, round float and
complex types.

The format of @out is always the same as @in, so you may wish to cast to an
integer format afterwards.

See also: vips_cast()</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="246"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/round.c"
               line="217">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="202">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="203">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="round" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="204">#VipsOperationRound rounding operation to perform</doc>
            <type name="OperationRound" c:type="VipsOperationRound"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/round.c"
                 line="205">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rshift_const"
              c:identifier="vips_rshift_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="770">Perform #VIPS_OPERATION_BOOLEAN_LSHIFT on an image and an array of constants.
See vips_boolean_const().

See also: vips_boolean(), vips_boolean_const1().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="462"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="783">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="772">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="773">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="774">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="775">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="776">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="rshift_const1"
              c:identifier="vips_rshift_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="940">Perform #VIPS_OPERATION_BOOLEAN_RSHIFT on an image and a constant.
See vips_boolean_const1().

See also: vips_boolean(), vips_boolean_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="482"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="952">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="942">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="943">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="944">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/boolean.c"
                 line="945">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="sRGB2HSV" c:identifier="vips_sRGB2HSV" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/sRGB2HSV.c"
             line="154">Convert to HSV.

HSV is a crude polar coordinate system for RGB images. It is provided for
compatibility with other image processing systems. See vips_Lab2LCh() for a
much better colour space.

See also: vips_HSV2sRGB(), vips_Lab2LCh().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="178"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/sRGB2HSV.c"
               line="168">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/sRGB2HSV.c"
                 line="156">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/sRGB2HSV.c"
                 line="157">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/sRGB2HSV.c"
                 line="158">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="sRGB2scRGB"
              c:identifier="vips_sRGB2scRGB"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/sRGB2scRGB.c"
             line="305">Convert an sRGB image to scRGB. The input image can be 8 or 16-bit.

If the input image is tagged as #VIPS_INTERPRETATION_RGB16, any extra
channels after RGB are divided by 256. Thus, scRGB alpha is
always 0 - 255.99.

See also: vips_scRGB2XYZ(), vips_scRGB2sRGB(), vips_rad2float().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="169"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/sRGB2scRGB.c"
               line="319">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/sRGB2scRGB.c"
                 line="307">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/sRGB2scRGB.c"
                 line="308">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/sRGB2scRGB.c"
                 line="309">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="scRGB2BW" c:identifier="vips_scRGB2BW" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/scRGB2BW.c"
             line="262">Optional arguments:

* @depth: depth of output image in bits

Convert an scRGB image to greyscale. Set @depth to 16 to get 16-bit output.

If @depth is 16, any extra channels after RGB are
multiplied by 256.

See also: vips_LabS2LabQ(), vips_sRGB2scRGB(), vips_rad2float().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="166"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/scRGB2BW.c"
               line="279">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2BW.c"
                 line="264">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2BW.c"
                 line="265">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2BW.c"
                 line="266">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="scRGB2XYZ"
              c:identifier="vips_scRGB2XYZ"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/scRGB2XYZ.c"
             line="208">Turn XYZ to scRGB.</doc>
        <source-position filename="libvips/include/vips/colour.h" line="172"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/scRGB2XYZ.c"
               line="216">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2XYZ.c"
                 line="210">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2XYZ.c"
                 line="211">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2XYZ.c"
                 line="212">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="scRGB2sRGB"
              c:identifier="vips_scRGB2sRGB"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/colour/scRGB2sRGB.c"
             line="295">Optional arguments:

* @depth: depth of output image in bits

Convert an scRGB image to sRGB. Set @depth to 16 to get 16-bit output.

If @depth is 16, any extra channels after RGB are
multiplied by 256.

See also: vips_LabS2LabQ(), vips_sRGB2scRGB(), vips_rad2float().</doc>
        <source-position filename="libvips/include/vips/colour.h" line="163"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/scRGB2sRGB.c"
               line="312">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2sRGB.c"
                 line="297">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2sRGB.c"
                 line="298">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/colour/scRGB2sRGB.c"
                 line="299">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="scale" c:identifier="vips_scale" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/scale.c"
             line="181">Optional arguments:

* @log: log scale pixels
* @exp: exponent for log scale

Search the image for the maximum and minimum value, then return the image
as unsigned 8-bit, scaled so that the maximum value is 255 and the
minimum is zero.

If @log is set, transform with log10(1.0 + pow(x, @exp)) + .5,
then scale so max == 255. By default, @exp is 0.25.

See also: vips_cast().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="263"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/scale.c"
               line="201">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/scale.c"
                 line="183">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/scale.c"
                 line="184">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/scale.c"
                 line="185">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="scharr" c:identifier="vips_scharr" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/edge.c"
             line="361">Scharr edge detector.

uchar images are computed using a fast, low-precision path. Cast to float
for a high-precision implementation.

See also: vips_canny(), vips_sobel(), vips_prewitt(), vips_scharr().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="88"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/edge.c"
               line="374">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="363">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="364">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="365">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="sequential"
              c:identifier="vips_sequential"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/sequential.c"
             line="279">Optional arguments:

* @tile_height: height of cache strips

This operation behaves rather like vips_copy() between images
@in and @out, except that it checks that pixels on @in are only requested
top-to-bottom. This operation is useful for loading file formats which are
strictly top-to-bottom, like PNG.

@tile_height can be used to set the size of the tiles that
vips_sequential() uses. The default value is 1.

See also: vips_cache(), vips_linecache(), vips_tilecache().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="147"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/sequential.c"
               line="299">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/sequential.c"
                 line="281">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/sequential.c"
                 line="282">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/sequential.c"
                 line="283">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="set" c:identifier="vips_image_set">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1208">Set a piece of metadata on @image. Any old metadata with that name is
destroyed. The %GValue is copied into the image, so you need to unset the
value when you're done with it.

For example, to set an integer on an image (though you would use the
convenience function vips_image_set_int() in practice), you would do:

|[
GValue value = G_VALUE_INIT;

g_value_init(&amp;value, G_TYPE_INT);
g_value_set_int(&amp;value, 42);
vips_image_set(image, name, &amp;value);
g_value_unset(&amp;value);
]|

See also: vips_image_get().</doc>
        <source-position filename="libvips/include/vips/header.h" line="246"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1210">image to set the metadata on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1211">the name to give the metadata</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1212">the %GValue to copy into the image</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_area" c:identifier="vips_image_set_area">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1580">Attaches @data as a metadata item on @image under the name @name. When
VIPS no longer needs the metadata, it will be freed with @free_fn.

See also: vips_image_get_double(), vips_image_set()</doc>
        <source-position filename="libvips/include/vips/header.h" line="265"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1582">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1583">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="free_fn"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1"
                     scope="async"
                     closure="2">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1584">free function for @data</doc>
            <type name="CallbackFn" c:type="VipsCallbackFn"/>
          </parameter>
          <parameter name="data"
                     transfer-ownership="full"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1585">pointer to area of memory</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_array_double"
              c:identifier="vips_image_set_array_double">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="2139">Attaches @array as a metadata item on @image as @name.
A convenience function over vips_image_set().

See also: vips_image_get_image(), vips_image_set().</doc>
        <source-position filename="libvips/include/vips/header.h" line="313"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2141">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2142">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="array"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2143">array of doubles</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2144">the number of elements</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_array_int" c:identifier="vips_image_set_array_int">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="2081">Attaches @array as a metadata item on @image as @name.
A convenience function over vips_image_set().

See also: vips_image_get_image(), vips_image_set().</doc>
        <source-position filename="libvips/include/vips/header.h" line="304"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2083">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2084">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="array"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2085">array of ints</doc>
            <array length="2" zero-terminated="0" c:type="const int*">
              <type name="gint" c:type="int"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2086">the number of elements</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_blob" c:identifier="vips_image_set_blob">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1657">Attaches @data as a metadata item on @image under the name @name.

See also: vips_image_get_blob(), vips_image_set().</doc>
        <source-position filename="libvips/include/vips/header.h" line="271"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1659">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1660">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="free_fn"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1"
                     scope="async">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1661">free function for @data</doc>
            <type name="CallbackFn" c:type="VipsCallbackFn"/>
          </parameter>
          <parameter name="data" transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1662">pointer to area of
memory</doc>
            <array length="3" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="length" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1664">length of memory area</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_blob_copy" c:identifier="vips_image_set_blob_copy">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1682">Attaches @data as a metadata item on @image under the name @name, taking
a copy of the memory area.

See also: vips_image_get_blob(), vips_image_set().</doc>
        <source-position filename="libvips/include/vips/header.h" line="275"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1684">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1685">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1686">pointer to area of memory</doc>
            <array length="2" zero-terminated="0" c:type="void*">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="length" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1687">length of memory area</doc>
            <type name="gsize" c:type="size_t"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_delete_on_close"
              c:identifier="vips_image_set_delete_on_close">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2482">Sets the delete_on_close flag for the image. If this flag is set, when
@image is finalized, the filename held in @image-&gt;filename at the time of
this call is deleted.

This function is clearly extremely dangerous, use with great caution.

See also: vips_image_new_temp_file().</doc>
        <source-position filename="libvips/include/vips/image.h" line="503"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2484">image to set</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="delete_on_close" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2485">format of file</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_double" c:identifier="vips_image_set_double">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1827">Attaches @d as a metadata item on @image as @name. A
convenience
function over vips_image_set().

See also: vips_image_get_double(), vips_image_set()</doc>
        <source-position filename="libvips/include/vips/header.h" line="289"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1829">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1830">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="d" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1831">metadata value</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_image" c:identifier="vips_image_set_image">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="2025">Attaches @im as a metadata item on @image as @name.
A convenience function over vips_image_set().

See also: vips_image_get_image(), vips_image_set().</doc>
        <source-position filename="libvips/include/vips/header.h" line="302"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2027">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2028">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="im" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="2029">metadata value</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_int" c:identifier="vips_image_set_int">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1777">Attaches @i as a metadata item on @image under the name @name. A
convenience
function over vips_image_set().

See also: vips_image_get_int(), vips_image_set()</doc>
        <source-position filename="libvips/include/vips/header.h" line="284"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1779">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1780">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="i" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1781">metadata value</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_kill"
              c:identifier="vips_image_set_kill"
              glib:set-property="kill">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1673">Set the #VipsImage.kill flag on an image. Handy for stopping sets of
threads.

See also: vips_image_iskilled().</doc>
        <source-position filename="libvips/include/vips/image.h" line="452"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1675">image to test</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="kill" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1676">the kill state</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_progress" c:identifier="vips_image_set_progress">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1609">vips signals evaluation progress via the #VipsImage::preeval,
#VipsImage::eval and #VipsImage::posteval
signals. Progress is signalled on the most-downstream image for which
vips_image_set_progress() was called.</doc>
        <source-position filename="libvips/include/vips/image.h" line="448"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1611">image to signal progress on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="progress" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1612">turn progress reporting on or off</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_string" c:identifier="vips_image_set_string">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="1901">Attaches @str as a metadata item on @image as @name.
A convenience
function over vips_image_set() using #VIPS_TYPE_REF_STRING.

See also: vips_image_get_double(), vips_image_set().</doc>
        <source-position filename="libvips/include/vips/header.h" line="294"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1903">image to attach the metadata to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1904">metadata name</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="str" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="1905">metadata value</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="sharpen" c:identifier="vips_sharpen" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/sharpen.c"
             line="396">Optional arguments:

* @sigma: sigma of gaussian
* @x1: flat/jaggy threshold
* @y2: maximum amount of brightening
* @y3: maximum amount of darkening
* @m1: slope for flat areas
* @m2: slope for jaggy areas

Selectively sharpen the L channel of a LAB image. The input image is
transformed to #VIPS_INTERPRETATION_LABS.

The operation performs a gaussian blur and subtracts from @in to generate a
high-frequency signal. This signal is passed through a lookup table formed
from the five parameters and added back to @in.

The lookup table is formed like this:

|[
.                     ^
.                  y2 |- - - - - -----------
.                     |         /
.                     |        / slope m2
.                     |    .../
.             -x1     | ...   |
. -------------------...----------------------&gt;
.             |   ... |      x1
.             |... slope m1
.             /       |
.            / m2     |
.           /         |
.          /          |
.         /           |
.        /            |
. ______/ _ _ _ _ _ _ | -y3
.                     |
]|

For screen output, we suggest the following settings (the defaults):

|[
  sigma == 0.5
  x1 == 2
  y2 == 10         (don't brighten by more than 10 L*)
  y3 == 20         (can darken by up to 20 L*)
  m1 == 0          (no sharpening in flat areas)
  m2 == 3          (some sharpening in jaggy areas)
]|

If you want more or less sharpening, we suggest you just change the
m2 parameter.

The @sigma parameter changes the width of the fringe and can be
adjusted according to the output printing resolution. As an approximate
guideline, use 0.5 for 4 pixels/mm (display resolution),
1.0 for 12 pixels/mm and 1.5 for 16 pixels/mm (300 dpi == 12
pixels/mm). These figures refer to the image raster, not the half-tone
resolution.

See also: vips_conv().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="74"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/sharpen.c"
               line="463">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/sharpen.c"
                 line="398">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/sharpen.c"
                 line="399">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/sharpen.c"
                 line="400">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="shrink" c:identifier="vips_shrink" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/shrink.c"
             line="184">Optional arguments:

* @ceil: round-up output dimensions

Shrink @in by a pair of factors with a simple box filter. For non-integer
factors, vips_shrink() will first shrink by the integer part with a box
filter, then use vips_reduce() to shrink by the
remaining fractional part.

This is a very low-level operation: see vips_resize() for a more
convenient way to resize images.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

See also: vips_resize(), vips_reduce().</doc>
        <source-position filename="libvips/include/vips/resample.h" line="60"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/shrink.c"
               line="209">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrink.c"
                 line="186">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrink.c"
                 line="187">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="hshrink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrink.c"
                 line="188">horizontal shrink</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="vshrink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrink.c"
                 line="189">vertical shrink</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrink.c"
                 line="190">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="shrinkh" c:identifier="vips_shrinkh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/shrinkh.c"
             line="367">Optional arguments:

* @ceil: round-up output dimensions

Shrink @in horizontally by an integer factor. Each pixel in the output is
the average of the corresponding line of @hshrink pixels in the input.

This is a very low-level operation: see vips_resize() for a more
convenient way to resize images.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

See also: vips_shrinkv(), vips_shrink(), vips_resize(), vips_affine().</doc>
        <source-position filename="libvips/include/vips/resample.h" line="64"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/shrinkh.c"
               line="389">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrinkh.c"
                 line="369">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrinkh.c"
                 line="370">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="hshrink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrinkh.c"
                 line="371">horizontal shrink</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrinkh.c"
                 line="372">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="shrinkv" c:identifier="vips_shrinkv" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/shrinkv.c"
             line="512">Optional arguments:

* @ceil: round-up output dimensions

Shrink @in vertically by an integer factor. Each pixel in the output is
the average of the corresponding column of @vshrink pixels in the input.

This is a very low-level operation: see vips_resize() for a more
convenient way to resize images.

This operation does not change xres or yres. The image resolution needs to
be updated by the application.

See also: vips_shrinkh(), vips_shrink(), vips_resize(), vips_affine().</doc>
        <source-position filename="libvips/include/vips/resample.h" line="67"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/shrinkv.c"
               line="534">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrinkv.c"
                 line="514">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrinkv.c"
                 line="515">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="vshrink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrinkv.c"
                 line="516">vertical shrink</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/shrinkv.c"
                 line="517">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="sign" c:identifier="vips_sign" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/sign.c"
             line="186">Finds the unit vector in the direction of the pixel value. For non-complex
images, it returns a signed char image with values -1, 0, and 1 for negative,
zero and positive pixels. For complex images, it returns a
complex normalised to length 1.

See also: vips_abs().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="234"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/sign.c"
               line="199">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/sign.c"
                 line="188">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/sign.c"
                 line="189">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/sign.c"
                 line="190">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="similarity"
              c:identifier="vips_similarity"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/similarity.c"
             line="219">Optional arguments:

* @scale: %gdouble, scale by this factor
* @angle: %gdouble, rotate by this many degrees clockwise
* @interpolate: #VipsInterpolate, interpolate pixels with this
* @background: #VipsArrayDouble colour for new pixels
* @idx: %gdouble, input horizontal offset
* @idy: %gdouble, input vertical offset
* @odx: %gdouble, output horizontal offset
* @ody: %gdouble, output vertical offset

This operator calls vips_affine() for you, calculating the matrix for the
affine transform from @scale and @angle. Other parameters are passed on to
vips_affine() unaltered.

See also: vips_affine(), #VipsInterpolate.</doc>
        <source-position filename="libvips/include/vips/resample.h" line="97"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/similarity.c"
               line="242">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/similarity.c"
                 line="221">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/similarity.c"
                 line="222">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/similarity.c"
                 line="223">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="sin" c:identifier="vips_sin" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="310">Perform #VIPS_OPERATION_MATH_SIN on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="263"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="318">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="312">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="313">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="314">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="sinh" c:identifier="vips_sinh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="448">Perform #VIPS_OPERATION_MATH_SINH on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="293"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="456">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="450">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="451">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="452">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="smartcrop"
              c:identifier="vips_smartcrop"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/smartcrop.c"
             line="488">Optional arguments:

* @interesting: #VipsInteresting to use to find interesting areas (default: #VIPS_INTERESTING_ATTENTION)
* @premultiplied: %gboolean, input image already has premultiplied alpha
* @attention_x: %gint, horizontal position of attention centre when using attention based cropping
* @attention_y: %gint, vertical position of attention centre when using attention based cropping

Crop an image down to a specified width and height by removing boring parts.

Use @interesting to pick the method vips uses to decide which bits of the
image should be kept.

You can test xoffset / yoffset on @out to find the location of the crop
within the input image.

See also: vips_extract_area().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="184"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/smartcrop.c"
               line="513">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/smartcrop.c"
                 line="490">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/smartcrop.c"
                 line="491">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/smartcrop.c"
                 line="492">width of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/smartcrop.c"
                 line="493">height of area to extract</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/smartcrop.c"
                 line="494">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="sobel" c:identifier="vips_sobel" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/edge.c"
             line="333">Sobel edge detector.

uchar images are computed using a fast, low-precision path. Cast to float
for a high-precision implementation.

See also: vips_canny(), vips_sobel(), vips_prewitt(), vips_scharr().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="85"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/edge.c"
               line="346">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="335">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="336">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/edge.c"
                 line="337">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="spcor" c:identifier="vips_spcor" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/convolution/spcor.c"
             line="329">Calculate a correlation surface.

@ref is placed at every position in @in and the correlation coefficient
calculated. The output
image is always float.

The output
image is the same size as the input. Extra input edge pixels are made by
copying the existing edges outwards.

The correlation coefficient is calculated as:

|[
         sumij (ref(i,j)-mean(ref))(inkl(i,j)-mean(inkl))
c(k,l) = ------------------------------------------------
         sqrt(sumij (ref(i,j)-mean(ref))^2) *
                     sqrt(sumij (inkl(i,j)-mean(inkl))^2)
]|

where inkl is the area of @in centred at position (k,l).

from Niblack "An Introduction to Digital Image Processing",
Prentice/Hall, pp 138.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The output image is always float, unless either of the two inputs is
double, in which case the output is also double.

See also: vips_fastcor().</doc>
        <source-position filename="libvips/include/vips/convolution.h"
                         line="78"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/convolution/spcor.c"
               line="370">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/spcor.c"
                 line="331">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ref" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/spcor.c"
                 line="332">reference image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/convolution/spcor.c"
                 line="333">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/convolution/spcor.c"
                 line="334">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="spectrum" c:identifier="vips_spectrum" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/freqfilt/spectrum.c"
             line="109">Make a displayable (ie. 8-bit unsigned int) power spectrum.

If @in is non-complex, it is transformed to Fourier space. Then the
absolute value is passed through vips_scale() in log mode, and vips_wrap().

See also: vips_fwfft(), vips_scale(), vips_wrap().</doc>
        <source-position filename="libvips/include/vips/freqfilt.h" line="53"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/freqfilt/spectrum.c"
               line="122">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/spectrum.c"
                 line="111">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/spectrum.c"
                 line="112">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/freqfilt/spectrum.c"
                 line="113">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="stats" c:identifier="vips_stats" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/stats.c"
             line="453">Find many image statistics in a single pass through the data. @out is a
one-band #VIPS_FORMAT_DOUBLE image of at least 10 columns by n + 1
(where n is number of bands in image @in)
rows. Columns are statistics, and are, in order: minimum, maximum, sum,
sum of squares, mean, standard deviation, x coordinate of minimum, y
coordinate of minimum, x coordinate of maximum, y coordinate of maximum.
Later versions of vips_stats() may add more columns.

Row 0 has statistics for all
bands together, row 1 has stats for band 1, and so on.

If there is more than one maxima or minima, one of them will be chosen at
random.

See also: vips_avg(), vips_min().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="541"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/stats.c"
               line="475">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/stats.c"
                 line="455">image to scan</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/stats.c"
                 line="456">image of statistics</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/stats.c"
                 line="457">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="stdif" c:identifier="vips_stdif" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/histogram/stdif.c"
             line="361">Optional arguments:

* @a: weight of new mean
* @m0: target mean
* @b: weight of new deviation
* @s0: target deviation

vips_stdif() performs statistical differencing according to the formula
given in page 45 of the book "An Introduction to Digital Image
Processing" by Wayne Niblack. This transformation emphasises the way in
which a pel differs statistically from its neighbours. It is useful for
enhancing low-contrast images with lots of detail, such as X-ray plates.

At point (i,j) the output is given by the equation:

|[
vout(i,j) = @a * @m0 + (1 - @a) * meanv +
      (vin(i,j) - meanv) * (@b * @s0) / (@s0 + @b * stdv)
]|

Values @a, @m0, @b and @s0 are entered, while meanv and stdv are the values
calculated over a moving window of size @width, @height centred on pixel
(i,j). @m0 is the new mean, @a is the weight given to it. @s0 is the new
standard deviation, @b is the weight given to it.

Try:

|[
vips stdif $VIPSHOME/pics/huysum.v fred.v 0.5 128 0.5 50 11 11
]|

The operation works on one-band uchar images only, and writes a one-band
uchar image as its result. The output image has the same size as the
input.

See also: vips_hist_local().</doc>
        <source-position filename="libvips/include/vips/histogram.h"
                         line="48"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/histogram/stdif.c"
               line="406">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/stdif.c"
                 line="363">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/histogram/stdif.c"
                 line="364">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/stdif.c"
                 line="365">width of region</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/stdif.c"
                 line="366">height of region</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/histogram/stdif.c"
                 line="367">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="subsample"
              c:identifier="vips_subsample"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/subsample.c"
             line="299">Optional arguments:

* @point: turn on point sample mode

Subsample an image by an integer fraction. This is fast, nearest-neighbour
shrink.

For small horizontal shrinks, this operation will fetch lines of pixels
from @in and then subsample that line. For large shrinks it will fetch
single pixels.

If @point is set, @in will always be sampled in points. This can be faster
if the previous operations in the pipeline are very slow.

See also: vips_affine(), vips_shrink(), vips_zoom().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="226"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/subsample.c"
               line="323">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/subsample.c"
                 line="301">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/subsample.c"
                 line="302">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="xfac" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/subsample.c"
                 line="303">horizontal shrink factor</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="yfac" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/subsample.c"
                 line="304">vertical shrink factor</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/subsample.c"
                 line="305">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="tan" c:identifier="vips_tan" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="356">Perform #VIPS_OPERATION_MATH_TAN on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="269"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="364">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="358">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="359">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="360">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="tanh" c:identifier="vips_tanh" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math.c"
             line="494">Perform #VIPS_OPERATION_MATH_TANH on an image. See vips_math().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="299"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math.c"
               line="502">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="496">input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="497">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math.c"
                 line="498">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="thumbnail_image"
              c:identifier="vips_thumbnail_image"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/thumbnail.c"
             line="1793">Optional arguments:

* @height: %gint, target height in pixels
* @size: #VipsSize, upsize, downsize, both or force
* @no_rotate: %gboolean, don't rotate upright using orientation tag
* @crop: #VipsInteresting, shrink and crop to fill target
* @linear: %gboolean, perform shrink in linear light
* @import_profile: %gchararray, fallback import ICC profile
* @export_profile: %gchararray, export ICC profile
* @intent: #VipsIntent, rendering intent
* @fail_on: #VipsFailOn, load error types to fail on

Exactly as vips_thumbnail(), but read from an existing image.

This operation
is not able to exploit shrink-on-load features of image load libraries, so
it can be much slower than `vips_thumbnail()` and produce poorer quality
output. Only use it if you really have to.

See also: vips_thumbnail().</doc>
        <source-position filename="libvips/include/vips/resample.h" line="89"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1821">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/thumbnail.c"
                 line="1795">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/resample/thumbnail.c"
                 line="1796">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/thumbnail.c"
                 line="1797">target width in pixels</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/thumbnail.c"
                 line="1798">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="tiffsave" c:identifier="vips_tiffsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/tiffsave.c"
             line="602">Optional arguments:

* @compression: use this #VipsForeignTiffCompression
* @Q: %gint quality factor
* @predictor: use this #VipsForeignTiffPredictor
* @tile: %gboolean, set %TRUE to write a tiled tiff
* @tile_width: %gint for tile size
* @tile_height: %gint for tile size
* @pyramid: %gboolean, write an image pyramid
* @bitdepth: %int, change bit depth to 1,2, or 4 bit
* @miniswhite: %gboolean, write 1-bit images as MINISWHITE
* @resunit: #VipsForeignTiffResunit for resolution unit
* @xres: %gdouble horizontal resolution in pixels/mm
* @yres: %gdouble vertical resolution in pixels/mm
* @bigtiff: %gboolean, write a BigTiff file
* @properties: %gboolean, set %TRUE to write an IMAGEDESCRIPTION tag
* @region_shrink: #VipsRegionShrink How to shrink each 2x2 region.
* @level: %gint, Zstd or Deflate (zlib) compression level
* @lossless: %gboolean, WebP lossless mode
* @depth: #VipsForeignDzDepth how deep to make the pyramid
* @subifd: %gboolean write pyr layers as sub-ifds
* @premultiply: %gboolean write premultiplied alpha

Write a VIPS image to a file as TIFF.

If @in has the #VIPS_META_PAGE_HEIGHT metadata item, this is assumed to be a
"toilet roll" image. It will be
written as series of pages, each #VIPS_META_PAGE_HEIGHT pixels high.

Use @compression to set the tiff compression. Currently jpeg, packbits,
fax4, lzw, none, deflate, webp and zstd are supported. The default is no
compression.
JPEG compression is a good lossy compressor for photographs, packbits is
good for 1-bit images, and deflate is the best lossless compression TIFF
can do.

XYZ images are automatically saved as libtiff LOGLUV with SGILOG compression.
Float LAB images are saved as float CIELAB. Set @bitdepth to save as 8-bit
CIELAB.

Use @Q to set the JPEG compression factor. Default 75.

User @level to set the ZSTD (1-22) or Deflate (1-9) compression level. Use @lossless to
set WEBP lossless mode on. Use @Q to set the WEBP compression level.

Use @predictor to set the predictor for lzw, deflate and zstd compression.
It defaults to #VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL, meaning horizontal
differencing. Please refer to the libtiff
specifications for further discussion of various predictors.

Set @tile to TRUE to write a tiled tiff.  By default tiff are written in
strips. Use @tile_width and @tile_height to set the tile size. The defaiult
is 128 by 128.

Set @pyramid to write the image as a set of images, one per page, of
decreasing size. Use @region_shrink to set how images will be shrunk: by
default each 2x2 block is just averaged, but you can set MODE or MEDIAN as
well.

By default, the pyramid stops when the image is small enough to fit in one
tile. Use @depth to stop when the image fits in one pixel, or to only write
a single layer.

Set @bitdepth to save 8-bit uchar images as 1, 2 or 4-bit TIFFs.
In case of depth 1: Values &gt;128 are written as white, values &lt;=128 as black.
Normally vips will write MINISBLACK TIFFs where black is a 0 bit, but if you
set @miniswhite, it will use 0 for a white bit. Many pre-press applications
only work with images which use this sense. @miniswhite only affects one-bit
images, it does nothing for greyscale images.
In case of depth 2: The same holds but values &lt; 64 are written as black.
For 64 &lt;= values &lt; 128 they are written as dark grey, for 128 &lt;= values &lt; 192
they are written as light gray and values above are written as white.
In case @miniswhite is set to true this behavior is inverted.
In case of depth 4: values &lt; 16 are written as black, and so on for the
lighter shades. In case @miniswhite is set to true this behavior is inverted.

Use @resunit to override the default resolution unit.
The default
resolution unit is taken from the header field
#VIPS_META_RESOLUTION_UNIT. If this field is not set, then
VIPS defaults to cm.

Use @xres and @yres to override the default horizontal and vertical
resolutions. By default these values are taken from the VIPS image header.
libvips resolution is always in pixels per millimetre.

Set @bigtiff to attempt to write a bigtiff. Bigtiff is a variant of the TIFF
format that allows more than 4GB in a file.

Set @properties to write all vips metadata to the IMAGEDESCRIPTION tag as
xml. If @properties is not set, the value of #VIPS_META_IMAGEDESCRIPTION is
used instead.

The value of #VIPS_META_XMP_NAME is written to
the XMP tag. #VIPS_META_ORIENTATION (if set) is used to set the value of
the orientation
tag. #VIPS_META_IPTC (if set) is used to set the value of the IPTC tag.
#VIPS_META_PHOTOSHOP_NAME (if set) is used to set the value of the PHOTOSHOP
tag.

By default, pyramid layers are saved as consecutive pages.
Set @subifd to save pyramid layers as sub-directories of the main image.
Setting this option can improve compatibility with formats like OME.

Set @premultiply to save with premultiplied alpha. Some programs, such as
InDesign, will only work with premultiplied alpha.

See also: vips_tiffload(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="618"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffsave.c"
               line="717">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="604">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="605">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="606">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="tiffsave_buffer"
              c:identifier="vips_tiffsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/tiffsave.c"
             line="732">Optional arguments:

* @compression: use this #VipsForeignTiffCompression
* @Q: %gint quality factor
* @predictor: use this #VipsForeignTiffPredictor
* @tile: %gboolean, set %TRUE to write a tiled tiff
* @tile_width: %gint for tile size
* @tile_height: %gint for tile size
* @pyramid: %gboolean, write an image pyramid
* @bitdepth: %int, set write bit depth to 1, 2, 4 or 8
* @miniswhite: %gboolean, write 1-bit images as MINISWHITE
* @resunit: #VipsForeignTiffResunit for resolution unit
* @xres: %gdouble horizontal resolution in pixels/mm
* @yres: %gdouble vertical resolution in pixels/mm
* @bigtiff: %gboolean, write a BigTiff file
* @properties: %gboolean, set %TRUE to write an IMAGEDESCRIPTION tag
* @region_shrink: #VipsRegionShrink How to shrink each 2x2 region.
* @level: %gint, Zstd or Deflate (zlib) compression level
* @lossless: %gboolean, WebP lossless mode
* @depth: #VipsForeignDzDepth how deep to make the pyramid
* @subifd: %gboolean write pyr layers as sub-ifds
* @premultiply: %gboolean write premultiplied alpha

As vips_tiffsave(), but save to a memory buffer.

The address of the buffer is returned in @buf, the length of the buffer in
@len. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_tiffsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="621"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffsave.c"
               line="770">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="734">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="735">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="736">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="737">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="tiffsave_target"
              c:identifier="vips_tiffsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/tiffsave.c"
             line="800">Optional arguments:

* @compression: use this #VipsForeignTiffCompression
* @Q: %gint quality factor
* @predictor: use this #VipsForeignTiffPredictor
* @tile: %gboolean, set %TRUE to write a tiled tiff
* @tile_width: %gint for tile size
* @tile_height: %gint for tile size
* @pyramid: %gboolean, write an image pyramid
* @bitdepth: %int, set write bit depth to 1, 2, 4 or 8
* @miniswhite: %gboolean, write 1-bit images as MINISWHITE
* @resunit: #VipsForeignTiffResunit for resolution unit
* @xres: %gdouble horizontal resolution in pixels/mm
* @yres: %gdouble vertical resolution in pixels/mm
* @bigtiff: %gboolean, write a BigTiff file
* @properties: %gboolean, set %TRUE to write an IMAGEDESCRIPTION tag
* @region_shrink: #VipsRegionShrink How to shrink each 2x2 region.
* @level: %gint, Zstd or Deflate (zlib) compression level
* @lossless: %gboolean, WebP lossless mode
* @depth: #VipsForeignDzDepth how deep to make the pyramid
* @subifd: %gboolean write pyr layers as sub-ifds
* @premultiply: %gboolean write premultiplied alpha

As vips_tiffsave(), but save to a target.

See also: vips_tiffsave(), vips_image_write_to_target().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="624"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffsave.c"
               line="833">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="802">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="803">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/tiffsave.c"
                 line="804">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="tilecache"
              c:identifier="vips_tilecache"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/tilecache.c"
             line="819">Optional arguments:

* @tile_width: width of tiles in cache
* @tile_height: height of tiles in cache
* @max_tiles: maximum number of tiles to cache
* @access: hint expected access pattern #VipsAccess
* @threaded: allow many threads
* @persistent: don't drop cache at end of computation

This operation behaves rather like vips_copy() between images
@in and @out, except that it keeps a cache of computed pixels.
This cache is made of up to @max_tiles tiles (a value of -1
means any number of tiles), and each tile is of size @tile_width
by @tile_height pixels.

Each cache tile is made with a single call to
vips_region_prepare().

When the cache fills, a tile is chosen for reuse. If @access is
#VIPS_ACCESS_RANDOM, then the least-recently-used tile is reused. If
@access is #VIPS_ACCESS_SEQUENTIAL
the top-most tile is reused.

By default, @tile_width and @tile_height are 128 pixels, and the operation
will cache up to 1,000 tiles. @access defaults to #VIPS_ACCESS_RANDOM.

Normally, only a single thread at once is allowed to calculate tiles. If
you set @threaded to %TRUE, vips_tilecache() will allow many threads to
calculate tiles at once, and share the cache between them.

Normally the cache is dropped when computation finishes. Set @persistent to
%TRUE to keep the cache between computations.

See also: vips_cache(), vips_linecache().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="141"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/tilecache.c"
               line="860">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/tilecache.c"
                 line="821">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/tilecache.c"
                 line="822">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/tilecache.c"
                 line="823">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="transpose3d"
              c:identifier="vips_transpose3d"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/transpose3d.c"
             line="185">Optional arguments:

* @page_height: %gint, size of each input page

Transpose a volumetric image.

Volumetric images are very tall, thin images, with the metadata item
#VIPS_META_PAGE_HEIGHT set to the height of each sub-image.

This operation swaps the two major dimensions, so that page N in the
output contains the Nth scanline, in order, from each input page.

You can override the #VIPS_META_PAGE_HEIGHT metadata item with the optional
@page_height parameter.

#VIPS_META_PAGE_HEIGHT in the output image is the number of pages in the
input image.

See also: vips_grid().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="197"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/transpose3d.c"
               line="211">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/transpose3d.c"
                 line="187">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/transpose3d.c"
                 line="188">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/transpose3d.c"
                 line="189">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="unpremultiply"
              c:identifier="vips_unpremultiply"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/unpremultiply.c"
             line="349">Optional arguments:

* @max_alpha: %gdouble, maximum value for alpha
* @alpha_band: %gint, band containing alpha data

Unpremultiplies any alpha channel.
Band @alpha_band (by default the final band) contains the alpha and all
other bands are transformed as:

|[
  alpha = (int) clip(0, in[in.bands - 1], @max_alpha);
  norm = (double) alpha / @max_alpha;
  if (alpha == 0)
  	out = [0, ..., 0, alpha];
  else
  	out = [in[0] / norm, ..., in[in.bands - 1] / norm, alpha];
]|

So for an N-band image, the first N - 1 bands are divided by the clipped
and normalised final band, the final band is clipped.
If there is only a single band, the image is passed through unaltered.

The result is
#VIPS_FORMAT_FLOAT unless the input format is #VIPS_FORMAT_DOUBLE, in which
case the output is double as well.

@max_alpha has the default value 255, or 65535 for images tagged as
#VIPS_INTERPRETATION_RGB16 or
#VIPS_INTERPRETATION_GREY16.

Non-complex images only.

See also: vips_premultiply(), vips_flatten().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="333"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/unpremultiply.c"
               line="389">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/unpremultiply.c"
                 line="351">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/unpremultiply.c"
                 line="352">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/unpremultiply.c"
                 line="353">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="vipssave" c:identifier="vips_vipssave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/vipssave.c"
             line="265">Write @in to @filename in VIPS format.

See also: vips_vipsload().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="449"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/vipssave.c"
               line="275">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/vipssave.c"
                 line="267">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/vipssave.c"
                 line="268">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/vipssave.c"
                 line="269">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="vipssave_target"
              c:identifier="vips_vipssave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/vipssave.c"
             line="290">As vips_vipssave(), but save to a target.</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="452"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/vipssave.c"
               line="298">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/vipssave.c"
                 line="292">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/vipssave.c"
                 line="293">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/vipssave.c"
                 line="294">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="webpsave" c:identifier="vips_webpsave" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/webpsave.c"
             line="1167">Optional arguments:

* @Q: %gint, quality factor
* @lossless: %gboolean, enables lossless compression
* @preset: #VipsForeignWebpPreset, choose lossy compression preset
* @smart_subsample: %gboolean, enables high quality chroma subsampling
* @smart_deblock: %gboolean, enables auto-adjusting of the deblocking filter
* @near_lossless: %gboolean, preprocess in lossless mode (controlled by Q)
* @alpha_q: %gint, set alpha quality in lossless mode
* @effort: %gint, level of CPU effort to reduce file size
* @target_size: %gint, desired target size in bytes
* @passes: %gint, number of entropy-analysis passes
* @min_size: %gboolean, minimise size
* @mixed: %gboolean, allow both lossy and lossless encoding
* @kmin: %gint, minimum number of frames between keyframes
* @kmax: %gint, maximum number of frames between keyframes

Write an image to a file in WebP format.

By default, images are saved in lossy format, with
@Q giving the WebP quality factor. It has the range 0 - 100, with the
default 75.

Use @preset to hint the image type to the lossy compressor. The default is
#VIPS_FOREIGN_WEBP_PRESET_DEFAULT.

Set @smart_subsample to enable high quality chroma subsampling.

Set @smart_deblock to enable auto-adjusting of the deblocking filter. This
can improve image quality, especially on low-contrast edges, but encoding
can take significantly longer.

Use @alpha_q to set the quality for the alpha channel in lossy mode. It has
the range 1 - 100, with the default 100.

Use @effort to control how much CPU time to spend attempting to
reduce file size. A higher value means more effort and therefore CPU time
should be spent. It has the range 0-6 and a default value of 4.

Use @target_size to set the desired target size in bytes.

Use @passes to set the number of entropy-analysis passes, by default 1,
unless @target_size is set, in which case the default is 3. It is not
recommended to set @passes unless you set @target_size. Doing so will
result in longer encoding times for no benefit.

Set @lossless to use lossless compression, or combine @near_lossless
with @Q 80, 60, 40 or 20 to apply increasing amounts of preprocessing
which improves the near-lossless compression ratio by up to 50%.

For animated webp output, @min_size will try to optimize for minimum size.

For animated webp output, @kmax sets the maximum number of frames between
keyframes. Setting 0 means only keyframes. @kmin sets the minimum number of
frames between frames. Setting 0 means no keyframes. By default, keyframes
are disabled.

For animated webp output, @mixed tries to improve the file size by mixing
both lossy and lossless encoding.

Use the metadata items `loop` and `delay` to set the number of
loops for the animation and the frame delays.

See also: vips_webpload(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="535"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpsave.c"
               line="1238">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1169">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="filename" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1170">file to write to</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1171">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="webpsave_buffer"
              c:identifier="vips_webpsave_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/webpsave.c"
             line="1253">Optional arguments:

* @Q: %gint, quality factor
* @lossless: %gboolean, enables lossless compression
* @preset: #VipsForeignWebpPreset, choose lossy compression preset
* @smart_subsample: %gboolean, enables high quality chroma subsampling
* @smart_deblock: %gboolean, enables auto-adjusting of the deblocking filter
* @near_lossless: %gboolean, preprocess in lossless mode (controlled by Q)
* @alpha_q: %gint, set alpha quality in lossless mode
* @effort: %gint, level of CPU effort to reduce file size
* @target_size: %gint, desired target size in bytes
* @passes: %gint, number of entropy-analysis passes
* @min_size: %gboolean, minimise size
* @mixed: %gboolean, allow both lossy and lossless encoding
* @kmin: %gint, minimum number of frames between keyframes
* @kmax: %gint, maximum number of frames between keyframes

As vips_webpsave(), but save to a memory buffer.

The address of the buffer is returned in @buf, the length of the buffer in
@len. You are responsible for freeing the buffer with g_free() when you
are done with it.

See also: vips_webpsave().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="538"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpsave.c"
               line="1285">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1255">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="buf"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1256">return output buffer here</doc>
            <array length="1" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="len"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1257">return output length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1258">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="webpsave_mime"
              c:identifier="vips_webpsave_mime"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/webpsave.c"
             line="1315">Optional arguments:

* @Q: %gint, quality factor
* @lossless: %gboolean, enables lossless compression
* @preset: #VipsForeignWebpPreset, choose lossy compression preset
* @smart_subsample: %gboolean, enables high quality chroma subsampling
* @smart_deblock: %gboolean, enables auto-adjusting of the deblocking filter
* @near_lossless: %gboolean, preprocess in lossless mode (controlled by Q)
* @alpha_q: %gint, set alpha quality in lossless mode
* @effort: %gint, level of CPU effort to reduce file size
* @target_size: %gint, desired target size in bytes
* @passes: %gint, number of entropy-analysis passes
* @min_size: %gboolean, minimise size
* @mixed: %gboolean, allow both lossy and lossless encoding
* @kmin: %gint, minimum number of frames between keyframes
* @kmax: %gint, maximum number of frames between keyframes

As vips_webpsave(), but save as a mime webp on stdout.

See also: vips_webpsave(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="541"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpsave.c"
               line="1341">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1317">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1318">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="webpsave_target"
              c:identifier="vips_webpsave_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/foreign/webpsave.c"
             line="1356">Optional arguments:

* @Q: %gint, quality factor
* @lossless: %gboolean, enables lossless compression
* @preset: #VipsForeignWebpPreset, choose lossy compression preset
* @smart_subsample: %gboolean, enables high quality chroma subsampling
* @smart_deblock: %gboolean, enables auto-adjusting of the deblocking filter
* @near_lossless: %gboolean, preprocess in lossless mode (controlled by Q)
* @alpha_q: %gint, set alpha quality in lossless mode
* @effort: %gint, level of CPU effort to reduce file size
* @target_size: %gint, desired target size in bytes
* @passes: %gint, number of entropy-analysis passes
* @min_size: %gboolean, minimise size
* @mixed: %gboolean, allow both lossy and lossless encoding
* @kmin: %gint, minimum number of frames between keyframes
* @kmax: %gint, maximum number of frames between keyframes

As vips_webpsave(), but save to a target.

See also: vips_webpsave().</doc>
        <source-position filename="libvips/include/vips/foreign.h" line="532"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpsave.c"
               line="1383">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1358">image to save</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1359">save image to this target</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/foreign/webpsave.c"
                 line="1360">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="wio_input" c:identifier="vips_image_wio_input">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3381">Check that an image is readable via the VIPS_IMAGE_ADDR() macro, that is,
that the entire image is in memory and all pixels can be read with
VIPS_IMAGE_ADDR().  If it
isn't, try to transform it so that VIPS_IMAGE_ADDR() can work.

Since this function modifies @image, it is not thread-safe. Only call it on
images which you are sure have not been shared with another thread. If the
image might have been shared, use the less efficient
vips_image_copy_memory() instead.

See also: vips_image_copy_memory(), vips_image_pio_input(),
vips_image_inplace(), VIPS_IMAGE_ADDR().</doc>
        <source-position filename="libvips/include/vips/image.h" line="546"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3398">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3383">image to transform</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="wop_const"
              c:identifier="vips_wop_const"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="574">Perform #VIPS_OPERATION_MATH2_WOP on an image and a constant. See
vips_math2_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="507"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="585">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="576">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="577">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="578">array of constants</doc>
            <array length="2" zero-terminated="0" c:type="const double*">
              <type name="gdouble" c:type="double"/>
            </array>
          </parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="579">number of constants in @c</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="580">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="wop_const1"
              c:identifier="vips_wop_const1"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="681">Perform #VIPS_OPERATION_MATH2_WOP on an image and a constant. See
vips_math2_const().</doc>
        <source-position filename="libvips/include/vips/arithmetic.h"
                         line="522"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="691">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="683">left-hand input #VipsImage</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="684">output #VipsImage</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="c" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="685">constant</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/arithmetic/math2.c"
                 line="686">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="wrap" c:identifier="vips_wrap" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/wrap.c"
             line="144">Optional arguments:

* @x: horizontal displacement
* @y: vertical displacement

Slice an image up and move the segments about so that the pixel that was
at 0, 0 is now at @x, @y. If @x and @y are not set, they default to the
centre of the image.

See also: vips_embed(), vips_replicate().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="200"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/wrap.c"
               line="161">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/wrap.c"
                 line="146">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/wrap.c"
                 line="147">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/wrap.c"
                 line="148">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="write" c:identifier="vips_image_write">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2613">Write @image to @out. Use vips_image_new() and friends to create the
#VipsImage you want to write to.

See also: vips_image_new(), vips_copy(), vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/image.h" line="511"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2623">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2615">image to write</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2616">write to this image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
        </parameters>
      </method>
      <method name="write_line" c:identifier="vips_image_write_line">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3188">Write a line of pixels to an image. This function must be called repeatedly
with @ypos increasing from 0 to #VipsImage::height .
@linebuffer must be VIPS_IMAGE_SIZEOF_LINE() bytes long.

See also: vips_image_generate().</doc>
        <source-position filename="libvips/include/vips/image.h" line="557"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3200">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3190">image to write to</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="ypos" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3191">vertical position of scan-line to write</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="linebuffer" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3192">scanline of pixels</doc>
            <type name="Pel" c:type="VipsPel*"/>
          </parameter>
        </parameters>
      </method>
      <method name="write_prepare" c:identifier="vips_image_write_prepare">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="3124">Call this after setting header fields (width, height, and so on) to
allocate resources ready for writing.

Normally this function is called for you by vips_image_generate() or
vips_image_write_line(). You will need to call it yourself if you plan to
write directly to the -&gt;data member of a memory image.</doc>
        <source-position filename="libvips/include/vips/image.h" line="554"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3135">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="3126">image to prepare</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="write_to_buffer"
              c:identifier="vips_image_write_to_buffer"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2728">Writes @in to a memory buffer in a format specified by @suffix.

Save options may be appended to @suffix as "[name=value,...]" or given as
a NULL-terminated list of name-value pairs at the end of the arguments.
Options given in the function call override options given in the filename.

Currently only TIFF, JPEG and PNG formats are supported.

You can call the various save operations directly if you wish, see
vips_jpegsave_buffer(), for example.

See also: vips_image_write_to_memory(), vips_image_new_from_buffer().</doc>
        <source-position filename="libvips/include/vips/image.h" line="516"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2749">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2730">image to write</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="suffix" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2731">format to write</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="buf" transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2732">return buffer start here</doc>
            <array length="2" zero-terminated="0" c:type="void**">
              <type name="guint8"/>
            </array>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2733">return buffer length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2734">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="write_to_file"
              c:identifier="vips_image_write_to_file"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2666">Writes @in to @name using the saver recommended by
vips_foreign_find_save().

Save options may be appended to @filename as "[name=value,...]" or given as
a NULL-terminated list of name-value pairs at the end of the arguments.
Options given in the function call override options given in the filename.

See also: vips_image_new_from_file().</doc>
        <source-position filename="libvips/include/vips/image.h" line="513"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2681">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2668">image to write</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2669">write to this file</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2670">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="write_to_memory" c:identifier="vips_image_write_to_memory">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2865">Writes @in to memory as a simple, unformatted C-style array.

The caller is responsible for freeing this memory with g_free().

See also: vips_image_write_to_buffer().</doc>
        <source-position filename="libvips/include/vips/image.h" line="524"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2876">return buffer start here</doc>
          <array length="0" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2867">image to write</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="size"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2868">return buffer length here</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
        </parameters>
      </method>
      <method name="write_to_target"
              c:identifier="vips_image_write_to_target"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2820">Writes @in to @output in format @suffix.

Save options may be appended to @suffix as "[name=value,...]" or given as
a NULL-terminated list of name-value pairs at the end of the arguments.
Options given in the function call override options given in the filename.

You can call the various save operations directly if you wish, see
vips_jpegsave_target(), for example.

See also: vips_image_write_to_file().</doc>
        <source-position filename="libvips/include/vips/image.h" line="520"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="2838">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2822">image to write</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="suffix" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2823">format to write</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2824">target to write to</doc>
            <type name="Target" c:type="VipsTarget*"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="2825">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="zoom" c:identifier="vips_zoom" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/conversion/zoom.c"
             line="398">Zoom an image by repeating pixels. This is fast nearest-neighbour
zoom.

See also: vips_affine(), vips_subsample().</doc>
        <source-position filename="libvips/include/vips/conversion.h"
                         line="223"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/zoom.c"
               line="411">0 on success, -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/zoom.c"
                 line="400">input image</doc>
            <type name="Image" c:type="VipsImage*"/>
          </instance-parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/conversion/zoom.c"
                 line="401">output image</doc>
            <type name="Image" c:type="VipsImage**"/>
          </parameter>
          <parameter name="xfac" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/zoom.c"
                 line="402">horizontal scale factor</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="yfac" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/zoom.c"
                 line="403">vertical scale factor</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/conversion/zoom.c"
                 line="404">%NULL-terminated list of optional named arguments</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <property name="bands"
                writable="1"
                transfer-ownership="none"
                getter="get_bands"
                default-value="1">
        <type name="gint" c:type="gint"/>
      </property>
      <property name="coding"
                writable="1"
                transfer-ownership="none"
                getter="get_coding"
                default-value="VIPS_CODING_NONE">
        <type name="Coding"/>
      </property>
      <property name="demand"
                writable="1"
                transfer-ownership="none"
                default-value="VIPS_DEMAND_STYLE_SMALLTILE">
        <type name="DemandStyle"/>
      </property>
      <property name="filename"
                writable="1"
                transfer-ownership="none"
                getter="get_filename"
                default-value="NULL">
        <type name="utf8" c:type="gchar*"/>
      </property>
      <property name="foreign-buffer" writable="1" transfer-ownership="none">
        <type name="gpointer" c:type="gpointer"/>
      </property>
      <property name="format"
                writable="1"
                transfer-ownership="none"
                getter="get_format"
                default-value="VIPS_FORMAT_UCHAR">
        <type name="BandFormat"/>
      </property>
      <property name="height"
                writable="1"
                transfer-ownership="none"
                getter="get_height"
                default-value="1">
        <type name="gint" c:type="gint"/>
      </property>
      <property name="interpretation"
                writable="1"
                transfer-ownership="none"
                getter="get_interpretation"
                default-value="VIPS_INTERPRETATION_MULTIBAND">
        <type name="Interpretation"/>
      </property>
      <property name="kill"
                writable="1"
                transfer-ownership="none"
                setter="set_kill"
                default-value="FALSE">
        <type name="gboolean" c:type="gboolean"/>
      </property>
      <property name="mode"
                writable="1"
                transfer-ownership="none"
                getter="get_mode"
                default-value="p">
        <type name="utf8" c:type="gchar*"/>
      </property>
      <property name="sizeof-header"
                writable="1"
                transfer-ownership="none"
                default-value="64">
        <type name="guint64" c:type="guint64"/>
      </property>
      <property name="width"
                writable="1"
                transfer-ownership="none"
                getter="get_width"
                default-value="1">
        <type name="gint" c:type="gint"/>
      </property>
      <property name="xoffset"
                writable="1"
                transfer-ownership="none"
                getter="get_xoffset"
                default-value="0">
        <type name="gint" c:type="gint"/>
      </property>
      <property name="xres"
                writable="1"
                transfer-ownership="none"
                getter="get_xres"
                default-value="0.000000">
        <type name="gdouble" c:type="gdouble"/>
      </property>
      <property name="yoffset"
                writable="1"
                transfer-ownership="none"
                getter="get_yoffset"
                default-value="0">
        <type name="gint" c:type="gint"/>
      </property>
      <property name="yres"
                writable="1"
                transfer-ownership="none"
                getter="get_yres"
                default-value="0.000000">
        <type name="gdouble" c:type="gdouble"/>
      </property>
      <field name="parent_instance">
        <type name="Object" c:type="VipsObject"/>
      </field>
      <field name="Xsize" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="Ysize" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="Bands" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="BandFmt" readable="0" private="1">
        <type name="BandFormat" c:type="VipsBandFormat"/>
      </field>
      <field name="Coding" readable="0" private="1">
        <type name="Coding" c:type="VipsCoding"/>
      </field>
      <field name="Type" readable="0" private="1">
        <type name="Interpretation" c:type="VipsInterpretation"/>
      </field>
      <field name="Xres" readable="0" private="1">
        <type name="gdouble" c:type="double"/>
      </field>
      <field name="Yres" readable="0" private="1">
        <type name="gdouble" c:type="double"/>
      </field>
      <field name="Xoffset" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="Yoffset" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="Length" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="Compression" readable="0" private="1">
        <type name="gshort" c:type="short"/>
      </field>
      <field name="Level" readable="0" private="1">
        <type name="gshort" c:type="short"/>
      </field>
      <field name="Bbits" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="time" readable="0" private="1">
        <type name="Progress" c:type="VipsProgress*"/>
      </field>
      <field name="Hist" readable="0" private="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="filename" readable="0" private="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="data" readable="0" private="1">
        <type name="Pel" c:type="VipsPel*"/>
      </field>
      <field name="kill" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="Xres_float" readable="0" private="1">
        <type name="gfloat" c:type="float"/>
      </field>
      <field name="Yres_float" readable="0" private="1">
        <type name="gfloat" c:type="float"/>
      </field>
      <field name="mode" readable="0" private="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="dtype" readable="0" private="1">
        <type name="ImageType" c:type="VipsImageType"/>
      </field>
      <field name="fd" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="baseaddr" readable="0" private="1">
        <type name="gpointer" c:type="void*"/>
      </field>
      <field name="length" readable="0" private="1">
        <type name="gsize" c:type="size_t"/>
      </field>
      <field name="magic" readable="0" private="1">
        <type name="guint32" c:type="guint32"/>
      </field>
      <field name="start_fn" readable="0" private="1">
        <type name="StartFn" c:type="VipsStartFn"/>
      </field>
      <field name="generate_fn" readable="0" private="1">
        <type name="GenerateFn" c:type="VipsGenerateFn"/>
      </field>
      <field name="stop_fn" readable="0" private="1">
        <type name="StopFn" c:type="VipsStopFn"/>
      </field>
      <field name="client1" readable="0" private="1">
        <type name="gpointer" c:type="void*"/>
      </field>
      <field name="client2" readable="0" private="1">
        <type name="gpointer" c:type="void*"/>
      </field>
      <field name="sslock" readable="0" private="1">
        <type name="GLib.Mutex" c:type="GMutex*"/>
      </field>
      <field name="regions" readable="0" private="1">
        <type name="GLib.SList" c:type="GSList*">
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
      <field name="dhint" readable="0" private="1">
        <type name="DemandStyle" c:type="VipsDemandStyle"/>
      </field>
      <field name="meta" readable="0" private="1">
        <type name="GLib.HashTable" c:type="GHashTable*">
          <type name="gpointer" c:type="gpointer"/>
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
      <field name="meta_traverse" readable="0" private="1">
        <type name="GLib.SList" c:type="GSList*">
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
      <field name="sizeof_header" readable="0" private="1">
        <type name="gint64" c:type="gint64"/>
      </field>
      <field name="windows" readable="0" private="1">
        <type name="GLib.SList" c:type="GSList*">
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
      <field name="upstream" readable="0" private="1">
        <type name="GLib.SList" c:type="GSList*">
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
      <field name="downstream" readable="0" private="1">
        <type name="GLib.SList" c:type="GSList*">
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
      <field name="serial" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="history_list" readable="0" private="1">
        <type name="GLib.SList" c:type="GSList*">
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
      <field name="progress_signal" readable="0" private="1">
        <type name="Image" c:type="VipsImage*"/>
      </field>
      <field name="file_length" readable="0" private="1">
        <type name="gint64" c:type="gint64"/>
      </field>
      <field name="hint_set" readable="0" private="1">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="delete_on_close" readable="0" private="1">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="delete_on_close_filename" readable="0" private="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <glib:signal name="eval" when="last">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1235">The ::eval signal is emitted once per work unit (typically a 128 x
128 area of pixels) during image computation.

You can use this signal to update user-interfaces with progress
feedback. Beware of updating too frequently: you will usually
need some throttling mechanism.

Use vips_image_set_progress() to turn on progress reporting for an
image.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="progress" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1238">#VipsProgress for this image</doc>
            <type name="Progress" c:type="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="invalidate" when="last" action="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1298">The ::invalidate signal is emitted when an image or one of it's
upstream data sources has been destructively modified. See
vips_image_invalidate_all().</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </glib:signal>
      <glib:signal name="minimise" when="last" action="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1314">The ::minimise signal is emitted when an image has been asked to
minimise memory usage. All non-essential caches are dropped.
See vips_image_minimise_all().</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </glib:signal>
      <glib:signal name="posteval" when="last">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1259">The ::posteval signal is emitted once at the end of the computation
of @image. It's a good place to shut down evaluation feedback.

Use vips_image_set_progress() to turn on progress reporting for an
image.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="progress" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1262">#VipsProgress for this image</doc>
            <type name="Progress" c:type="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="preeval" when="last">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1215">The ::preeval signal is emitted once before computation of @image
starts. It's a good place to set up evaluation feedback.

Use vips_image_set_progress() to turn on progress reporting for an
image.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="progress" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1218">#VipsProgress for this image</doc>
            <type name="Progress" c:type="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="written" when="last" action="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1279">The ::written signal is emitted just after an image has been
written to. It is
used by vips to implement things like write to foreign file
formats.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="result"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="1282">set to non-zero to indicate error</doc>
            <type name="gint" c:type="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="ImageClass"
            c:type="VipsImageClass"
            glib:is-gtype-struct-for="Image">
      <source-position filename="libvips/include/vips/image.h" line="368"/>
      <field name="parent_class">
        <type name="ObjectClass" c:type="VipsObjectClass"/>
      </field>
      <field name="preeval">
        <callback name="preeval">
          <source-position filename="libvips/include/vips/image.h" line="336"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="image" transfer-ownership="none">
              <type name="Image" c:type="VipsImage*"/>
            </parameter>
            <parameter name="progress" transfer-ownership="none">
              <type name="Progress" c:type="VipsProgress*"/>
            </parameter>
            <parameter name="data"
                       transfer-ownership="none"
                       nullable="1"
                       allow-none="1">
              <type name="gpointer" c:type="void*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="eval">
        <callback name="eval">
          <source-position filename="libvips/include/vips/image.h" line="340"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="image" transfer-ownership="none">
              <type name="Image" c:type="VipsImage*"/>
            </parameter>
            <parameter name="progress" transfer-ownership="none">
              <type name="Progress" c:type="VipsProgress*"/>
            </parameter>
            <parameter name="data"
                       transfer-ownership="none"
                       nullable="1"
                       allow-none="1">
              <type name="gpointer" c:type="void*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="posteval">
        <callback name="posteval">
          <source-position filename="libvips/include/vips/image.h" line="344"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="image" transfer-ownership="none">
              <type name="Image" c:type="VipsImage*"/>
            </parameter>
            <parameter name="progress" transfer-ownership="none">
              <type name="Progress" c:type="VipsProgress*"/>
            </parameter>
            <parameter name="data"
                       transfer-ownership="none"
                       nullable="1"
                       allow-none="1">
              <type name="gpointer" c:type="void*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="written">
        <callback name="written">
          <source-position filename="libvips/include/vips/image.h" line="351"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="image" transfer-ownership="none">
              <type name="Image" c:type="VipsImage*"/>
            </parameter>
            <parameter name="result" transfer-ownership="none">
              <type name="gint" c:type="int*"/>
            </parameter>
            <parameter name="data"
                       transfer-ownership="none"
                       nullable="1"
                       allow-none="1">
              <type name="gpointer" c:type="void*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="invalidate">
        <callback name="invalidate">
          <source-position filename="libvips/include/vips/image.h" line="356"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="image" transfer-ownership="none">
              <type name="Image" c:type="VipsImage*"/>
            </parameter>
            <parameter name="data"
                       transfer-ownership="none"
                       nullable="1"
                       allow-none="1">
              <type name="gpointer" c:type="void*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="minimise">
        <callback name="minimise">
          <source-position filename="libvips/include/vips/image.h" line="366"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="image" transfer-ownership="none">
              <type name="Image" c:type="VipsImage*"/>
            </parameter>
            <parameter name="data"
                       transfer-ownership="none"
                       nullable="1"
                       allow-none="1">
              <type name="gpointer" c:type="void*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <callback name="ImageMapFn" c:type="VipsImageMapFn">
      <source-position filename="libvips/include/vips/header.h" line="257"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="image" transfer-ownership="none">
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="name" transfer-ownership="none">
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="value" transfer-ownership="none">
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <enumeration name="ImageType"
                 glib:type-name="VipsImageType"
                 glib:get-type="vips_image_type_get_type"
                 c:type="VipsImageType">
      <member name="error"
              value="-1"
              c:identifier="VIPS_IMAGE_ERROR"
              glib:nick="error"
              glib:name="VIPS_IMAGE_ERROR">
      </member>
      <member name="none"
              value="0"
              c:identifier="VIPS_IMAGE_NONE"
              glib:nick="none"
              glib:name="VIPS_IMAGE_NONE">
      </member>
      <member name="setbuf"
              value="1"
              c:identifier="VIPS_IMAGE_SETBUF"
              glib:nick="setbuf"
              glib:name="VIPS_IMAGE_SETBUF">
      </member>
      <member name="setbuf_foreign"
              value="2"
              c:identifier="VIPS_IMAGE_SETBUF_FOREIGN"
              glib:nick="setbuf-foreign"
              glib:name="VIPS_IMAGE_SETBUF_FOREIGN">
      </member>
      <member name="openin"
              value="3"
              c:identifier="VIPS_IMAGE_OPENIN"
              glib:nick="openin"
              glib:name="VIPS_IMAGE_OPENIN">
      </member>
      <member name="mmapin"
              value="4"
              c:identifier="VIPS_IMAGE_MMAPIN"
              glib:nick="mmapin"
              glib:name="VIPS_IMAGE_MMAPIN">
      </member>
      <member name="mmapinrw"
              value="5"
              c:identifier="VIPS_IMAGE_MMAPINRW"
              glib:nick="mmapinrw"
              glib:name="VIPS_IMAGE_MMAPINRW">
      </member>
      <member name="openout"
              value="6"
              c:identifier="VIPS_IMAGE_OPENOUT"
              glib:nick="openout"
              glib:name="VIPS_IMAGE_OPENOUT">
      </member>
      <member name="partial"
              value="7"
              c:identifier="VIPS_IMAGE_PARTIAL"
              glib:nick="partial"
              glib:name="VIPS_IMAGE_PARTIAL">
      </member>
    </enumeration>
    <enumeration name="Intent"
                 glib:type-name="VipsIntent"
                 glib:get-type="vips_intent_get_type"
                 c:type="VipsIntent">
      <doc xml:space="preserve"
           filename="libvips/colour/icc_transform.c"
           line="103">The rendering intent. #VIPS_INTENT_ABSOLUTE is best for
scientific work, #VIPS_INTENT_RELATIVE is usually best for
accurate communication with other imaging libraries.</doc>
      <member name="perceptual"
              value="0"
              c:identifier="VIPS_INTENT_PERCEPTUAL"
              glib:nick="perceptual"
              glib:name="VIPS_INTENT_PERCEPTUAL">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="105">perceptual rendering intent</doc>
      </member>
      <member name="relative"
              value="1"
              c:identifier="VIPS_INTENT_RELATIVE"
              glib:nick="relative"
              glib:name="VIPS_INTENT_RELATIVE">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="106">relative colorimetric rendering intent</doc>
      </member>
      <member name="saturation"
              value="2"
              c:identifier="VIPS_INTENT_SATURATION"
              glib:nick="saturation"
              glib:name="VIPS_INTENT_SATURATION">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="107">saturation rendering intent</doc>
      </member>
      <member name="absolute"
              value="3"
              c:identifier="VIPS_INTENT_ABSOLUTE"
              glib:nick="absolute"
              glib:name="VIPS_INTENT_ABSOLUTE">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="108">absolute colorimetric rendering intent</doc>
      </member>
      <member name="last"
              value="4"
              c:identifier="VIPS_INTENT_LAST"
              glib:nick="last"
              glib:name="VIPS_INTENT_LAST">
      </member>
    </enumeration>
    <enumeration name="Interesting"
                 glib:type-name="VipsInteresting"
                 glib:get-type="vips_interesting_get_type"
                 c:type="VipsInteresting">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="210">Pick the algorithm vips uses to decide image "interestingness". This is used
by vips_smartcrop(), for example, to decide what parts of the image to
keep.

#VIPS_INTERESTING_NONE and #VIPS_INTERESTING_LOW mean the same -- the
crop is positioned at the top or left. #VIPS_INTERESTING_HIGH positions at
the bottom or right.

See also: vips_smartcrop().</doc>
      <member name="none"
              value="0"
              c:identifier="VIPS_INTERESTING_NONE"
              glib:nick="none"
              glib:name="VIPS_INTERESTING_NONE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="212">do nothing</doc>
      </member>
      <member name="centre"
              value="1"
              c:identifier="VIPS_INTERESTING_CENTRE"
              glib:nick="centre"
              glib:name="VIPS_INTERESTING_CENTRE">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="213">just take the centre</doc>
      </member>
      <member name="entropy"
              value="2"
              c:identifier="VIPS_INTERESTING_ENTROPY"
              glib:nick="entropy"
              glib:name="VIPS_INTERESTING_ENTROPY">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="214">use an entropy measure</doc>
      </member>
      <member name="attention"
              value="3"
              c:identifier="VIPS_INTERESTING_ATTENTION"
              glib:nick="attention"
              glib:name="VIPS_INTERESTING_ATTENTION">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="215">look for features likely to draw human attention</doc>
      </member>
      <member name="low"
              value="4"
              c:identifier="VIPS_INTERESTING_LOW"
              glib:nick="low"
              glib:name="VIPS_INTERESTING_LOW">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="216">position the crop towards the low coordinate</doc>
      </member>
      <member name="high"
              value="5"
              c:identifier="VIPS_INTERESTING_HIGH"
              glib:nick="high"
              glib:name="VIPS_INTERESTING_HIGH">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="217">position the crop towards the high coordinate</doc>
      </member>
      <member name="all"
              value="6"
              c:identifier="VIPS_INTERESTING_ALL"
              glib:nick="all"
              glib:name="VIPS_INTERESTING_ALL">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="218">everything is interesting</doc>
      </member>
      <member name="last"
              value="7"
              c:identifier="VIPS_INTERESTING_LAST"
              glib:nick="last"
              glib:name="VIPS_INTERESTING_LAST">
      </member>
    </enumeration>
    <class name="Interpolate"
           c:symbol-prefix="interpolate"
           c:type="VipsInterpolate"
           parent="Object"
           abstract="1"
           glib:type-name="VipsInterpolate"
           glib:get-type="vips_interpolate_get_type"
           glib:type-struct="InterpolateClass">
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="92"/>
      <constructor name="new" c:identifier="vips_interpolate_new">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="641">Look up an interpolator from a nickname and make one. You need to free the
result with g_object_unref() when you're done with it.

See also: vips_type_find().</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="133"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="650">an interpolator, or %NULL on error.</doc>
          <type name="Interpolate" c:type="VipsInterpolate*"/>
        </return-value>
        <parameters>
          <parameter name="nickname" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="643">nickname for interpolator</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="bilinear_static"
                c:identifier="vips_interpolate_bilinear_static">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="601">A convenience function that returns a bilinear interpolator you
don't need to free.</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="127"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="607">a bilinear interpolator</doc>
          <type name="Interpolate" c:type="VipsInterpolate*"/>
        </return-value>
      </function>
      <function name="nearest_static"
                c:identifier="vips_interpolate_nearest_static">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="383">A convenience function that returns a nearest-neighbour interpolator you
don't need to free.</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="125"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="389">a nearest-neighbour interpolator</doc>
          <type name="Interpolate" c:type="VipsInterpolate*"/>
        </return-value>
      </function>
      <virtual-method name="get_window_offset" invoker="get_window_offset">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="265">Look up an interpolators desired window offset.</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="90"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="271">the interpolators required window offset</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="interpolate" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="267">interpolator to use</doc>
            <type name="Interpolate" c:type="VipsInterpolate*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="get_window_size" invoker="get_window_size">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="247">Look up an interpolators desired window size.</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="81"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="253">the interpolators required window size</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="interpolate" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="249">interpolator to use</doc>
            <type name="Interpolate" c:type="VipsInterpolate*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="interpolate">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="96">the interpolation method</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="68"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="interpolate" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="79">the interpolator</doc>
            <type name="Interpolate" c:type="VipsInterpolate*"/>
          </instance-parameter>
          <parameter name="out"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="80">write the interpolated pixel here</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
          <parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="81">read source pixels from here</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="82">interpolate value at this position</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="83">interpolate value at this position</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name=""
              c:identifier="vips_interpolate"
              moved-to="interpolate"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="203">Look up the @interpolate method in the class and call it. Use
vips_interpolate_get_method() to get a direct pointer to the function and
avoid the lookup overhead.

You need to set @in and @out up correctly.</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="99"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="interpolate" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="205">interpolator to use</doc>
            <type name="Interpolate" c:type="VipsInterpolate*"/>
          </instance-parameter>
          <parameter name="out"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="206">write result here</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
          <parameter name="in" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="207">read source data from here</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="208">interpolate value at this position</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="209">interpolate value at this position</doc>
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_method"
              c:identifier="vips_interpolate_get_method"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="228">Look up the @interpolate method in the class and return it. Use this
instead of vips_interpolate() to cache method dispatch.</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="102"/>
        <return-value>
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="235">a pointer to the interpolation function</doc>
          <type name="InterpolateMethod" c:type="VipsInterpolateMethod"/>
        </return-value>
        <parameters>
          <instance-parameter name="interpolate" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="230">interpolator to use</doc>
            <type name="Interpolate" c:type="VipsInterpolate*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_window_offset"
              c:identifier="vips_interpolate_get_window_offset">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="265">Look up an interpolators desired window offset.</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="106"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="271">the interpolators required window offset</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="interpolate" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="267">interpolator to use</doc>
            <type name="Interpolate" c:type="VipsInterpolate*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="get_window_size"
              c:identifier="vips_interpolate_get_window_size">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="247">Look up an interpolators desired window size.</doc>
        <source-position filename="libvips/include/vips/interpolate.h"
                         line="104"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="253">the interpolators required window size</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="interpolate" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="249">interpolator to use</doc>
            <type name="Interpolate" c:type="VipsInterpolate*"/>
          </instance-parameter>
        </parameters>
      </method>
      <field name="parent_object">
        <type name="Object" c:type="VipsObject"/>
      </field>
    </class>
    <record name="InterpolateClass"
            c:type="VipsInterpolateClass"
            glib:is-gtype-struct-for="Interpolate">
      <doc xml:space="preserve"
           filename="libvips/resample/interpolate.c"
           line="94">The abstract base class for the various VIPS interpolation functions.
Use "vips --list classes" to see all the interpolators available.

An interpolator consists of a function to perform the interpolation, plus
some extra data fields which tell vips how to call the function and what
data it needs.

@window_size is the size of the window that the interpolator needs. For
example, a bicubic interpolator needs to see a window of 4x4 pixels to be
able to interpolate a value.

You can either have a function in @get_window_size which returns the window
that a specific interpolator needs, or you can leave @get_window_size %NULL
and set a constant value in @window_size.

@window_offset is how much to offset the window up and left of (x, y). For
example, a bicubic interpolator will want a @window_offset of 1.

You can either have a function in @get_window_offset which returns the
offset that a specific interpolator needs, or you can leave
@get_window_offset %NULL and set a constant value in @window_offset.

You also need to set @nickname and @description in #VipsObject.

See also: #VipsInterpolateMethod, #VipsObject,
vips_interpolate_bilinear_static().</doc>
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="92"/>
      <field name="parent_class">
        <type name="ObjectClass" c:type="VipsObjectClass"/>
      </field>
      <field name="interpolate">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="96">the interpolation method</doc>
        <type name="InterpolateMethod" c:type="VipsInterpolateMethod"/>
      </field>
      <field name="get_window_size">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="97">return the size of the window needed by this method</doc>
        <callback name="get_window_size">
          <source-position filename="libvips/include/vips/interpolate.h"
                           line="81"/>
          <return-value transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="253">the interpolators required window size</doc>
            <type name="gint" c:type="int"/>
          </return-value>
          <parameters>
            <parameter name="interpolate" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/resample/interpolate.c"
                   line="249">interpolator to use</doc>
              <type name="Interpolate" c:type="VipsInterpolate*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="window_size">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="98">or just set this for a constant window size</doc>
        <type name="gint" c:type="int"/>
      </field>
      <field name="get_window_offset">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="99">return the window offset for this method</doc>
        <callback name="get_window_offset">
          <source-position filename="libvips/include/vips/interpolate.h"
                           line="90"/>
          <return-value transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/resample/interpolate.c"
                 line="271">the interpolators required window offset</doc>
            <type name="gint" c:type="int"/>
          </return-value>
          <parameters>
            <parameter name="interpolate" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/resample/interpolate.c"
                   line="267">interpolator to use</doc>
              <type name="Interpolate" c:type="VipsInterpolate*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="window_offset">
        <doc xml:space="preserve"
             filename="libvips/resample/interpolate.c"
             line="100">or just set this for a constant window offset</doc>
        <type name="gint" c:type="int"/>
      </field>
    </record>
    <callback name="InterpolateMethod" c:type="VipsInterpolateMethod">
      <doc xml:space="preserve"
           filename="libvips/resample/interpolate.c"
           line="77">An interpolation function. It should read source pixels from @in with
VIPS_REGION_ADDR(), it can look left and up from (x, y) by @window_offset
pixels and it can access pixels in a window of size @window_size.

The interpolated value should be written to the pixel pointed to by @out.

See also: #VipsInterpolateClass.</doc>
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="68"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="interpolate" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="79">the interpolator</doc>
          <type name="Interpolate" c:type="VipsInterpolate*"/>
        </parameter>
        <parameter name="out"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="80">write the interpolated pixel here</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="81">read source pixels from here</doc>
          <type name="Region" c:type="VipsRegion*"/>
        </parameter>
        <parameter name="x" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="82">interpolate value at this position</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="y" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="83">interpolate value at this position</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
      </parameters>
    </callback>
    <enumeration name="Interpretation"
                 glib:type-name="VipsInterpretation"
                 glib:get-type="vips_interpretation_get_type"
                 c:type="VipsInterpretation">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="206">How the values in an image should be interpreted. For example, a
three-band float image of type #VIPS_INTERPRETATION_LAB should have its
pixels interpreted as coordinates in CIE Lab space.

RGB and sRGB are treated in the same way. Use the colourspace functions if
you want some other behaviour.

The gaps in numbering are historical and must be maintained. Allocate
new numbers from the end.</doc>
      <member name="error"
              value="-1"
              c:identifier="VIPS_INTERPRETATION_ERROR"
              glib:nick="error"
              glib:name="VIPS_INTERPRETATION_ERROR">
      </member>
      <member name="multiband"
              value="0"
              c:identifier="VIPS_INTERPRETATION_MULTIBAND"
              glib:nick="multiband"
              glib:name="VIPS_INTERPRETATION_MULTIBAND">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="208">generic many-band image</doc>
      </member>
      <member name="b_w"
              value="1"
              c:identifier="VIPS_INTERPRETATION_B_W"
              glib:nick="b-w"
              glib:name="VIPS_INTERPRETATION_B_W">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="209">some kind of single-band image</doc>
      </member>
      <member name="histogram"
              value="10"
              c:identifier="VIPS_INTERPRETATION_HISTOGRAM"
              glib:nick="histogram"
              glib:name="VIPS_INTERPRETATION_HISTOGRAM">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="210">a 1D image, eg. histogram or lookup table</doc>
      </member>
      <member name="xyz"
              value="12"
              c:identifier="VIPS_INTERPRETATION_XYZ"
              glib:nick="xyz"
              glib:name="VIPS_INTERPRETATION_XYZ">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="212">the first three bands are CIE XYZ</doc>
      </member>
      <member name="lab"
              value="13"
              c:identifier="VIPS_INTERPRETATION_LAB"
              glib:nick="lab"
              glib:name="VIPS_INTERPRETATION_LAB">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="213">pixels are in CIE Lab space</doc>
      </member>
      <member name="cmyk"
              value="15"
              c:identifier="VIPS_INTERPRETATION_CMYK"
              glib:nick="cmyk"
              glib:name="VIPS_INTERPRETATION_CMYK">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="214">the first four bands are in CMYK space</doc>
      </member>
      <member name="labq"
              value="16"
              c:identifier="VIPS_INTERPRETATION_LABQ"
              glib:nick="labq"
              glib:name="VIPS_INTERPRETATION_LABQ">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="215">implies #VIPS_CODING_LABQ</doc>
      </member>
      <member name="rgb"
              value="17"
              c:identifier="VIPS_INTERPRETATION_RGB"
              glib:nick="rgb"
              glib:name="VIPS_INTERPRETATION_RGB">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="216">generic RGB space</doc>
      </member>
      <member name="cmc"
              value="18"
              c:identifier="VIPS_INTERPRETATION_CMC"
              glib:nick="cmc"
              glib:name="VIPS_INTERPRETATION_CMC">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="217">a uniform colourspace based on CMC(1:1)</doc>
      </member>
      <member name="lch"
              value="19"
              c:identifier="VIPS_INTERPRETATION_LCH"
              glib:nick="lch"
              glib:name="VIPS_INTERPRETATION_LCH">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="218">pixels are in CIE LCh space</doc>
      </member>
      <member name="labs"
              value="21"
              c:identifier="VIPS_INTERPRETATION_LABS"
              glib:nick="labs"
              glib:name="VIPS_INTERPRETATION_LABS">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="219">CIE LAB coded as three signed 16-bit values</doc>
      </member>
      <member name="srgb"
              value="22"
              c:identifier="VIPS_INTERPRETATION_sRGB"
              glib:nick="srgb"
              glib:name="VIPS_INTERPRETATION_sRGB">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="220">pixels are sRGB</doc>
      </member>
      <member name="yxy"
              value="23"
              c:identifier="VIPS_INTERPRETATION_YXY"
              glib:nick="yxy"
              glib:name="VIPS_INTERPRETATION_YXY">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="223">pixels are CIE Yxy</doc>
      </member>
      <member name="fourier"
              value="24"
              c:identifier="VIPS_INTERPRETATION_FOURIER"
              glib:nick="fourier"
              glib:name="VIPS_INTERPRETATION_FOURIER">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="211">image is in fourier space</doc>
      </member>
      <member name="rgb16"
              value="25"
              c:identifier="VIPS_INTERPRETATION_RGB16"
              glib:nick="rgb16"
              glib:name="VIPS_INTERPRETATION_RGB16">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="224">generic 16-bit RGB</doc>
      </member>
      <member name="grey16"
              value="26"
              c:identifier="VIPS_INTERPRETATION_GREY16"
              glib:nick="grey16"
              glib:name="VIPS_INTERPRETATION_GREY16">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="225">generic 16-bit mono</doc>
      </member>
      <member name="matrix"
              value="27"
              c:identifier="VIPS_INTERPRETATION_MATRIX"
              glib:nick="matrix"
              glib:name="VIPS_INTERPRETATION_MATRIX">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="226">a matrix</doc>
      </member>
      <member name="scrgb"
              value="28"
              c:identifier="VIPS_INTERPRETATION_scRGB"
              glib:nick="scrgb"
              glib:name="VIPS_INTERPRETATION_scRGB">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="222">pixels are scRGB</doc>
      </member>
      <member name="hsv"
              value="29"
              c:identifier="VIPS_INTERPRETATION_HSV"
              glib:nick="hsv"
              glib:name="VIPS_INTERPRETATION_HSV">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="221">pixels are HSV</doc>
      </member>
      <member name="last"
              value="30"
              c:identifier="VIPS_INTERPRETATION_LAST"
              glib:nick="last"
              glib:name="VIPS_INTERPRETATION_LAST">
      </member>
      <function name="max_alpha" c:identifier="vips_interpretation_max_alpha">
        <source-position filename="libvips/include/vips/header.h" line="187"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="239">the maximum alpha value for an interpretation.</doc>
          <type name="gdouble" c:type="double"/>
        </return-value>
        <parameters>
          <parameter name="interpretation" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/header.c"
                 line="237">image interpretation</doc>
            <type name="Interpretation" c:type="VipsInterpretation"/>
          </parameter>
        </parameters>
      </function>
    </enumeration>
    <enumeration name="Kernel"
                 glib:type-name="VipsKernel"
                 glib:get-type="vips_kernel_get_type"
                 c:type="VipsKernel">
      <doc xml:space="preserve"
           filename="libvips/resample/reduce.c"
           line="61">The resampling kernels vips supports. See vips_reduce(), for example.</doc>
      <member name="nearest"
              value="0"
              c:identifier="VIPS_KERNEL_NEAREST"
              glib:nick="nearest"
              glib:name="VIPS_KERNEL_NEAREST">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="63">The nearest pixel to the point.</doc>
      </member>
      <member name="linear"
              value="1"
              c:identifier="VIPS_KERNEL_LINEAR"
              glib:nick="linear"
              glib:name="VIPS_KERNEL_LINEAR">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="64">Convolve with a triangle filter.</doc>
      </member>
      <member name="cubic"
              value="2"
              c:identifier="VIPS_KERNEL_CUBIC"
              glib:nick="cubic"
              glib:name="VIPS_KERNEL_CUBIC">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="65">Convolve with a cubic filter.</doc>
      </member>
      <member name="mitchell"
              value="3"
              c:identifier="VIPS_KERNEL_MITCHELL"
              glib:nick="mitchell"
              glib:name="VIPS_KERNEL_MITCHELL">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="66">Convolve with a Mitchell kernel.</doc>
      </member>
      <member name="lanczos2"
              value="4"
              c:identifier="VIPS_KERNEL_LANCZOS2"
              glib:nick="lanczos2"
              glib:name="VIPS_KERNEL_LANCZOS2">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="67">Convolve with a two-lobe Lanczos kernel.</doc>
      </member>
      <member name="lanczos3"
              value="5"
              c:identifier="VIPS_KERNEL_LANCZOS3"
              glib:nick="lanczos3"
              glib:name="VIPS_KERNEL_LANCZOS3">
        <doc xml:space="preserve"
             filename="libvips/resample/reduce.c"
             line="68">Convolve with a three-lobe Lanczos kernel.</doc>
      </member>
      <member name="last"
              value="6"
              c:identifier="VIPS_KERNEL_LAST"
              glib:nick="last"
              glib:name="VIPS_KERNEL_LAST">
      </member>
    </enumeration>
    <constant name="LIBRARY_AGE" value="18" c:type="VIPS_LIBRARY_AGE">
      <source-position filename="libvips/include/vips/version.h" line="17"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="LIBRARY_CURRENT" value="60" c:type="VIPS_LIBRARY_CURRENT">
      <source-position filename="libvips/include/vips/version.h" line="15"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="LIBRARY_REVISION" value="1" c:type="VIPS_LIBRARY_REVISION">
      <source-position filename="libvips/include/vips/version.h" line="16"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="MAGIC_INTEL" value="3064394248" c:type="VIPS_MAGIC_INTEL">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="143">The first four bytes of a VIPS file in Intel byte ordering.</doc>
      <source-position filename="libvips/include/vips/image.h" line="54"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="MAGIC_SPARC" value="150120118" c:type="VIPS_MAGIC_SPARC">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="149">The first four bytes of a VIPS file in SPARC byte ordering.</doc>
      <source-position filename="libvips/include/vips/image.h" line="55"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="MAJOR_VERSION" value="8" c:type="VIPS_MAJOR_VERSION">
      <source-position filename="libvips/include/vips/version.h" line="9"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <function-macro name="MALLOC"
                    c:identifier="VIPS_MALLOC"
                    introspectable="0">
      <source-position filename="libvips/include/vips/memory.h" line="67"/>
      <parameters>
        <parameter name="OBJ">
        </parameter>
        <parameter name="S">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="MATRIX"
                    c:identifier="VIPS_MATRIX"
                    introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="349">This macro returns a pointer to a pixel in an image, cast to a double*. The
image must have a single band, be #VIPS_FORMAT_DOUBLE and be
fully available in memory, so memory buffers and small
mapped images only.

If VIPS_DEBUG is defined, you get a version that checks bounds and image
type for you.

See also: vips_image_wio_input(), vips_image_inplace(), vips_check_matrix().</doc>
      <source-position filename="libvips/include/vips/image.h" line="424"/>
      <parameters>
        <parameter name="I">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="351">a #VipsImage</doc>
        </parameter>
        <parameter name="X">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="352">x coordinate</doc>
        </parameter>
        <parameter name="Y">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="353">y coordinate</doc>
        </parameter>
      </parameters>
    </function-macro>
    <constant name="META_BITS_PER_SAMPLE"
              value="bits-per-sample"
              c:type="VIPS_META_BITS_PER_SAMPLE">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="95">The bits per sample for each channel.</doc>
      <source-position filename="libvips/include/vips/header.h" line="100"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_CONCURRENCY"
              value="concurrency"
              c:type="VIPS_META_CONCURRENCY">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="174">If set, the suggested concurrency for this image.</doc>
      <source-position filename="libvips/include/vips/header.h" line="179"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_EXIF_NAME"
              value="exif-data"
              c:type="VIPS_META_EXIF_NAME">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="41">The name that read and write operations use for the image's EXIF data.</doc>
      <source-position filename="libvips/include/vips/header.h" line="46"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_ICC_NAME"
              value="icc-profile-data"
              c:type="VIPS_META_ICC_NAME">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="70">The name we use to attach an ICC profile. The file read and write
operations for TIFF, JPEG, PNG and others use this item of metadata to
attach and save ICC profiles. The profile is updated by the
vips_icc_transform() operations.</doc>
      <source-position filename="libvips/include/vips/header.h" line="78"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_IMAGEDESCRIPTION"
              value="image-description"
              c:type="VIPS_META_IMAGEDESCRIPTION">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="80">The IMAGEDESCRIPTION tag. Often has useful metadata.</doc>
      <source-position filename="libvips/include/vips/header.h" line="85"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_IPTC_NAME"
              value="iptc-data"
              c:type="VIPS_META_IPTC_NAME">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="55">The name that read and write operations use for the image's IPTC data.</doc>
      <source-position filename="libvips/include/vips/header.h" line="60"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_LOADER" value="vips-loader" c:type="VIPS_META_LOADER">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="109">Record the name of the original loader here. Handy for hinting file formats
and for debugging.</doc>
      <source-position filename="libvips/include/vips/header.h" line="115"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_N_PAGES" value="n-pages" c:type="VIPS_META_N_PAGES">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="160">If set, the number of pages in the original file.</doc>
      <source-position filename="libvips/include/vips/header.h" line="165"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_N_SUBIFDS"
              value="n-subifds"
              c:type="VIPS_META_N_SUBIFDS">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="167">If set, the number of subifds in the first page of the file.</doc>
      <source-position filename="libvips/include/vips/header.h" line="172"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_ORIENTATION"
              value="orientation"
              c:type="VIPS_META_ORIENTATION">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="126">The orientation tag for this image. An int from 1 - 8 using the standard
exif/tiff meanings.

* 1 - The 0th row represents the visual top of the image, and the 0th column
  represents the visual left-hand side.
* 2 - The 0th row represents the visual top of the image, and the 0th column
  represents the visual right-hand side.
* 3 - The 0th row represents the visual bottom of the image, and the 0th
  column represents the visual right-hand side.
* 4 - The 0th row represents the visual bottom of the image, and the 0th
  column represents the visual left-hand side.
* 5 - The 0th row represents the visual left-hand side of the image, and the
  0th column represents the visual top.
* 6 - The 0th row represents the visual right-hand side of the image, and the
  0th column represents the visual top.
* 7 - The 0th row represents the visual right-hand side of the image, and the
  0th column represents the visual bottom.
* 8 - The 0th row represents the visual left-hand side of the image, and the
  0th column represents the visual bottom.</doc>
      <source-position filename="libvips/include/vips/header.h" line="149"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_PAGE_HEIGHT"
              value="page-height"
              c:type="VIPS_META_PAGE_HEIGHT">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="151">If set, the height of each page when this image was loaded. If you save an
image with "page-height" set to a format that supports multiple pages, such
as tiff, the image will be saved as a series of pages.</doc>
      <source-position filename="libvips/include/vips/header.h" line="158"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_PALETTE" value="palette" c:type="VIPS_META_PALETTE">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="102">Does this image have a palette?</doc>
      <source-position filename="libvips/include/vips/header.h" line="107"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_PHOTOSHOP_NAME"
              value="photoshop-data"
              c:type="VIPS_META_PHOTOSHOP_NAME">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="62">The name that TIFF read and write operations use for the image's
TIFFTAG_PHOTOSHOP data.</doc>
      <source-position filename="libvips/include/vips/header.h" line="68"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_RESOLUTION_UNIT"
              value="resolution-unit"
              c:type="VIPS_META_RESOLUTION_UNIT">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="87">The JPEG and TIFF read and write operations use this to record the
file's preferred unit for resolution.</doc>
      <source-position filename="libvips/include/vips/header.h" line="93"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_SEQUENTIAL"
              value="vips-sequential"
              c:type="VIPS_META_SEQUENTIAL">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="117">Images loaded via vips_sequential() have this int field defined. Some
operations (eg. vips_shrinkv()) add extra caches if they see it on their
input.</doc>
      <source-position filename="libvips/include/vips/header.h" line="124"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="META_XMP_NAME"
              value="xmp-data"
              c:type="VIPS_META_XMP_NAME">
      <doc xml:space="preserve"
           filename="libvips/include/vips/header.h"
           line="48">The name that read and write operations use for the image's XMP data.</doc>
      <source-position filename="libvips/include/vips/header.h" line="53"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="MICRO_VERSION" value="1" c:type="VIPS_MICRO_VERSION">
      <source-position filename="libvips/include/vips/version.h" line="11"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="MINOR_VERSION" value="16" c:type="VIPS_MINOR_VERSION">
      <source-position filename="libvips/include/vips/version.h" line="10"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <function-macro name="NEW" c:identifier="VIPS_NEW" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="120">Allocate memory for a thing of type @T. The memory is not
cleared.

This macro cannot fail. See vips_tracked_malloc() if you are
allocating large amounts of memory.

See also: vips_malloc().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="69"/>
      <parameters>
        <parameter name="OBJ">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="122">allocate memory local to @OBJ, or %NULL for no auto-free</doc>
        </parameter>
        <parameter name="T">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="123">type of thing to allocate</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="OPERATION"
                    c:identifier="VIPS_OPERATION"
                    introspectable="0">
      <source-position filename="libvips/include/vips/operation.h" line="56"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="OPERATION_CLASS"
                    c:identifier="VIPS_OPERATION_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/operation.h" line="59"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="OPERATION_GET_CLASS"
                    c:identifier="VIPS_OPERATION_GET_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/operation.h" line="66"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <class name="Object"
           c:symbol-prefix="object"
           c:type="VipsObject"
           parent="GObject.Object"
           abstract="1"
           glib:type-name="VipsObject"
           glib:get-type="vips_object_get_type"
           glib:type-struct="ObjectClass">
      <source-position filename="libvips/include/vips/object.h" line="594"/>
      <constructor name="new"
                   c:identifier="vips_object_new"
                   introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2351">g_object_new() the object, set any arguments with @set, call
vips_object_build() and return the complete object.</doc>
        <source-position filename="libvips/include/vips/object.h" line="652"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2361">the new object</doc>
          <type name="Object" c:type="VipsObject*"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2353">object to create</doc>
            <type name="GType" c:type="GType"/>
          </parameter>
          <parameter name="set" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2354">set arguments with this</doc>
            <type name="ObjectSetArguments" c:type="VipsObjectSetArguments"/>
          </parameter>
          <parameter name="a"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2355">client data</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
          <parameter name="b"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2356">client data</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_string"
                   c:identifier="vips_object_new_from_string">
        <source-position filename="libvips/include/vips/object.h" line="664"/>
        <return-value transfer-ownership="full">
          <type name="Object" c:type="VipsObject*"/>
        </return-value>
        <parameters>
          <parameter name="object_class" transfer-ownership="none">
            <type name="ObjectClass" c:type="VipsObjectClass*"/>
          </parameter>
          <parameter name="p" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="get_property" c:identifier="vips_object_get_property">
        <source-position filename="libvips/include/vips/object.h" line="602"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="gobject" transfer-ownership="none">
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
          <parameter name="property_id" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
          <parameter name="pspec" transfer-ownership="none">
            <type name="GObject.ParamSpec" c:type="GParamSpec*"/>
          </parameter>
        </parameters>
      </function>
      <function name="map" c:identifier="vips_object_map" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2722">Call a function for all alive objects.
Stop when @fn returns non-%NULL and return that value.</doc>
        <source-position filename="libvips/include/vips/object.h" line="670"/>
        <return-value transfer-ownership="none" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2731">%NULL if @fn returns %NULL for all arguments, otherwise the first
non-%NULL value from @fn.</doc>
          <type name="gpointer" c:type="void*"/>
        </return-value>
        <parameters>
          <parameter name="fn" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2724">function to call for all objects</doc>
            <type name="SListMap2Fn" c:type="VipsSListMap2Fn"/>
          </parameter>
          <parameter name="a"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2725">client data</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
          <parameter name="b"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2726">client data</doc>
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </function>
      <function name="print_all" c:identifier="vips_object_print_all">
        <source-position filename="libvips/include/vips/object.h" line="703"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </function>
      <function name="print_summary_class"
                c:identifier="vips_object_print_summary_class">
        <source-position filename="libvips/include/vips/object.h" line="618"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="klass" transfer-ownership="none">
            <type name="ObjectClass" c:type="VipsObjectClass*"/>
          </parameter>
        </parameters>
      </function>
      <function name="sanity_all" c:identifier="vips_object_sanity_all">
        <source-position filename="libvips/include/vips/object.h" line="705"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </function>
      <function name="set_property" c:identifier="vips_object_set_property">
        <source-position filename="libvips/include/vips/object.h" line="599"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="gobject" transfer-ownership="none">
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
          <parameter name="property_id" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <type name="GObject.Value" c:type="const GValue*"/>
          </parameter>
          <parameter name="pspec" transfer-ownership="none">
            <type name="GObject.ParamSpec" c:type="GParamSpec*"/>
          </parameter>
        </parameters>
      </function>
      <function name="summary_class"
                c:identifier="vips_object_summary_class"
                introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="394">Generate a human-readable summary for a class.</doc>
        <source-position filename="libvips/include/vips/object.h" line="611"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="klass" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="396">class to summarise</doc>
            <type name="ObjectClass" c:type="VipsObjectClass*"/>
          </parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="397">write summary here</doc>
            <type name="Buf" c:type="VipsBuf*"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="build" invoker="build">
        <source-position filename="libvips/include/vips/object.h" line="484"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="close">
        <source-position filename="libvips/include/vips/object.h" line="521"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="dump" invoker="dump" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="422">Dump everything that vips knows about an object to a string.</doc>
        <source-position filename="libvips/include/vips/object.h" line="503"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="424">object to dump</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="425">write dump here</doc>
            <type name="Buf" c:type="VipsBuf*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="output_to_arg">
        <source-position filename="libvips/include/vips/object.h" line="553"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="string" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="postbuild">
        <source-position filename="libvips/include/vips/object.h" line="488"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="data"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <type name="gpointer" c:type="void*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="postclose">
        <source-position filename="libvips/include/vips/object.h" line="526"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="preclose" invoker="preclose">
        <source-position filename="libvips/include/vips/object.h" line="517"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="rewind" invoker="rewind">
        <source-position filename="libvips/include/vips/object.h" line="513"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="sanity">
        <source-position filename="libvips/include/vips/object.h" line="508"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <type name="Buf" c:type="VipsBuf*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="summary" invoker="summary" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="407">Generate a human-readable summary for an object.</doc>
        <source-position filename="libvips/include/vips/object.h" line="499"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="409">object to summarise</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="410">write summary here</doc>
            <type name="Buf" c:type="VipsBuf*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="to_string" invoker="to_string">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2677">The inverse of vips_object_new_from_string(): turn @object into eg.
"VipsInterpolateSnohalo1(blur=.333333)".</doc>
        <source-position filename="libvips/include/vips/object.h" line="542"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2679">object to stringify</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2680">write string here</doc>
            <type name="Buf" c:type="VipsBuf*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="argument_isset" c:identifier="vips_object_argument_isset">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="801">Convenience: has an argument been assigned. Useful for bindings.</doc>
        <source-position filename="libvips/include/vips/object.h" line="346"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="808">%TRUE if the argument has been assigned.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="803">the object to fetch the args from</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="804">arg to fetch</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="argument_needsstring"
              c:identifier="vips_object_argument_needsstring">
        <source-position filename="libvips/include/vips/object.h" line="642"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="build" c:identifier="vips_object_build">
        <source-position filename="libvips/include/vips/object.h" line="608"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="dump" c:identifier="vips_object_dump" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="422">Dump everything that vips knows about an object to a string.</doc>
        <source-position filename="libvips/include/vips/object.h" line="615"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="424">object to dump</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="425">write dump here</doc>
            <type name="Buf" c:type="VipsBuf*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_args"
              c:identifier="vips_object_get_args"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2307">Get all %GParamSpec names and #VipsArgumentFlags for an object.

This is handy for language bindings. From C, it's usually more convenient to
use vips_argument_map().</doc>
        <source-position filename="libvips/include/vips/object.h" line="330"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2319">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2309">object whose args should be retrieved</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="names"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2310">output array of %GParamSpec names</doc>
            <array length="2" zero-terminated="0" c:type="const char***">
              <type name="utf8" c:type="char**"/>
            </array>
          </parameter>
          <parameter name="flags"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2311">output array of #VipsArgumentFlags</doc>
            <array length="2" zero-terminated="0" c:type="int**">
              <type name="gint" c:type="int*"/>
            </array>
          </parameter>
          <parameter name="n_args"
                     transfer-ownership="none"
                     nullable="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2312">length of output arrays</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_argument"
              c:identifier="vips_object_get_argument"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="761">Look up the three things you need to work with a vips argument.</doc>
        <source-position filename="libvips/include/vips/object.h" line="341"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="771">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="763">the object to fetch the args from</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="764">arg to fetch</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="pspec" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="765">the pspec for this arg</doc>
            <type name="GObject.ParamSpec" c:type="GParamSpec**"/>
          </parameter>
          <parameter name="argument_class" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="766">the argument_class for this arg</doc>
            <type name="ArgumentClass" c:type="VipsArgumentClass**"/>
          </parameter>
          <parameter name="argument_instance" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="767">the argument_instance for this arg</doc>
            <type name="ArgumentInstance" c:type="VipsArgumentInstance**"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_argument_flags"
              c:identifier="vips_object_get_argument_flags">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="824">Convenience: get the flags for an argument. Useful for bindings.</doc>
        <source-position filename="libvips/include/vips/object.h" line="348"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="831">The #VipsArgumentFlags for this argument.</doc>
          <type name="ArgumentFlags" c:type="VipsArgumentFlags"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="826">the object to fetch the args from</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="827">arg to fetch</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_argument_priority"
              c:identifier="vips_object_get_argument_priority">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="847">Convenience: get the priority for an argument. Useful for bindings.</doc>
        <source-position filename="libvips/include/vips/object.h" line="351"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="854">The priority of this argument.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="849">the object to fetch the args from</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="850">arg to fetch</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_argument_to_string"
              c:identifier="vips_object_get_argument_to_string">
        <source-position filename="libvips/include/vips/object.h" line="645"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="arg" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_description"
              c:identifier="vips_object_get_description"
              glib:get-property="description">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="3246">Fetch the object description. Useful for language bindings.

@object.description is only available after _build(), which can be too
late. This function fetches from the instance, if possible, but falls back
to the class description if we are too early.</doc>
        <source-position filename="libvips/include/vips/object.h" line="714"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="3256">the object description</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="3248">object to fetch description from</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="local_array"
              c:identifier="vips_object_local_array"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="3057">Make an array of NULL VipsObject pointers. When @parent closes, every
non-NULL pointer in the array will be unreffed and the array will be
freed. Handy for creating a set of temporary images for a function.

The array is NULL-terminated, ie. contains an extra NULL element at the
end.

Example:

|[
VipsObject **t;

t = vips_object_local_array(parent, 5);
if (vips_add(a, b, &amp;t[0], NULL) ||
    vips_invert(t[0], &amp;t[1], NULL) ||
    vips_add(t[1], t[0], &amp;t[2], NULL) ||
    vips_costra(t[2], out, NULL))
  return -1;
]|

See also: vips_object_local().</doc>
        <source-position filename="libvips/include/vips/object.h" line="693"/>
        <return-value>
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="3084">an array of NULL pointers of length @n</doc>
          <type name="Object" c:type="VipsObject**"/>
        </return-value>
        <parameters>
          <instance-parameter name="parent" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="3059">objects unref when this object unrefs</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="3060">array size</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="local_cb" c:identifier="vips_object_local_cb">
        <source-position filename="libvips/include/vips/object.h" line="696"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="vobject" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="gobject" transfer-ownership="none">
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
        </parameters>
      </method>
      <method name="preclose" c:identifier="vips_object_preclose">
        <source-position filename="libvips/include/vips/object.h" line="606"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="print_dump" c:identifier="vips_object_print_dump">
        <source-position filename="libvips/include/vips/object.h" line="622"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="print_name" c:identifier="vips_object_print_name">
        <source-position filename="libvips/include/vips/object.h" line="624"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="print_summary" c:identifier="vips_object_print_summary">
        <source-position filename="libvips/include/vips/object.h" line="620"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="rewind" c:identifier="vips_object_rewind">
        <source-position filename="libvips/include/vips/object.h" line="708"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="sanity" c:identifier="vips_object_sanity">
        <source-position filename="libvips/include/vips/object.h" line="627"/>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="set" c:identifier="vips_object_set" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2424">Set a list of vips object arguments. For example:

|[
vips_object_set(operation,
    "input", in,
    "output", &amp;out,
    NULL);
]|

Input arguments are given in-line, output arguments are given as pointers
to where the output value should be written.

See also: vips_object_set_valist(), vips_object_set_from_string().</doc>
        <source-position filename="libvips/include/vips/object.h" line="658"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2443">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2426">object to set arguments on</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="..." transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2427">%NULL-terminated list of argument/value pairs</doc>
            <varargs/>
          </parameter>
        </parameters>
      </method>
      <method name="set_argument_from_string"
              c:identifier="vips_object_set_argument_from_string">
        <source-position filename="libvips/include/vips/object.h" line="639"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="name" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_from_string"
              c:identifier="vips_object_set_from_string">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2555">Set object arguments from a string. The string can be something like
"a=12", or "a = 12, b = 13", or "fred". The string can optionally be
enclosed in brackets.

You'd typically use this between creating the object and building it.

See also: vips_object_set(), vips_object_build(),
vips_cache_operation_buildp().</doc>
        <source-position filename="libvips/include/vips/object.h" line="661"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2569">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2557">object to set arguments on</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="string" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2558">arguments as a string</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_required" c:identifier="vips_object_set_required">
        <source-position filename="libvips/include/vips/object.h" line="648"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="value" transfer-ownership="none">
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_static" c:identifier="vips_object_set_static">
        <source-position filename="libvips/include/vips/object.h" line="701"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="static_object" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_valist"
              c:identifier="vips_object_set_valist"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2385">See vips_object_set().</doc>
        <source-position filename="libvips/include/vips/object.h" line="656"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2392">0 on success, -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2387">object to set arguments on</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="ap" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2388">%NULL-terminated list of argument/value pairs</doc>
            <type name="va_list" c:type="va_list"/>
          </parameter>
        </parameters>
      </method>
      <method name="summary"
              c:identifier="vips_object_summary"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="407">Generate a human-readable summary for an object.</doc>
        <source-position filename="libvips/include/vips/object.h" line="613"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="409">object to summarise</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="410">write summary here</doc>
            <type name="Buf" c:type="VipsBuf*"/>
          </parameter>
        </parameters>
      </method>
      <method name="to_string" c:identifier="vips_object_to_string">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2677">The inverse of vips_object_new_from_string(): turn @object into eg.
"VipsInterpolateSnohalo1(blur=.333333)".</doc>
        <source-position filename="libvips/include/vips/object.h" line="667"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2679">object to stringify</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
          <parameter name="buf" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="2680">write string here</doc>
            <type name="Buf" c:type="VipsBuf*"/>
          </parameter>
        </parameters>
      </method>
      <method name="unref_outputs" c:identifier="vips_object_unref_outputs">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="3226">Unref all assigned output objects. Useful for language bindings.

After an object is built, all output args are owned by the caller. If
something goes wrong before then, we have to unref the outputs that have
been made so far. This function can also be useful for callers when
they've finished processing outputs themselves.

See also: vips_cache_operation_build().</doc>
        <source-position filename="libvips/include/vips/object.h" line="711"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="object" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/object.c"
                 line="3228">object to drop output refs from</doc>
            <type name="Object" c:type="VipsObject*"/>
          </instance-parameter>
        </parameters>
      </method>
      <property name="description"
                writable="1"
                transfer-ownership="none"
                getter="get_description">
        <type name="utf8" c:type="gchar*"/>
      </property>
      <property name="nickname" writable="1" transfer-ownership="none">
        <type name="utf8" c:type="gchar*"/>
      </property>
      <field name="parent_instance">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="constructed">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="static_object">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="argument_table">
        <type name="ArgumentTable" c:type="VipsArgumentTable*"/>
      </field>
      <field name="nickname">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="description">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="preclose">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="close">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="postclose">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="local_memory">
        <type name="gsize" c:type="size_t"/>
      </field>
      <glib:signal name="close" when="last">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="1645">The ::close signal is emitted once during object close. The object
is dying and may not work.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </glib:signal>
      <glib:signal name="postbuild" when="last">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="1615">The ::postbuild signal is emitted once just after successful object
construction. Return non-zero to cause object construction to fail.</doc>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="gint"/>
        </return-value>
      </glib:signal>
      <glib:signal name="postclose" when="last">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="1660">The ::postclose signal is emitted once after object close. The
object pointer is still valid, but nothing else.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </glib:signal>
      <glib:signal name="preclose" when="last">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="1630">The ::preclose signal is emitted once just before object close
starts. The object is still alive.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </glib:signal>
    </class>
    <record name="ObjectClass"
            c:type="VipsObjectClass"
            glib:is-gtype-struct-for="Object">
      <source-position filename="libvips/include/vips/object.h" line="594"/>
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="build">
        <callback name="build">
          <source-position filename="libvips/include/vips/object.h"
                           line="484"/>
          <return-value transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="postbuild">
        <callback name="postbuild">
          <source-position filename="libvips/include/vips/object.h"
                           line="488"/>
          <return-value transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
            <parameter name="data"
                       transfer-ownership="none"
                       nullable="1"
                       allow-none="1">
              <type name="gpointer" c:type="void*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="summary_class">
        <callback name="summary_class">
          <source-position filename="libvips/include/vips/object.h"
                           line="493"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="cls" transfer-ownership="none">
              <type name="gpointer" c:type="_VipsObjectClass*"/>
            </parameter>
            <parameter name="buf" transfer-ownership="none">
              <type name="Buf" c:type="VipsBuf*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="summary">
        <callback name="summary">
          <source-position filename="libvips/include/vips/object.h"
                           line="499"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/iofuncs/object.c"
                   line="409">object to summarise</doc>
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
            <parameter name="buf" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/iofuncs/object.c"
                   line="410">write summary here</doc>
              <type name="Buf" c:type="VipsBuf*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="dump">
        <callback name="dump">
          <source-position filename="libvips/include/vips/object.h"
                           line="503"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/iofuncs/object.c"
                   line="424">object to dump</doc>
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
            <parameter name="buf" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/iofuncs/object.c"
                   line="425">write dump here</doc>
              <type name="Buf" c:type="VipsBuf*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="sanity">
        <callback name="sanity">
          <source-position filename="libvips/include/vips/object.h"
                           line="508"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
            <parameter name="buf" transfer-ownership="none">
              <type name="Buf" c:type="VipsBuf*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="rewind">
        <callback name="rewind">
          <source-position filename="libvips/include/vips/object.h"
                           line="513"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="preclose">
        <callback name="preclose">
          <source-position filename="libvips/include/vips/object.h"
                           line="517"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="close">
        <callback name="close">
          <source-position filename="libvips/include/vips/object.h"
                           line="521"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="postclose">
        <callback name="postclose">
          <source-position filename="libvips/include/vips/object.h"
                           line="526"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="new_from_string" introspectable="0">
        <callback name="new_from_string" introspectable="0">
          <source-position filename="libvips/include/vips/object.h"
                           line="537"/>
          <return-value>
            <type name="Object" c:type="VipsObject*"/>
          </return-value>
          <parameters>
            <parameter name="string" transfer-ownership="none">
              <type name="utf8" c:type="const char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="to_string">
        <callback name="to_string">
          <source-position filename="libvips/include/vips/object.h"
                           line="542"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/iofuncs/object.c"
                   line="2679">object to stringify</doc>
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
            <parameter name="buf" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/iofuncs/object.c"
                   line="2680">write string here</doc>
              <type name="Buf" c:type="VipsBuf*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="output_needs_arg">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="output_to_arg">
        <callback name="output_to_arg">
          <source-position filename="libvips/include/vips/object.h"
                           line="553"/>
          <return-value transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </return-value>
          <parameters>
            <parameter name="object" transfer-ownership="none">
              <type name="Object" c:type="VipsObject*"/>
            </parameter>
            <parameter name="string" transfer-ownership="none">
              <type name="utf8" c:type="const char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="nickname">
        <type name="utf8" c:type="const char*"/>
      </field>
      <field name="description">
        <type name="utf8" c:type="const char*"/>
      </field>
      <field name="argument_table">
        <type name="ArgumentTable" c:type="VipsArgumentTable*"/>
      </field>
      <field name="argument_table_traverse">
        <type name="GLib.SList" c:type="GSList*">
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
      <field name="argument_table_traverse_gtype">
        <type name="GType" c:type="GType"/>
      </field>
      <field name="deprecated">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="_vips_reserved1" introspectable="0">
        <callback name="_vips_reserved1">
          <source-position filename="libvips/include/vips/object.h"
                           line="590"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
        </callback>
      </field>
      <field name="_vips_reserved2" introspectable="0">
        <callback name="_vips_reserved2">
          <source-position filename="libvips/include/vips/object.h"
                           line="591"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
        </callback>
      </field>
      <field name="_vips_reserved3" introspectable="0">
        <callback name="_vips_reserved3">
          <source-position filename="libvips/include/vips/object.h"
                           line="592"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
        </callback>
      </field>
      <field name="_vips_reserved4" introspectable="0">
        <callback name="_vips_reserved4">
          <source-position filename="libvips/include/vips/object.h"
                           line="593"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
        </callback>
      </field>
      <method name="install_argument"
              c:identifier="vips_object_class_install_argument">
        <source-position filename="libvips/include/vips/object.h" line="635"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="cls" transfer-ownership="none">
            <type name="ObjectClass" c:type="VipsObjectClass*"/>
          </instance-parameter>
          <parameter name="pspec" transfer-ownership="none">
            <type name="GObject.ParamSpec" c:type="GParamSpec*"/>
          </parameter>
          <parameter name="flags" transfer-ownership="none">
            <type name="ArgumentFlags" c:type="VipsArgumentFlags"/>
          </parameter>
          <parameter name="priority" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="offset" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </method>
    </record>
    <callback name="ObjectSetArguments" c:type="VipsObjectSetArguments">
      <source-position filename="libvips/include/vips/object.h" line="650"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="object" transfer-ownership="none">
          <type name="Object" c:type="VipsObject*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <class name="Operation"
           c:symbol-prefix="operation"
           c:type="VipsOperation"
           parent="Object"
           abstract="1"
           glib:type-name="VipsOperation"
           glib:get-type="vips_operation_get_type"
           glib:type-struct="OperationClass">
      <source-position filename="libvips/include/vips/operation.h" line="101"/>
      <constructor name="new" c:identifier="vips_operation_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="726">Return a new #VipsOperation with the specified nickname. Useful for
language bindings.

You'll need to set any arguments and build the operation before you can use
it. See vips_call() for a higher-level way to make new operations.</doc>
        <source-position filename="libvips/include/vips/operation.h"
                         line="118"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/operation.c"
               line="736">the new operation.</doc>
          <type name="Operation" c:type="VipsOperation*"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/operation.c"
                 line="728">nickname of operation to create</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="block_set" c:identifier="vips_operation_block_set">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="1514">Set the block state on all operations in the libvips class hierarchy at
@name and below.

For example:

|[
vips_operation_block_set("VipsForeignLoad", TRUE);
vips_operation_block_set("VipsForeignLoadJpeg", FALSE);
]|

Will block all load operations, except JPEG.

Use `vips -l` at the command-line to see the class hierarchy.

This call does nothing if the named operation is not found.

See also: vips_block_untrusted_set().</doc>
        <source-position filename="libvips/include/vips/operation.h"
                         line="172"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/operation.c"
                 line="1516">set block state at this point and below</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
          <parameter name="state" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/operation.c"
                 line="1517">the block state to set</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="get_flags" invoker="get_flags">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="683">Returns the set of flags for this operation.</doc>
        <source-position filename="libvips/include/vips/operation.h"
                         line="94"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/operation.c"
               line="689">0 on success, or -1 on error.</doc>
          <type name="OperationFlags" c:type="VipsOperationFlags"/>
        </return-value>
        <parameters>
          <instance-parameter name="operation" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/operation.c"
                 line="685">operation to fetch flags from</doc>
            <type name="Operation" c:type="VipsOperation*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="invalidate" invoker="invalidate">
        <source-position filename="libvips/include/vips/operation.h"
                         line="100"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="operation" transfer-ownership="none">
            <type name="Operation" c:type="VipsOperation*"/>
          </instance-parameter>
        </parameters>
      </virtual-method>
      <method name="call_valist"
              c:identifier="vips_operation_call_valist"
              introspectable="0">
        <source-position filename="libvips/include/vips/operation.h"
                         line="116"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="operation" transfer-ownership="none">
            <type name="Operation" c:type="VipsOperation*"/>
          </instance-parameter>
          <parameter name="ap" transfer-ownership="none">
            <type name="va_list" c:type="va_list"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_flags" c:identifier="vips_operation_get_flags">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="683">Returns the set of flags for this operation.</doc>
        <source-position filename="libvips/include/vips/operation.h"
                         line="109"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/operation.c"
               line="689">0 on success, or -1 on error.</doc>
          <type name="OperationFlags" c:type="VipsOperationFlags"/>
        </return-value>
        <parameters>
          <instance-parameter name="operation" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/operation.c"
                 line="685">operation to fetch flags from</doc>
            <type name="Operation" c:type="VipsOperation*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="invalidate" c:identifier="vips_operation_invalidate">
        <source-position filename="libvips/include/vips/operation.h"
                         line="113"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="operation" transfer-ownership="none">
            <type name="Operation" c:type="VipsOperation*"/>
          </instance-parameter>
        </parameters>
      </method>
      <field name="parent_instance">
        <type name="Object" c:type="VipsObject"/>
      </field>
      <field name="hash">
        <type name="guint" c:type="guint"/>
      </field>
      <field name="found_hash">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="pixels">
        <type name="gint" c:type="int"/>
      </field>
      <glib:signal name="invalidate" when="last">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </glib:signal>
    </class>
    <enumeration name="OperationBoolean"
                 glib:type-name="VipsOperationBoolean"
                 glib:get-type="vips_operation_boolean_get_type"
                 c:type="VipsOperationBoolean">
      <doc xml:space="preserve"
           filename="libvips/include/vips/arithmetic.h"
           line="136">See also: vips_boolean().</doc>
      <member name="and"
              value="0"
              c:identifier="VIPS_OPERATION_BOOLEAN_AND"
              glib:nick="and"
              glib:name="VIPS_OPERATION_BOOLEAN_AND">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="138">&amp;</doc>
      </member>
      <member name="or"
              value="1"
              c:identifier="VIPS_OPERATION_BOOLEAN_OR"
              glib:nick="or"
              glib:name="VIPS_OPERATION_BOOLEAN_OR">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="139">|</doc>
      </member>
      <member name="eor"
              value="2"
              c:identifier="VIPS_OPERATION_BOOLEAN_EOR"
              glib:nick="eor"
              glib:name="VIPS_OPERATION_BOOLEAN_EOR">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="140">^</doc>
      </member>
      <member name="lshift"
              value="3"
              c:identifier="VIPS_OPERATION_BOOLEAN_LSHIFT"
              glib:nick="lshift"
              glib:name="VIPS_OPERATION_BOOLEAN_LSHIFT">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="141">&gt;&gt;</doc>
      </member>
      <member name="rshift"
              value="4"
              c:identifier="VIPS_OPERATION_BOOLEAN_RSHIFT"
              glib:nick="rshift"
              glib:name="VIPS_OPERATION_BOOLEAN_RSHIFT">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="142">&lt;&lt;</doc>
      </member>
      <member name="last"
              value="5"
              c:identifier="VIPS_OPERATION_BOOLEAN_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_BOOLEAN_LAST">
      </member>
    </enumeration>
    <callback name="OperationBuildFn" c:type="VipsOperationBuildFn">
      <source-position filename="libvips/include/vips/operation.h" line="70"/>
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="object" transfer-ownership="none">
          <type name="Object" c:type="VipsObject*"/>
        </parameter>
      </parameters>
    </callback>
    <record name="OperationClass"
            c:type="VipsOperationClass"
            glib:is-gtype-struct-for="Operation">
      <source-position filename="libvips/include/vips/operation.h" line="101"/>
      <field name="parent_class">
        <type name="ObjectClass" c:type="VipsObjectClass"/>
      </field>
      <field name="usage">
        <callback name="usage">
          <source-position filename="libvips/include/vips/operation.h"
                           line="90"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="cls" transfer-ownership="none">
              <type name="gpointer" c:type="_VipsOperationClass*"/>
            </parameter>
            <parameter name="buf" transfer-ownership="none">
              <type name="Buf" c:type="VipsBuf*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_flags">
        <callback name="get_flags">
          <source-position filename="libvips/include/vips/operation.h"
                           line="94"/>
          <return-value transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/operation.c"
                 line="689">0 on success, or -1 on error.</doc>
            <type name="OperationFlags" c:type="VipsOperationFlags"/>
          </return-value>
          <parameters>
            <parameter name="operation" transfer-ownership="none">
              <doc xml:space="preserve"
                   filename="libvips/iofuncs/operation.c"
                   line="685">operation to fetch flags from</doc>
              <type name="Operation" c:type="VipsOperation*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="flags">
        <type name="OperationFlags" c:type="VipsOperationFlags"/>
      </field>
      <field name="invalidate">
        <callback name="invalidate">
          <source-position filename="libvips/include/vips/operation.h"
                           line="100"/>
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="operation" transfer-ownership="none">
              <type name="Operation" c:type="VipsOperation*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <method name="print_usage"
              c:identifier="vips_operation_class_print_usage"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="699">Print a usage message for the operation to stdout.</doc>
        <source-position filename="libvips/include/vips/operation.h"
                         line="111"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="operation_class" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/operation.c"
                 line="701">class to print usage for</doc>
            <type name="OperationClass" c:type="VipsOperationClass*"/>
          </instance-parameter>
        </parameters>
      </method>
    </record>
    <enumeration name="OperationComplex"
                 glib:type-name="VipsOperationComplex"
                 glib:get-type="vips_operation_complex_get_type"
                 c:type="VipsOperationComplex">
      <doc xml:space="preserve"
           filename="libvips/include/vips/arithmetic.h"
           line="155">See also: vips_complex().</doc>
      <member name="polar"
              value="0"
              c:identifier="VIPS_OPERATION_COMPLEX_POLAR"
              glib:nick="polar"
              glib:name="VIPS_OPERATION_COMPLEX_POLAR">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="157">convert to polar coordinates</doc>
      </member>
      <member name="rect"
              value="1"
              c:identifier="VIPS_OPERATION_COMPLEX_RECT"
              glib:nick="rect"
              glib:name="VIPS_OPERATION_COMPLEX_RECT">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="158">convert to rectangular coordinates</doc>
      </member>
      <member name="conj"
              value="2"
              c:identifier="VIPS_OPERATION_COMPLEX_CONJ"
              glib:nick="conj"
              glib:name="VIPS_OPERATION_COMPLEX_CONJ">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="159">complex conjugate</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_OPERATION_COMPLEX_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_COMPLEX_LAST">
      </member>
    </enumeration>
    <enumeration name="OperationComplex2"
                 glib:type-name="VipsOperationComplex2"
                 glib:get-type="vips_operation_complex2_get_type"
                 c:type="VipsOperationComplex2">
      <doc xml:space="preserve"
           filename="libvips/include/vips/arithmetic.h"
           line="170">See also: vips_complex2().</doc>
      <member name="cross_phase"
              value="0"
              c:identifier="VIPS_OPERATION_COMPLEX2_CROSS_PHASE"
              glib:nick="cross-phase"
              glib:name="VIPS_OPERATION_COMPLEX2_CROSS_PHASE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="172">convert to polar coordinates</doc>
      </member>
      <member name="last"
              value="1"
              c:identifier="VIPS_OPERATION_COMPLEX2_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_COMPLEX2_LAST">
      </member>
    </enumeration>
    <enumeration name="OperationComplexget"
                 glib:type-name="VipsOperationComplexget"
                 glib:get-type="vips_operation_complexget_get_type"
                 c:type="VipsOperationComplexget">
      <doc xml:space="preserve"
           filename="libvips/include/vips/arithmetic.h"
           line="181">See also: vips_complexget().</doc>
      <member name="real"
              value="0"
              c:identifier="VIPS_OPERATION_COMPLEXGET_REAL"
              glib:nick="real"
              glib:name="VIPS_OPERATION_COMPLEXGET_REAL">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="183">get real component</doc>
      </member>
      <member name="imag"
              value="1"
              c:identifier="VIPS_OPERATION_COMPLEXGET_IMAG"
              glib:nick="imag"
              glib:name="VIPS_OPERATION_COMPLEXGET_IMAG">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="184">get imaginary component</doc>
      </member>
      <member name="last"
              value="2"
              c:identifier="VIPS_OPERATION_COMPLEXGET_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_COMPLEXGET_LAST">
      </member>
    </enumeration>
    <bitfield name="OperationFlags"
              glib:type-name="VipsOperationFlags"
              glib:get-type="vips_operation_flags_get_type"
              c:type="VipsOperationFlags">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/operation.c"
           line="168">Flags we associate with an operation.

@VIPS_OPERATION_SEQUENTIAL means that the operation works like vips_conv():
it can process images top-to-bottom with only small non-local
references.

Every scan-line must be requested, you are not allowed to skip
ahead, but as a special case, the very first request can be for a region
not at the top of the image. In this case, the first part of the image will
be read and discarded

Every scan-line must be requested, you are not allowed to skip
ahead, but as a special case, the very first request can be for a region
not at the top of the image. In this case, the first part of the image will
be read and discarded

@VIPS_OPERATION_NOCACHE means that the operation must not be cached by
vips.

@VIPS_OPERATION_DEPRECATED means this is an old operation kept in vips for
compatibility only and should be hidden from users.

@VIPS_OPERATION_UNTRUSTED means the operation depends on external libraries
which have not been hardened against attack. It should probably not be used
on untrusted input. Use vips_block_untrusted_set() to block all
untrusted operations.

@VIPS_OPERATION_BLOCKED means the operation is prevented from executing. Use
vips_operation_block_set() to enable and disable groups of operations.

@VIPS_OPERATION_REVALIDATE force the operation to run, updating the cache
with the new value. This is used by eg. VipsForeignLoad to implement the
"revalidate" argument.</doc>
      <member name="none"
              value="0"
              c:identifier="VIPS_OPERATION_NONE"
              glib:nick="none"
              glib:name="VIPS_OPERATION_NONE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="170">no flags</doc>
      </member>
      <member name="sequential"
              value="1"
              c:identifier="VIPS_OPERATION_SEQUENTIAL"
              glib:nick="sequential"
              glib:name="VIPS_OPERATION_SEQUENTIAL">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="171">can work sequentially with a small buffer</doc>
      </member>
      <member name="sequential_unbuffered"
              value="2"
              c:identifier="VIPS_OPERATION_SEQUENTIAL_UNBUFFERED"
              glib:nick="sequential-unbuffered"
              glib:name="VIPS_OPERATION_SEQUENTIAL_UNBUFFERED">
      </member>
      <member name="nocache"
              value="4"
              c:identifier="VIPS_OPERATION_NOCACHE"
              glib:nick="nocache"
              glib:name="VIPS_OPERATION_NOCACHE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="172">must not be cached</doc>
      </member>
      <member name="deprecated"
              value="8"
              c:identifier="VIPS_OPERATION_DEPRECATED"
              glib:nick="deprecated"
              glib:name="VIPS_OPERATION_DEPRECATED">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="173">a compatibility thing</doc>
      </member>
      <member name="untrusted"
              value="16"
              c:identifier="VIPS_OPERATION_UNTRUSTED"
              glib:nick="untrusted"
              glib:name="VIPS_OPERATION_UNTRUSTED">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="174">not hardened for untrusted input</doc>
      </member>
      <member name="blocked"
              value="32"
              c:identifier="VIPS_OPERATION_BLOCKED"
              glib:nick="blocked"
              glib:name="VIPS_OPERATION_BLOCKED">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="175">prevent this operation from running</doc>
      </member>
      <member name="revalidate"
              value="64"
              c:identifier="VIPS_OPERATION_REVALIDATE"
              glib:nick="revalidate"
              glib:name="VIPS_OPERATION_REVALIDATE">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="176">force the operation to run</doc>
      </member>
    </bitfield>
    <enumeration name="OperationMath"
                 glib:type-name="VipsOperationMath"
                 glib:get-type="vips_operation_math_get_type"
                 c:type="VipsOperationMath">
      <doc xml:space="preserve"
           filename="libvips/include/vips/arithmetic.h"
           line="44">See also: vips_math().</doc>
      <member name="sin"
              value="0"
              c:identifier="VIPS_OPERATION_MATH_SIN"
              glib:nick="sin"
              glib:name="VIPS_OPERATION_MATH_SIN">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="46">sin(), angles in degrees</doc>
      </member>
      <member name="cos"
              value="1"
              c:identifier="VIPS_OPERATION_MATH_COS"
              glib:nick="cos"
              glib:name="VIPS_OPERATION_MATH_COS">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="47">cos(), angles in degrees</doc>
      </member>
      <member name="tan"
              value="2"
              c:identifier="VIPS_OPERATION_MATH_TAN"
              glib:nick="tan"
              glib:name="VIPS_OPERATION_MATH_TAN">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="48">tan(), angles in degrees</doc>
      </member>
      <member name="asin"
              value="3"
              c:identifier="VIPS_OPERATION_MATH_ASIN"
              glib:nick="asin"
              glib:name="VIPS_OPERATION_MATH_ASIN">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="49">asin(), angles in degrees</doc>
      </member>
      <member name="acos"
              value="4"
              c:identifier="VIPS_OPERATION_MATH_ACOS"
              glib:nick="acos"
              glib:name="VIPS_OPERATION_MATH_ACOS">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="50">acos(), angles in degrees</doc>
      </member>
      <member name="atan"
              value="5"
              c:identifier="VIPS_OPERATION_MATH_ATAN"
              glib:nick="atan"
              glib:name="VIPS_OPERATION_MATH_ATAN">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="51">atan(), angles in degrees</doc>
      </member>
      <member name="log"
              value="6"
              c:identifier="VIPS_OPERATION_MATH_LOG"
              glib:nick="log"
              glib:name="VIPS_OPERATION_MATH_LOG">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="52">log base e</doc>
      </member>
      <member name="log10"
              value="7"
              c:identifier="VIPS_OPERATION_MATH_LOG10"
              glib:nick="log10"
              glib:name="VIPS_OPERATION_MATH_LOG10">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="53">log base 10</doc>
      </member>
      <member name="exp"
              value="8"
              c:identifier="VIPS_OPERATION_MATH_EXP"
              glib:nick="exp"
              glib:name="VIPS_OPERATION_MATH_EXP">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="54">e to the something</doc>
      </member>
      <member name="exp10"
              value="9"
              c:identifier="VIPS_OPERATION_MATH_EXP10"
              glib:nick="exp10"
              glib:name="VIPS_OPERATION_MATH_EXP10">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="55">10 to the something</doc>
      </member>
      <member name="sinh"
              value="10"
              c:identifier="VIPS_OPERATION_MATH_SINH"
              glib:nick="sinh"
              glib:name="VIPS_OPERATION_MATH_SINH">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="56">sinh(), angles in radians</doc>
      </member>
      <member name="cosh"
              value="11"
              c:identifier="VIPS_OPERATION_MATH_COSH"
              glib:nick="cosh"
              glib:name="VIPS_OPERATION_MATH_COSH">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="57">cosh(), angles in radians</doc>
      </member>
      <member name="tanh"
              value="12"
              c:identifier="VIPS_OPERATION_MATH_TANH"
              glib:nick="tanh"
              glib:name="VIPS_OPERATION_MATH_TANH">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="58">tanh(), angles in radians</doc>
      </member>
      <member name="asinh"
              value="13"
              c:identifier="VIPS_OPERATION_MATH_ASINH"
              glib:nick="asinh"
              glib:name="VIPS_OPERATION_MATH_ASINH">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="59">asinh(), angles in radians</doc>
      </member>
      <member name="acosh"
              value="14"
              c:identifier="VIPS_OPERATION_MATH_ACOSH"
              glib:nick="acosh"
              glib:name="VIPS_OPERATION_MATH_ACOSH">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="60">acosh(), angles in radians</doc>
      </member>
      <member name="atanh"
              value="15"
              c:identifier="VIPS_OPERATION_MATH_ATANH"
              glib:nick="atanh"
              glib:name="VIPS_OPERATION_MATH_ATANH">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="61">atanh(), angles in radians</doc>
      </member>
      <member name="last"
              value="16"
              c:identifier="VIPS_OPERATION_MATH_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_MATH_LAST">
      </member>
    </enumeration>
    <enumeration name="OperationMath2"
                 glib:type-name="VipsOperationMath2"
                 glib:get-type="vips_operation_math2_get_type"
                 c:type="VipsOperationMath2">
      <doc xml:space="preserve"
           filename="libvips/include/vips/arithmetic.h"
           line="85">See also: vips_math().</doc>
      <member name="pow"
              value="0"
              c:identifier="VIPS_OPERATION_MATH2_POW"
              glib:nick="pow"
              glib:name="VIPS_OPERATION_MATH2_POW">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="87">pow(left, right)</doc>
      </member>
      <member name="wop"
              value="1"
              c:identifier="VIPS_OPERATION_MATH2_WOP"
              glib:nick="wop"
              glib:name="VIPS_OPERATION_MATH2_WOP">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="88">pow(right, left)</doc>
      </member>
      <member name="atan2"
              value="2"
              c:identifier="VIPS_OPERATION_MATH2_ATAN2"
              glib:nick="atan2"
              glib:name="VIPS_OPERATION_MATH2_ATAN2">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="89">atan2(left, right)</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_OPERATION_MATH2_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_MATH2_LAST">
      </member>
    </enumeration>
    <enumeration name="OperationMorphology"
                 glib:type-name="VipsOperationMorphology"
                 glib:get-type="vips_operation_morphology_get_type"
                 c:type="VipsOperationMorphology">
      <doc xml:space="preserve"
           filename="libvips/morphology/morph.c"
           line="110">More like hit-miss, really.

See also: vips_morph().</doc>
      <member name="erode"
              value="0"
              c:identifier="VIPS_OPERATION_MORPHOLOGY_ERODE"
              glib:nick="erode"
              glib:name="VIPS_OPERATION_MORPHOLOGY_ERODE">
        <doc xml:space="preserve"
             filename="libvips/morphology/morph.c"
             line="112">true if all set</doc>
      </member>
      <member name="dilate"
              value="1"
              c:identifier="VIPS_OPERATION_MORPHOLOGY_DILATE"
              glib:nick="dilate"
              glib:name="VIPS_OPERATION_MORPHOLOGY_DILATE">
        <doc xml:space="preserve"
             filename="libvips/morphology/morph.c"
             line="113">true if one set</doc>
      </member>
      <member name="last"
              value="2"
              c:identifier="VIPS_OPERATION_MORPHOLOGY_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_MORPHOLOGY_LAST">
      </member>
    </enumeration>
    <enumeration name="OperationRelational"
                 glib:type-name="VipsOperationRelational"
                 glib:get-type="vips_operation_relational_get_type"
                 c:type="VipsOperationRelational">
      <doc xml:space="preserve"
           filename="libvips/include/vips/arithmetic.h"
           line="115">See also: vips_relational().</doc>
      <member name="equal"
              value="0"
              c:identifier="VIPS_OPERATION_RELATIONAL_EQUAL"
              glib:nick="equal"
              glib:name="VIPS_OPERATION_RELATIONAL_EQUAL">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="117">==</doc>
      </member>
      <member name="noteq"
              value="1"
              c:identifier="VIPS_OPERATION_RELATIONAL_NOTEQ"
              glib:nick="noteq"
              glib:name="VIPS_OPERATION_RELATIONAL_NOTEQ">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="118">!=</doc>
      </member>
      <member name="less"
              value="2"
              c:identifier="VIPS_OPERATION_RELATIONAL_LESS"
              glib:nick="less"
              glib:name="VIPS_OPERATION_RELATIONAL_LESS">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="119">&lt;</doc>
      </member>
      <member name="lesseq"
              value="3"
              c:identifier="VIPS_OPERATION_RELATIONAL_LESSEQ"
              glib:nick="lesseq"
              glib:name="VIPS_OPERATION_RELATIONAL_LESSEQ">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="120">&lt;=</doc>
      </member>
      <member name="more"
              value="4"
              c:identifier="VIPS_OPERATION_RELATIONAL_MORE"
              glib:nick="more"
              glib:name="VIPS_OPERATION_RELATIONAL_MORE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="121">&gt;</doc>
      </member>
      <member name="moreeq"
              value="5"
              c:identifier="VIPS_OPERATION_RELATIONAL_MOREEQ"
              glib:nick="moreeq"
              glib:name="VIPS_OPERATION_RELATIONAL_MOREEQ">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="122">&gt;=</doc>
      </member>
      <member name="last"
              value="6"
              c:identifier="VIPS_OPERATION_RELATIONAL_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_RELATIONAL_LAST">
      </member>
    </enumeration>
    <enumeration name="OperationRound"
                 glib:type-name="VipsOperationRound"
                 glib:get-type="vips_operation_round_get_type"
                 c:type="VipsOperationRound">
      <doc xml:space="preserve"
           filename="libvips/include/vips/arithmetic.h"
           line="100">See also: vips_round().</doc>
      <member name="rint"
              value="0"
              c:identifier="VIPS_OPERATION_ROUND_RINT"
              glib:nick="rint"
              glib:name="VIPS_OPERATION_ROUND_RINT">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="102">round to nearest</doc>
      </member>
      <member name="ceil"
              value="1"
              c:identifier="VIPS_OPERATION_ROUND_CEIL"
              glib:nick="ceil"
              glib:name="VIPS_OPERATION_ROUND_CEIL">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="104">the smallest integral value not less than</doc>
      </member>
      <member name="floor"
              value="2"
              c:identifier="VIPS_OPERATION_ROUND_FLOOR"
              glib:nick="floor"
              glib:name="VIPS_OPERATION_ROUND_FLOOR">
        <doc xml:space="preserve"
             filename="libvips/include/vips/arithmetic.h"
             line="103">largest integral value not greater than</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_OPERATION_ROUND_LAST"
              glib:nick="last"
              glib:name="VIPS_OPERATION_ROUND_LAST">
      </member>
    </enumeration>
    <enumeration name="PCS"
                 glib:type-name="VipsPCS"
                 glib:get-type="vips_pcs_get_type"
                 c:type="VipsPCS">
      <doc xml:space="preserve"
           filename="libvips/colour/icc_transform.c"
           line="115">Pick a Profile Connection Space for vips_icc_import() and
vips_icc_export(). LAB is usually best, XYZ can be more convenient in some
cases.</doc>
      <member name="lab"
              value="0"
              c:identifier="VIPS_PCS_LAB"
              glib:nick="lab"
              glib:name="VIPS_PCS_LAB">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="117">use CIELAB D65 as the Profile Connection Space</doc>
      </member>
      <member name="xyz"
              value="1"
              c:identifier="VIPS_PCS_XYZ"
              glib:nick="xyz"
              glib:name="VIPS_PCS_XYZ">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="118">use XYZ as the Profile Connection Space</doc>
      </member>
      <member name="last"
              value="2"
              c:identifier="VIPS_PCS_LAST"
              glib:nick="last"
              glib:name="VIPS_PCS_LAST">
      </member>
    </enumeration>
    <enumeration name="Precision"
                 glib:type-name="VipsPrecision"
                 glib:get-type="vips_precision_get_type"
                 c:type="VipsPrecision">
      <doc xml:space="preserve"
           filename="libvips/convolution/convolution.c"
           line="64">How accurate an operation should be.</doc>
      <member name="integer"
              value="0"
              c:identifier="VIPS_PRECISION_INTEGER"
              glib:nick="integer"
              glib:name="VIPS_PRECISION_INTEGER">
        <doc xml:space="preserve"
             filename="libvips/convolution/convolution.c"
             line="66">int everywhere</doc>
      </member>
      <member name="float"
              value="1"
              c:identifier="VIPS_PRECISION_FLOAT"
              glib:nick="float"
              glib:name="VIPS_PRECISION_FLOAT">
        <doc xml:space="preserve"
             filename="libvips/convolution/convolution.c"
             line="67">float everywhere</doc>
      </member>
      <member name="approximate"
              value="2"
              c:identifier="VIPS_PRECISION_APPROXIMATE"
              glib:nick="approximate"
              glib:name="VIPS_PRECISION_APPROXIMATE">
        <doc xml:space="preserve"
             filename="libvips/convolution/convolution.c"
             line="68">approximate integer output</doc>
      </member>
      <member name="last"
              value="3"
              c:identifier="VIPS_PRECISION_LAST"
              glib:nick="last"
              glib:name="VIPS_PRECISION_LAST">
      </member>
    </enumeration>
    <record name="Progress" c:type="VipsProgress">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="275">A structure available to eval callbacks giving information on evaluation
progress. See #VipsImage::eval.</doc>
      <source-position filename="libvips/include/vips/image.h" line="167"/>
      <field name="im" readable="0" private="1">
        <type name="Image" c:type="VipsImage*"/>
      </field>
      <field name="run" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="277">Time we have been running</doc>
        <type name="gint" c:type="int"/>
      </field>
      <field name="eta" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="278">Estimated seconds of computation left</doc>
        <type name="gint" c:type="int"/>
      </field>
      <field name="tpels" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="279">Number of pels we expect to calculate</doc>
        <type name="gint64" c:type="gint64"/>
      </field>
      <field name="npels" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="280">Number of pels calculated so far</doc>
        <type name="gint64" c:type="gint64"/>
      </field>
      <field name="percent" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="281">Percent complete</doc>
        <type name="gint" c:type="int"/>
      </field>
      <field name="start" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="282">Start time</doc>
        <type name="GLib.Timer" c:type="GTimer*"/>
      </field>
      <function name="set" c:identifier="vips_progress_set">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="397">If set, vips will print messages about the progress of computation to
stdout. This can also be enabled with the --vips-progress option, or by
setting the environment variable VIPS_PROGRESS.</doc>
        <source-position filename="libvips/include/vips/image.h" line="436"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="progress" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/image.c"
                 line="399">%TRUE to enable progress messages</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </function>
    </record>
    <function-macro name="RECT_BOTTOM"
                    c:identifier="VIPS_RECT_BOTTOM"
                    introspectable="0">
      <source-position filename="libvips/include/vips/rect.h" line="49"/>
      <parameters>
        <parameter name="R">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="RECT_HCENTRE"
                    c:identifier="VIPS_RECT_HCENTRE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/rect.h" line="50"/>
      <parameters>
        <parameter name="R">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="RECT_RIGHT"
                    c:identifier="VIPS_RECT_RIGHT"
                    introspectable="0">
      <source-position filename="libvips/include/vips/rect.h" line="48"/>
      <parameters>
        <parameter name="R">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="RECT_VCENTRE"
                    c:identifier="VIPS_RECT_VCENTRE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/rect.h" line="51"/>
      <parameters>
        <parameter name="R">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION"
                    c:identifier="VIPS_REGION"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="51"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_ADDR"
                    c:identifier="VIPS_REGION_ADDR"
                    introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/region.c"
           line="165">This macro returns a pointer to a pixel in a region. The (@X, @Y)
coordinates need to be within the #VipsRect (@R-&gt;valid).

If DEBUG is defined, you get a version that checks bounds for you.

See also: vips_region_prepare().</doc>
      <source-position filename="libvips/include/vips/region.h" line="208"/>
      <parameters>
        <parameter name="R">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="167">a #VipsRegion</doc>
        </parameter>
        <parameter name="X">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="168">x coordinate</doc>
        </parameter>
        <parameter name="Y">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="169">y coordinate</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_ADDR_TOPLEFT"
                    c:identifier="VIPS_REGION_ADDR_TOPLEFT"
                    introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/region.c"
           line="181">This macro returns a pointer to the top-left pixel in the #VipsRegion, that
is, the pixel at (@R-&gt;valid.left, @R-&gt;valid.top).

See also: vips_region_prepare().</doc>
      <source-position filename="libvips/include/vips/region.h" line="232"/>
      <parameters>
        <parameter name="R">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="183">a #VipsRegion</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_CLASS"
                    c:identifier="VIPS_REGION_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="54"/>
      <parameters>
        <parameter name="klass">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_GET_CLASS"
                    c:identifier="VIPS_REGION_GET_CLASS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="61"/>
      <parameters>
        <parameter name="obj">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_LSKIP"
                    c:identifier="VIPS_REGION_LSKIP"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="194"/>
      <parameters>
        <parameter name="R">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="146">a #VipsRegion</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_N_ELEMENTS"
                    c:identifier="VIPS_REGION_N_ELEMENTS"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="196"/>
      <parameters>
        <parameter name="R">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="153">a #VipsRegion</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_SIZEOF_ELEMENT"
                    c:identifier="VIPS_REGION_SIZEOF_ELEMENT"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="198"/>
      <parameters>
        <parameter name="R">
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_SIZEOF_LINE"
                    c:identifier="VIPS_REGION_SIZEOF_LINE"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="202"/>
      <parameters>
        <parameter name="R">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="160">a #VipsRegion</doc>
        </parameter>
      </parameters>
    </function-macro>
    <function-macro name="REGION_SIZEOF_PEL"
                    c:identifier="VIPS_REGION_SIZEOF_PEL"
                    introspectable="0">
      <source-position filename="libvips/include/vips/region.h" line="200"/>
      <parameters>
        <parameter name="R">
        </parameter>
      </parameters>
    </function-macro>
    <record name="Rect" c:type="VipsRect">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/rect.c"
           line="57">A #VipsRect is a rectangular area of pixels. This is a struct for
performing simple rectangle algebra.</doc>
      <source-position filename="libvips/include/vips/rect.h" line="46"/>
      <field name="left" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="59">left edge of rectangle</doc>
        <type name="gint" c:type="int"/>
      </field>
      <field name="top" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="60">top edge of rectangle</doc>
        <type name="gint" c:type="int"/>
      </field>
      <field name="width" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="61">width of rectangle</doc>
        <type name="gint" c:type="int"/>
      </field>
      <field name="height" writable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="62">height of rectangle</doc>
        <type name="gint" c:type="int"/>
      </field>
      <method name="dup" c:identifier="vips_rect_dup" introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="226">Duplicate a rect to the heap. You need to free the result with g_free().</doc>
        <source-position filename="libvips/include/vips/rect.h" line="72"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/rect.c"
               line="232">a pointer to copy of @r allocated on the heap.</doc>
          <type name="Rect" c:type="VipsRect*"/>
        </return-value>
        <parameters>
          <instance-parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="228">rectangle to duplicate</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="equalsrect" c:identifier="vips_rect_equalsrect">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="119">Is @r1 equal to @r2?</doc>
        <source-position filename="libvips/include/vips/rect.h" line="60"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/rect.c"
               line="126">%TRUE if @r1 is equal to @r2.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="r1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="121">first rectangle</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </instance-parameter>
          <parameter name="r2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="122">second rectangle</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="includespoint" c:identifier="vips_rect_includespoint">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="68">Does @r contain point (@x, @y)?</doc>
        <source-position filename="libvips/include/vips/rect.h" line="56"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/rect.c"
               line="76">%TRUE if @r contains (@x, @y).</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="70">rectangle to test</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </instance-parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="71">position to test for</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="72">position to test for</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="includesrect" c:identifier="vips_rect_includesrect">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="101">Is @r2 a subset of @r1?</doc>
        <source-position filename="libvips/include/vips/rect.h" line="58"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/rect.c"
               line="108">%TRUE if @r2 is a subset of @r1.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="r1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="103">outer rectangle</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </instance-parameter>
          <parameter name="r2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="104">inner rectangle</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="intersectrect" c:identifier="vips_rect_intersectrect">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="170">Fill @out with the intersection of @r1 and @r2. @out can equal @r1 or @r2.</doc>
        <source-position filename="libvips/include/vips/rect.h" line="66"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="r1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="172">input rectangle 1</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </instance-parameter>
          <parameter name="r2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="173">input rectangle 2</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="1"
                     transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="174">output rectangle</doc>
            <type name="Rect" c:type="VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="isempty" c:identifier="vips_rect_isempty">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="87">Is @r empty? ie. zero width or height.</doc>
        <source-position filename="libvips/include/vips/rect.h" line="54"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/rect.c"
               line="93">%TRUE if @r contains no pixels.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="89">rectangle to test</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="marginadjust" c:identifier="vips_rect_marginadjust">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="154">Enlarge @r by @n. +1 means out one pixel.</doc>
        <source-position filename="libvips/include/vips/rect.h" line="64"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="156">rectangle to adjust</doc>
            <type name="Rect" c:type="VipsRect*"/>
          </instance-parameter>
          <parameter name="n" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="157">enlarge by</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="normalise" c:identifier="vips_rect_normalise">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="246">Make sure width and height are &gt;0 by moving the origin and flipping the
rect.</doc>
        <source-position filename="libvips/include/vips/rect.h" line="74"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="248">rect to normalise</doc>
            <type name="Rect" c:type="VipsRect*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="overlapsrect" c:identifier="vips_rect_overlapsrect">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="135">Do @r1 and @r2 have a non-empty intersection?</doc>
        <source-position filename="libvips/include/vips/rect.h" line="62"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/rect.c"
               line="142">%TRUE if @r2 and @r1 overlap.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <instance-parameter name="r1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="137">first rectangle</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </instance-parameter>
          <parameter name="r2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="138">second rectangle</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="unionrect" c:identifier="vips_rect_unionrect">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/rect.c"
             line="194">Fill @out with the bounding box of @r1 and @r2. @out can equal @r1 or @r2.</doc>
        <source-position filename="libvips/include/vips/rect.h" line="69"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="r1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="196">input rectangle 1</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </instance-parameter>
          <parameter name="r2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="197">input rectangle 2</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
          <parameter name="out"
                     direction="out"
                     caller-allocates="1"
                     transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/rect.c"
                 line="198">output rectangle</doc>
            <type name="Rect" c:type="VipsRect*"/>
          </parameter>
        </parameters>
      </method>
    </record>
    <record name="RefString"
            c:type="VipsRefString"
            glib:type-name="VipsRefString"
            glib:get-type="vips_ref_string_get_type"
            c:symbol-prefix="ref_string">
      <source-position filename="libvips/include/vips/type.h" line="163"/>
      <field name="area" writable="1">
        <type name="Area" c:type="VipsArea"/>
      </field>
      <constructor name="new" c:identifier="vips_ref_string_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="562">Create a new refstring. These are reference-counted immutable strings, used
to store string data in vips image metadata.

Strings must be valid utf-8; use blob for binary data.

See also: vips_area_unref().</doc>
        <source-position filename="libvips/include/vips/type.h" line="166"/>
        <return-value transfer-ownership="full" nullable="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="573">the new #VipsRefString, or NULL on error.</doc>
          <type name="RefString" c:type="VipsRefString*"/>
        </return-value>
        <parameters>
          <parameter name="str" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="564">string to store</doc>
            <type name="utf8" c:type="const char*"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="get" c:identifier="vips_ref_string_get">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="591">Get a pointer to the private string inside a refstr. Handy for language
bindings.

See also: vips_value_get_ref_string().</doc>
        <source-position filename="libvips/include/vips/type.h" line="168"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="601">The C string held by @refstr.</doc>
          <type name="utf8" c:type="const char*"/>
        </return-value>
        <parameters>
          <instance-parameter name="refstr" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="593">the #VipsRefString to fetch from</doc>
            <type name="RefString" c:type="VipsRefString*"/>
          </instance-parameter>
          <parameter name="length"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     optional="1"
                     allow-none="1">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/type.c"
                 line="594">return length here, optionally</doc>
            <type name="gsize" c:type="size_t*"/>
          </parameter>
        </parameters>
      </method>
    </record>
    <class name="Region"
           c:symbol-prefix="region"
           c:type="VipsRegion"
           parent="Object"
           glib:type-name="VipsRegion"
           glib:get-type="vips_region_get_type"
           glib:type-struct="RegionClass">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/region.c"
           line="133">A small part of a #VipsImage. @valid holds the left/top/width/height of the
area of pixels that are available from the region.

See also: VIPS_REGION_ADDR(), vips_region_new(), vips_region_prepare().</doc>
      <source-position filename="libvips/include/vips/region.h" line="129"/>
      <constructor name="new" c:identifier="vips_region_new">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="494">Create a region. #VipsRegion s start out empty, you need to call
vips_region_prepare() to fill them with pixels.

See also: vips_region_prepare().</doc>
        <source-position filename="libvips/include/vips/region.h" line="137"/>
        <return-value transfer-ownership="full">
          <type name="Region" c:type="VipsRegion*"/>
        </return-value>
        <parameters>
          <parameter name="image" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="496">image to create this region on</doc>
            <type name="Image" c:type="VipsImage*"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="black" c:identifier="vips_region_black">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="1022">Paints 0 into the valid part of @reg.

See also: vips_region_paint().</doc>
        <source-position filename="libvips/include/vips/region.h" line="157"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1024">region to operate upon</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="buffer" c:identifier="vips_region_buffer">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="533">The region is transformed so that at least @r pixels are available as a
memory buffer that can be written to.</doc>
        <source-position filename="libvips/include/vips/region.h" line="140"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="541">0 on success, or -1 for error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="535">region to operate upon</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="536">#VipsRect of pixels you need to be able to address</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="copy" c:identifier="vips_region_copy">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="1036">Copy from one region to another. Copy area @r from inside @reg to @dest,
positioning the area of pixels at @x, @y. The two regions must have pixels
which are the same size.

See also: vips_region_paint().</doc>
        <source-position filename="libvips/include/vips/region.h" line="159"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1038">source region</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="dest"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1039">destination region</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1040">#VipsRect of pixels you need to copy</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1041">position of @r in @dest</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1042">position of @r in @dest</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="equalsregion" c:identifier="vips_region_equalsregion">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="794">Do two regions point to the same piece of image? ie.

|[
	VIPS_REGION_ADDR(reg1, x, y) == VIPS_REGION_ADDR(reg2, x, y) &amp;&amp;
	*VIPS_REGION_ADDR(reg1, x, y) ==
		*VIPS_REGION_ADDR(reg2, x, y) for all x, y, reg1, reg2.
]|</doc>
        <source-position filename="libvips/include/vips/region.h" line="147"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="807">non-zero on equality.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg1" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="796">region to test</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="reg2" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="797">region to test</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </parameter>
        </parameters>
      </method>
      <method name="fetch" c:identifier="vips_region_fetch">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="1930">Generate an area of pixels and return a copy. The result must be freed
with g_free(). The requested area must be completely inside the image.

This is equivalent to vips_region_prepare(), followed by a memcpy. It is
convenient for language bindings.</doc>
        <source-position filename="libvips/include/vips/region.h" line="175"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="1944">A copy of the pixel data.</doc>
          <type name="Pel" c:type="VipsPel*"/>
        </return-value>
        <parameters>
          <instance-parameter name="region" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1932">region to fetch pixels from</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="left" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1933">area of pixels to fetch</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="top" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1934">area of pixels to fetch</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="width" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1935">area of pixels to fetch</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="height" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1936">area of pixels to fetch</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="len" transfer-ownership="none">
            <type name="gsize" c:type="size_t*"/>
          </parameter>
        </parameters>
      </method>
      <method name="height" c:identifier="vips_region_height">
        <source-position filename="libvips/include/vips/region.h" line="180"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="2010">Height of the pixels held in region.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="region" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="2008">fetch height from this</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="image" c:identifier="vips_region_image">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="602">The region is transformed so that at least @r pixels are available to be
read from the image. The image needs to be a memory buffer or represent a
file on disc that has been mapped or can be mapped.</doc>
        <source-position filename="libvips/include/vips/region.h" line="142"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="611">0 on success, or -1 for error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="604">region to operate upon</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="605">#VipsRect of pixels you need to be able to address</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="invalidate" c:identifier="vips_region_invalidate">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="2018">Mark a region as containing invalid pixels. Calling this function means
that the next time vips_region_prepare() is called, the region will be
recalculated.

This is faster than calling vips_image_invalidate_all(), but obviously only
affects a single region.

See also: vips_image_invalidate_all(), vips_region_prepare().</doc>
        <source-position filename="libvips/include/vips/region.h" line="183"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="2020">region to invalidate</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
        </parameters>
      </method>
      <method name="paint" c:identifier="vips_region_paint">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="902">Paints @value into @reg covering rectangle @r.
@r is clipped against
@reg-&gt;valid.

For int images, @value is
passed to memset(), so it usually needs to be 0 or 255. For float images,
value is cast to a float and copied in to each band element.

@r is clipped against
@reg-&gt;valid.

See also: vips_region_black().</doc>
        <source-position filename="libvips/include/vips/region.h" line="152"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="904">region to operate upon</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="905">area to paint</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="906">value to paint</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="paint_pel" c:identifier="vips_region_paint_pel">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="971">Paints @ink into @reg covering rectangle @r. @r is clipped against
@reg-&gt;valid.

@ink should be a byte array of the same size as an image pixel containing
the binary value to write into the pixels.

See also: vips_region_paint().</doc>
        <source-position filename="libvips/include/vips/region.h" line="154"/>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="973">region to operate upon</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="974">area to paint</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
          <parameter name="ink" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="975">value to paint</doc>
            <type name="Pel" c:type="const VipsPel*"/>
          </parameter>
        </parameters>
      </method>
      <method name="position" c:identifier="vips_region_position">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="817">Set the position of a region. This only affects reg-&gt;valid, ie. the way
pixels are addressed, not reg-&gt;data, the pixels which are addressed. Clip
against the size of the image. Do not allow negative positions, or
positions outside the image.</doc>
        <source-position filename="libvips/include/vips/region.h" line="149"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="828">0 on success, or -1 for error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="819">region to operate upon</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="820">position to move to</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="821">position to move to</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="prepare" c:identifier="vips_region_prepare">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="1635">vips_region_prepare() fills @reg with pixels. After calling,
you can address at least the area @r with VIPS_REGION_ADDR() and get
valid pixels.

vips_region_prepare() runs in-line, that is, computation is done by
the calling thread, no new threads are involved, and computation
blocks until the pixels are ready.

Use vips_sink_screen() to calculate an area of pixels in the
background.

See also: vips_sink_screen(), vips_region_prepare_to().</doc>
        <source-position filename="libvips/include/vips/region.h" line="169"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="1653">0 on success, or -1 on error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1637">region to prepare</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1638">#VipsRect of pixels you need to be able to address</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="prepare_to" c:identifier="vips_region_prepare_to">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="1761">Like vips_region_prepare(): fill @reg with the pixels in area @r.

Unlike vips_region_prepare(), rather than writing the result to @reg, the
pixels are written into @dest at offset @x, @y.

Also unlike vips_region_prepare(), @dest is not set up for writing for
you with vips_region_buffer(). You can
point @dest at anything, and pixels really will be written there.
This makes vips_region_prepare_to() useful for making the ends of
pipelines.

See also: vips_region_prepare(), vips_sink_disc().</doc>
        <source-position filename="libvips/include/vips/region.h" line="171"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="1782">0 on success, or -1 on error</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1763">region to prepare</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="dest" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1764">region to write to</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1765">#VipsRect of pixels you need to be able to address</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1766">position of @r in @dest</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1767">position of @r in @dest</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="region" c:identifier="vips_region_region">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="682">Make VIPS_REGION_ADDR() on @reg go to @dest instead.

@r is the part of @reg which you want to be able to address (this
effectively becomes the valid field), (@x, @y) is the top LH corner of the
corresponding area in @dest.

Performs all clipping necessary to ensure that @reg-&gt;valid is indeed
valid.

If the region we attach to is moved or destroyed, we can be left with
dangling pointers! If the region we attach to is on another image, the
two images must have the same sizeof(pel).</doc>
        <source-position filename="libvips/include/vips/region.h" line="144"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="703">0 on success, or -1 for error.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="reg" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="684">region to operate upon</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="dest" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="685">region to connect to</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </parameter>
          <parameter name="r" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="686">#VipsRect of pixels you need to be able to address</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
          <parameter name="x" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="687">position of @r in @dest</doc>
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="y" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="688">position of @r in @dest</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="shrink"
              c:identifier="vips_region_shrink"
              introspectable="0">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="1586">Write the pixels @target in @to from the x2 larger area in @from.
Non-complex uncoded images and LABQ only. Images with alpha (see
vips_image_hasalpha()) shrink with pixels scaled by alpha to avoid fringing.

This is a compatibility stub that just calls vips_region_shrink_method().

See also: vips_region_shrink_method().</doc>
        <source-position filename="libvips/include/vips/region.h" line="165"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="from" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1588">source region</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="to"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1589">destination region</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1590">#VipsRect of pixels you need to copy</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
        </parameters>
      </method>
      <method name="shrink_method" c:identifier="vips_region_shrink_method">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="1546">Write the pixels @target in @to from the x2 larger area in @from.
Non-complex uncoded images and LABQ only. Images with alpha (see
vips_image_hasalpha()) shrink with pixels scaled by alpha to avoid fringing.

@method selects the method used to do the 2x2 shrink.

See also: vips_region_copy().</doc>
        <source-position filename="libvips/include/vips/region.h" line="162"/>
        <return-value transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="from" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1548">source region</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
          <parameter name="to"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1549">destination region</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </parameter>
          <parameter name="target" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1550">#VipsRect of pixels you need to copy</doc>
            <type name="Rect" c:type="const VipsRect*"/>
          </parameter>
          <parameter name="method" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1551">method to use when generating target pixels</doc>
            <type name="RegionShrink" c:type="VipsRegionShrink"/>
          </parameter>
        </parameters>
      </method>
      <method name="width" c:identifier="vips_region_width">
        <source-position filename="libvips/include/vips/region.h" line="178"/>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/region.c"
               line="1998">Width of the pixels held in region.</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <instance-parameter name="region" transfer-ownership="none">
            <doc xml:space="preserve"
                 filename="libvips/iofuncs/region.c"
                 line="1996">fetch width from this</doc>
            <type name="Region" c:type="VipsRegion*"/>
          </instance-parameter>
        </parameters>
      </method>
      <field name="parent_object">
        <type name="Object" c:type="VipsObject"/>
      </field>
      <field name="im">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="135">the #VipsImage that this region is defined on</doc>
        <type name="Image" c:type="VipsImage*"/>
      </field>
      <field name="valid">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/region.c"
             line="136">the #VipsRect of pixels that this region represents</doc>
        <type name="Rect" c:type="VipsRect"/>
      </field>
      <field name="type" introspectable="0" readable="0" private="1">
        <type c:type="RegionType"/>
      </field>
      <field name="data" readable="0" private="1">
        <type name="Pel" c:type="VipsPel*"/>
      </field>
      <field name="bpl" readable="0" private="1">
        <type name="gint" c:type="int"/>
      </field>
      <field name="seq" readable="0" private="1">
        <type name="gpointer" c:type="void*"/>
      </field>
      <field name="thread" readable="0" private="1">
        <type name="GLib.Thread" c:type="GThread*"/>
      </field>
      <field name="window" introspectable="0" readable="0" private="1">
        <type c:type="VipsWindow*"/>
      </field>
      <field name="buffer" introspectable="0" readable="0" private="1">
        <type c:type="VipsBuffer*"/>
      </field>
      <field name="invalid" readable="0" private="1">
        <type name="gboolean" c:type="gboolean"/>
      </field>
    </class>
    <record name="RegionClass"
            c:type="VipsRegionClass"
            glib:is-gtype-struct-for="Region">
      <source-position filename="libvips/include/vips/region.h" line="129"/>
      <field name="parent_class">
        <type name="ObjectClass" c:type="VipsObjectClass"/>
      </field>
    </record>
    <enumeration name="RegionShrink"
                 glib:type-name="VipsRegionShrink"
                 glib:get-type="vips_region_shrink_get_type"
                 c:type="VipsRegionShrink">
      <doc xml:space="preserve"
           filename="libvips/include/vips/region.h"
           line="65">How to calculate the output pixels when shrinking a 2x2 region.</doc>
      <member name="mean"
              value="0"
              c:identifier="VIPS_REGION_SHRINK_MEAN"
              glib:nick="mean"
              glib:name="VIPS_REGION_SHRINK_MEAN">
        <doc xml:space="preserve"
             filename="libvips/include/vips/region.h"
             line="67">use the average</doc>
      </member>
      <member name="median"
              value="1"
              c:identifier="VIPS_REGION_SHRINK_MEDIAN"
              glib:nick="median"
              glib:name="VIPS_REGION_SHRINK_MEDIAN">
        <doc xml:space="preserve"
             filename="libvips/include/vips/region.h"
             line="68">use the median</doc>
      </member>
      <member name="mode"
              value="2"
              c:identifier="VIPS_REGION_SHRINK_MODE"
              glib:nick="mode"
              glib:name="VIPS_REGION_SHRINK_MODE">
        <doc xml:space="preserve"
             filename="libvips/include/vips/region.h"
             line="69">use the mode</doc>
      </member>
      <member name="max"
              value="3"
              c:identifier="VIPS_REGION_SHRINK_MAX"
              glib:nick="max"
              glib:name="VIPS_REGION_SHRINK_MAX">
        <doc xml:space="preserve"
             filename="libvips/include/vips/region.h"
             line="70">use the maximum</doc>
      </member>
      <member name="min"
              value="4"
              c:identifier="VIPS_REGION_SHRINK_MIN"
              glib:nick="min"
              glib:name="VIPS_REGION_SHRINK_MIN">
        <doc xml:space="preserve"
             filename="libvips/include/vips/region.h"
             line="71">use the minimum</doc>
      </member>
      <member name="nearest"
              value="5"
              c:identifier="VIPS_REGION_SHRINK_NEAREST"
              glib:nick="nearest"
              glib:name="VIPS_REGION_SHRINK_NEAREST">
        <doc xml:space="preserve"
             filename="libvips/include/vips/region.h"
             line="72">use the top-left pixel</doc>
      </member>
      <member name="last"
              value="6"
              c:identifier="VIPS_REGION_SHRINK_LAST"
              glib:nick="last"
              glib:name="VIPS_REGION_SHRINK_LAST">
      </member>
    </enumeration>
    <function-macro name="SETSTR"
                    c:identifier="VIPS_SETSTR"
                    introspectable="0">
      <source-position filename="libvips/include/vips/memory.h" line="52"/>
      <parameters>
        <parameter name="S">
        </parameter>
        <parameter name="V">
        </parameter>
      </parameters>
    </function-macro>
    <callback name="SListFold2Fn" c:type="VipsSListFold2Fn">
      <source-position filename="libvips/include/vips/basic.h" line="81"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="item"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="c"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <callback name="SListMap2Fn" c:type="VipsSListMap2Fn">
      <source-position filename="libvips/include/vips/basic.h" line="77"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="item"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <callback name="SListMap4Fn" c:type="VipsSListMap4Fn">
      <source-position filename="libvips/include/vips/basic.h" line="79"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="item"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="c"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="d"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <record name="SaveString"
            c:type="VipsSaveString"
            glib:type-name="VipsSaveString"
            glib:get-type="vips_save_string_get_type"
            c:symbol-prefix="save_string">
      <source-position filename="libvips/include/vips/type.h" line="152"/>
      <field name="s" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
    </record>
    <enumeration name="Saveable"
                 glib:type-name="VipsSaveable"
                 glib:get-type="vips_saveable_get_type"
                 c:type="VipsSaveable">
      <doc xml:space="preserve"
           filename="libvips/include/vips/foreign.h"
           line="312">See also: #VipsForeignSave.</doc>
      <member name="mono"
              value="0"
              c:identifier="VIPS_SAVEABLE_MONO"
              glib:nick="mono"
              glib:name="VIPS_SAVEABLE_MONO">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="314">1 band (eg. CSV)</doc>
      </member>
      <member name="rgb"
              value="1"
              c:identifier="VIPS_SAVEABLE_RGB"
              glib:nick="rgb"
              glib:name="VIPS_SAVEABLE_RGB">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="315">1 or 3 bands (eg. PPM)</doc>
      </member>
      <member name="rgba"
              value="2"
              c:identifier="VIPS_SAVEABLE_RGBA"
              glib:nick="rgba"
              glib:name="VIPS_SAVEABLE_RGBA">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="316">1, 2, 3 or 4 bands (eg. PNG)</doc>
      </member>
      <member name="rgba_only"
              value="3"
              c:identifier="VIPS_SAVEABLE_RGBA_ONLY"
              glib:nick="rgba-only"
              glib:name="VIPS_SAVEABLE_RGBA_ONLY">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="317">3 or 4 bands (eg. WEBP)</doc>
      </member>
      <member name="rgb_cmyk"
              value="4"
              c:identifier="VIPS_SAVEABLE_RGB_CMYK"
              glib:nick="rgb-cmyk"
              glib:name="VIPS_SAVEABLE_RGB_CMYK">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="318">1, 3 or 4 bands (eg. JPEG)</doc>
      </member>
      <member name="any"
              value="5"
              c:identifier="VIPS_SAVEABLE_ANY"
              glib:nick="any"
              glib:name="VIPS_SAVEABLE_ANY">
        <doc xml:space="preserve"
             filename="libvips/include/vips/foreign.h"
             line="319">any number of bands (eg. TIFF)</doc>
      </member>
      <member name="last"
              value="6"
              c:identifier="VIPS_SAVEABLE_LAST"
              glib:nick="last"
              glib:name="VIPS_SAVEABLE_LAST">
      </member>
    </enumeration>
    <enumeration name="SdfShape"
                 glib:type-name="VipsSdfShape"
                 glib:get-type="vips_sdf_shape_get_type"
                 c:type="VipsSdfShape">
      <doc xml:space="preserve"
           filename="libvips/create/create.c"
           line="77">The SDF to generate,

See also: vips_sdf().</doc>
      <member name="circle"
              value="0"
              c:identifier="VIPS_SDF_SHAPE_CIRCLE"
              glib:nick="circle"
              glib:name="VIPS_SDF_SHAPE_CIRCLE">
        <doc xml:space="preserve"
             filename="libvips/create/create.c"
             line="79">a circle at @a, radius @r</doc>
      </member>
      <member name="box"
              value="1"
              c:identifier="VIPS_SDF_SHAPE_BOX"
              glib:nick="box"
              glib:name="VIPS_SDF_SHAPE_BOX">
        <doc xml:space="preserve"
             filename="libvips/create/create.c"
             line="80">a box from @a to @b</doc>
      </member>
      <member name="rounded_box"
              value="2"
              c:identifier="VIPS_SDF_SHAPE_ROUNDED_BOX"
              glib:nick="rounded-box"
              glib:name="VIPS_SDF_SHAPE_ROUNDED_BOX">
        <doc xml:space="preserve"
             filename="libvips/create/create.c"
             line="81">a box with rounded @corners from @a to @b</doc>
      </member>
      <member name="line"
              value="3"
              c:identifier="VIPS_SDF_SHAPE_LINE"
              glib:nick="line"
              glib:name="VIPS_SDF_SHAPE_LINE">
        <doc xml:space="preserve"
             filename="libvips/create/create.c"
             line="82">a line from @a to @b</doc>
      </member>
      <member name="last"
              value="4"
              c:identifier="VIPS_SDF_SHAPE_LAST"
              glib:nick="last"
              glib:name="VIPS_SDF_SHAPE_LAST">
      </member>
    </enumeration>
    <enumeration name="Size"
                 glib:type-name="VipsSize"
                 glib:get-type="vips_size_get_type"
                 c:type="VipsSize">
      <doc xml:space="preserve"
           filename="libvips/resample/resample.c"
           line="92">Controls whether an operation should upsize, downsize, both up and
downsize, or force a size.

See also: vips_thumbnail().</doc>
      <member name="both"
              value="0"
              c:identifier="VIPS_SIZE_BOTH"
              glib:nick="both"
              glib:name="VIPS_SIZE_BOTH">
        <doc xml:space="preserve"
             filename="libvips/resample/resample.c"
             line="94">size both up and down</doc>
      </member>
      <member name="up"
              value="1"
              c:identifier="VIPS_SIZE_UP"
              glib:nick="up"
              glib:name="VIPS_SIZE_UP">
        <doc xml:space="preserve"
             filename="libvips/resample/resample.c"
             line="95">only upsize</doc>
      </member>
      <member name="down"
              value="2"
              c:identifier="VIPS_SIZE_DOWN"
              glib:nick="down"
              glib:name="VIPS_SIZE_DOWN">
        <doc xml:space="preserve"
             filename="libvips/resample/resample.c"
             line="96">only downsize</doc>
      </member>
      <member name="force"
              value="3"
              c:identifier="VIPS_SIZE_FORCE"
              glib:nick="force"
              glib:name="VIPS_SIZE_FORCE">
        <doc xml:space="preserve"
             filename="libvips/resample/resample.c"
             line="97">force size, that is, break aspect ratio</doc>
      </member>
      <member name="last"
              value="4"
              c:identifier="VIPS_SIZE_LAST"
              glib:nick="last"
              glib:name="VIPS_SIZE_LAST">
      </member>
    </enumeration>
    <record name="Source" c:type="VipsSource" disguised="1" opaque="1">
      <source-position filename="libvips/include/vips/basic.h" line="105"/>
    </record>
    <callback name="StartFn" c:type="VipsStartFn">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/generate.c"
           line="582">Start a new processing sequence for this generate function. This allocates
per-thread state, such as an input region.

See also: vips_start_one(), vips_start_many().</doc>
      <source-position filename="libvips/include/vips/image.h" line="148"/>
      <return-value transfer-ownership="none" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/generate.c"
             line="593">a new sequence value</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="out" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="584">image being calculated</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="585">user data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="586">user data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <callback name="StopFn" c:type="VipsStopFn">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/generate.c"
           line="612">Stop a processing sequence. This frees
per-thread state, such as an input region.

See also: vips_stop_one(), vips_stop_many().</doc>
      <source-position filename="libvips/include/vips/image.h" line="151"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/generate.c"
             line="623">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="seq"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="614">sequence value</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="615">user data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/generate.c"
               line="616">user data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <constant name="TRANSFORM_SCALE" value="1" c:type="VIPS_TRANSFORM_SCALE">
      <doc xml:space="preserve"
           filename="libvips/resample/interpolate.c"
           line="290">#VIPS_TRANSFORM_SHIFT as a multiplicative constant.</doc>
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="112"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="TRANSFORM_SHIFT" value="6" c:type="VIPS_TRANSFORM_SHIFT">
      <doc xml:space="preserve"
           filename="libvips/resample/interpolate.c"
           line="283">Many of the vips interpolators use fixed-point arithmetic for coordinate
calculation. This is how many bits of precision they use.</doc>
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="111"/>
      <type name="gint" c:type="gint"/>
    </constant>
    <record name="Target" c:type="VipsTarget" disguised="1" opaque="1">
      <source-position filename="libvips/include/vips/basic.h" line="107"/>
    </record>
    <enumeration name="TextWrap"
                 glib:type-name="VipsTextWrap"
                 glib:get-type="vips_text_wrap_get_type"
                 c:type="VipsTextWrap">
      <doc xml:space="preserve"
           filename="libvips/create/create.c"
           line="64">Sets the word wrapping style for vips_text() when used with a maximum
width.

See also: vips_text().</doc>
      <member name="word"
              value="0"
              c:identifier="VIPS_TEXT_WRAP_WORD"
              glib:nick="word"
              glib:name="VIPS_TEXT_WRAP_WORD">
        <doc xml:space="preserve"
             filename="libvips/create/create.c"
             line="66">wrap at word boundaries</doc>
      </member>
      <member name="char"
              value="1"
              c:identifier="VIPS_TEXT_WRAP_CHAR"
              glib:nick="char"
              glib:name="VIPS_TEXT_WRAP_CHAR">
        <doc xml:space="preserve"
             filename="libvips/create/create.c"
             line="67">wrap at character boundaries</doc>
      </member>
      <member name="word_char"
              value="2"
              c:identifier="VIPS_TEXT_WRAP_WORD_CHAR"
              glib:nick="word-char"
              glib:name="VIPS_TEXT_WRAP_WORD_CHAR">
        <doc xml:space="preserve"
             filename="libvips/create/create.c"
             line="68">wrap at word boundaries, but fall back to character boundaries if there is not enough space for a full word</doc>
      </member>
      <member name="none"
              value="3"
              c:identifier="VIPS_TEXT_WRAP_NONE"
              glib:nick="none"
              glib:name="VIPS_TEXT_WRAP_NONE">
        <doc xml:space="preserve"
             filename="libvips/create/create.c"
             line="69">no wrapping</doc>
      </member>
      <member name="last"
              value="4"
              c:identifier="VIPS_TEXT_WRAP_LAST"
              glib:nick="last"
              glib:name="VIPS_TEXT_WRAP_LAST">
      </member>
    </enumeration>
    <record name="Thing"
            c:type="VipsThing"
            glib:type-name="VipsThing"
            glib:get-type="vips_thing_get_type"
            c:symbol-prefix="thing">
      <source-position filename="libvips/include/vips/type.h" line="45"/>
      <field name="i" writable="1">
        <type name="gint" c:type="int"/>
      </field>
      <constructor name="new" c:identifier="vips_thing_new">
        <source-position filename="libvips/include/vips/type.h" line="56"/>
        <return-value transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="96">a new #VipsThing.</doc>
          <type name="Thing" c:type="VipsThing*"/>
        </return-value>
        <parameters>
          <parameter name="i" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </constructor>
    </record>
    <enumeration name="Token"
                 glib:type-name="VipsToken"
                 glib:get-type="vips_token_get_type"
                 c:type="VipsToken">
      <member name="left"
              value="1"
              c:identifier="VIPS_TOKEN_LEFT"
              glib:nick="left"
              glib:name="VIPS_TOKEN_LEFT">
      </member>
      <member name="right"
              value="2"
              c:identifier="VIPS_TOKEN_RIGHT"
              glib:nick="right"
              glib:name="VIPS_TOKEN_RIGHT">
      </member>
      <member name="string"
              value="3"
              c:identifier="VIPS_TOKEN_STRING"
              glib:nick="string"
              glib:name="VIPS_TOKEN_STRING">
      </member>
      <member name="equals"
              value="4"
              c:identifier="VIPS_TOKEN_EQUALS"
              glib:nick="equals"
              glib:name="VIPS_TOKEN_EQUALS">
      </member>
      <member name="comma"
              value="5"
              c:identifier="VIPS_TOKEN_COMMA"
              glib:nick="comma"
              glib:name="VIPS_TOKEN_COMMA">
      </member>
    </enumeration>
    <callback name="TypeMap2Fn" c:type="VipsTypeMap2Fn">
      <source-position filename="libvips/include/vips/object.h" line="673"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="type" transfer-ownership="none">
          <type name="GType" c:type="GType"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <callback name="TypeMapFn" c:type="VipsTypeMapFn">
      <source-position filename="libvips/include/vips/object.h" line="672"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="type" transfer-ownership="none">
          <type name="GType" c:type="GType"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </callback>
    <function-macro name="UNREF" c:identifier="VIPS_UNREF" introspectable="0">
      <source-position filename="libvips/include/vips/object.h" line="46"/>
      <parameters>
        <parameter name="X">
        </parameter>
      </parameters>
    </function-macro>
    <constant name="VERSION" value="8.16.1" c:type="VIPS_VERSION">
      <source-position filename="libvips/include/vips/version.h" line="7"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="VERSION_STRING"
              value="8.16.1"
              c:type="VIPS_VERSION_STRING">
      <source-position filename="libvips/include/vips/version.h" line="8"/>
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <function name="Yxy2Lab" c:identifier="vips_Yxy2Lab" introspectable="0">
      <source-position filename="libvips/include/vips/colour.h" line="147"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out" transfer-ownership="none">
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="_object_set_member" c:identifier="vips__object_set_member">
      <source-position filename="libvips/include/vips/object.h" line="321"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="object" transfer-ownership="none">
          <type name="Object" c:type="VipsObject*"/>
        </parameter>
        <parameter name="pspec" transfer-ownership="none">
          <type name="GObject.ParamSpec" c:type="GParamSpec*"/>
        </parameter>
        <parameter name="member" transfer-ownership="none">
          <type name="GObject.Object" c:type="GObject**"/>
        </parameter>
        <parameter name="argument" transfer-ownership="none">
          <type name="GObject.Object" c:type="GObject*"/>
        </parameter>
      </parameters>
    </function>
    <function name="add" c:identifier="vips_add" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/add.c"
           line="190">This operation calculates @in1 + @in2 and writes the result to @out.

If the images differ in size, the smaller image is enlarged to match the
larger by adding zero pixels along the bottom and right.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;), then the
following table is used to determine the output type:

&lt;table&gt;
  &lt;title&gt;VipsAdd type promotion&lt;/title&gt;
  &lt;tgroup cols='2' align='left' colsep='1' rowsep='1'&gt;
    &lt;thead&gt;
      &lt;row&gt;
        &lt;entry&gt;input type&lt;/entry&gt;
        &lt;entry&gt;output type&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;uchar&lt;/entry&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;char&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;
&lt;/table&gt;

In other words, the output type is just large enough to hold the whole
range of possible values.

See also: vips_subtract(), vips_linear().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="195"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/add.c"
             line="271">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/add.c"
               line="192">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/add.c"
               line="193">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/add.c"
               line="194">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/add.c"
               line="195">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="add_option_entries" c:identifier="vips_add_option_entries">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="924">Add the standard vips %GOptionEntry to a %GOptionGroup.

See also: g_option_group_new().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="179"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="option_group" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="926">group to add to</doc>
          <type name="GLib.OptionGroup" c:type="GOptionGroup*"/>
        </parameter>
      </parameters>
    </function>
    <function name="analyzeload"
              c:identifier="vips_analyzeload"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/analyzeload.c"
           line="155">Load an Analyze 6.0 file. If @filename is "fred.img", this will look for
an image header called "fred.hdr" and pixel data in "fred.img". You can
also load "fred" or "fred.hdr".

Images are
loaded lazilly and byte-swapped, if necessary. The Analyze metadata is read
and attached.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="639"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/analyzeload.c"
             line="171">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/analyzeload.c"
               line="157">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/analyzeload.c"
               line="158">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/analyzeload.c"
               line="159">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="andimage" c:identifier="vips_andimage" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/boolean.c"
           line="341">Perform #VIPS_OPERATION_BOOLEAN_AND on a pair of images. See
vips_boolean().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="426"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="351">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="343">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="344">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="345">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="346">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="area_free_cb"
              c:identifier="vips_area_free_cb"
              moved-to="Area.free_cb">
      <source-position filename="libvips/include/vips/type.h" line="99"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="mem"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="area" transfer-ownership="none">
          <type name="Area" c:type="VipsArea*"/>
        </parameter>
      </parameters>
    </function>
    <function name="argument_class_map"
              c:identifier="vips_argument_class_map"
              moved-to="ArgumentClass.map"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="625">And loop over a class. Same as ^^, but with no VipsArgumentInstance.</doc>
      <source-position filename="libvips/include/vips/object.h" line="336"/>
      <return-value transfer-ownership="none" nullable="1">
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="object_class" transfer-ownership="none">
          <type name="ObjectClass" c:type="VipsObjectClass*"/>
        </parameter>
        <parameter name="fn" transfer-ownership="none">
          <type name="ArgumentClassMapFn" c:type="VipsArgumentClassMapFn"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </function>
    <function name="argument_get_id"
              c:identifier="vips_argument_get_id"
              moved-to="Argument.get_id"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="230">Allocate a new property id. See g_object_class_install_property().</doc>
      <source-position filename="libvips/include/vips/object.h" line="320"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="235">a new property id &gt; 0</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="argument_map"
              c:identifier="vips_argument_map"
              moved-to="Argument.map"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="581">Loop over the vips_arguments to an object. Stop when @fn returns non-%NULL
and return that value.</doc>
      <source-position filename="libvips/include/vips/object.h" line="327"/>
      <return-value transfer-ownership="none" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="591">%NULL if @fn returns %NULL for all arguments, otherwise the first
non-%NULL value from @fn.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="object" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="583">object whose args should be enumerated</doc>
          <type name="Object" c:type="VipsObject*"/>
        </parameter>
        <parameter name="fn" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="584">call this function for every argument</doc>
          <type name="ArgumentMapFn" c:type="VipsArgumentMapFn"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="585">client data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="586">client data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </function>
    <docsection name="arithmetic">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/arithmetic.c"
           line="58">These operations perform pixel arithmetic, that is, they perform an
arithmetic operation, such as addition, on every pixel in an image or a
pair of images. All (except in a few cases noted below) will work with
images of any type or any mixture of types, of any size and of any number
of bands.

For binary operations, if the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

In the same way, for operations that take an array constant, such as
vips_remainder_const(), you can mix single-element arrays or single-band
images freely.

Arithmetic operations try to preserve precision by increasing the number of
bits in the output image when necessary. Generally, this follows the ANSI C
conventions for type promotion, so multiplying two
#VIPS_FORMAT_UCHAR images together, for example, produces a
#VIPS_FORMAT_USHORT image, and taking the vips_cos() of a
#VIPS_FORMAT_USHORT image produces #VIPS_FORMAT_FLOAT image.

After processing, use vips_cast() and friends to take then format back down
again. vips_cast_uchar(), for example, will cast any image down to 8-bit
unsigned.

Images have an *interpretation*: a meaning for the pixel values. With
#VIPS_INTERPRETATION_sRGB, for example, the first three bands will be
interpreted (for example, by a saver like vips_jpegsave()) as R, G and B,
with values in 0 - 255, and any fourth band will be interpreted as an
alpha channel.

After arithmetic, you may wish to change the interpretation (for example to
save as 16-bit PNG). Use vips_copy() to change the interpretation without
changing pixels.

For binary arithmetic operations, type promotion occurs in two stages.
First, the two input images are cast up to the smallest common format,
that is, the type with the smallest range that can represent the full
range of both inputs. This conversion can be represented as a table:

&lt;table&gt;
  &lt;title&gt;Smallest common format&lt;/title&gt;
  &lt;tgroup cols='10' align='left' colsep='1' rowsep='1'&gt;
    &lt;thead&gt;
      &lt;row&gt;
        &lt;entry&gt;@in2/@in1&lt;/entry&gt;
        &lt;entry&gt;uchar&lt;/entry&gt;
        &lt;entry&gt;char&lt;/entry&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;uchar&lt;/entry&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;char&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;
&lt;/table&gt;

In the second stage, the operation is performed between the two identical
types to form the output. The details vary between operations, but
generally the principle is that the output type should be large enough to
represent the whole range of possible values, except that int never becomes
float.</doc>
    </docsection>
    <function name="arrayjoin"
              c:identifier="vips_arrayjoin"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/arrayjoin.c"
           line="473">Optional arguments:

* @across: %gint, number of images per row
* @shim: %gint, space between images, in pixels
* @background: #VipsArrayDouble, background ink colour
* @halign: #VipsAlign, low, centre or high alignment
* @valign: #VipsAlign, low, centre or high alignment
* @hspacing: %gint, horizontal distance between images
* @vspacing: %gint, vertical distance between images

Lay out the images in @in in a grid. The grid is @across images across and
however high is necessary to use up all of @in. Images are set down
left-to-right and top-to-bottom. @across defaults to @n.

Each input image is placed with a box of size @hspacing by @vspacing
pixels and cropped. These default to the largest width and largest height
of the input images.

Space between images is filled with @background. This defaults to 0
(black).

Images are positioned within their @hspacing by @vspacing box at low,
centre or high coordinate values, controlled by @halign and @valign. These
default to left-top.

Boxes are joined and separated by @shim pixels. This defaults to 0.

If the number of bands in the input images differs, all but one of the
images must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the n-band images are operated upon.

The input images are cast up to the smallest common type (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;).

vips_colourspace() can be useful for moving the images to a common
colourspace for compositing.

See also: vips_join(), vips_insert(), vips_colourspace().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="173"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/arrayjoin.c"
             line="521">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/arrayjoin.c"
               line="475">array of input images</doc>
          <array length="2" zero-terminated="0" c:type="VipsImage**">
            <type name="Image" c:type="VipsImage*"/>
          </array>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/conversion/arrayjoin.c"
               line="476">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/arrayjoin.c"
               line="477">number of input images</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/arrayjoin.c"
               line="478">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="atan2" c:identifier="vips_atan2" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/math2.c"
           line="357">Perform #VIPS_OPERATION_MATH2_ATAN2 on a pair of images. See
vips_math2().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="496"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="367">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="359">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="360">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="361">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="362">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="band_format_is8bit"
              c:identifier="vips_band_format_is8bit"
              moved-to="BandFormat.is8bit">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="3799">Return %TRUE if @format is uchar or schar.</doc>
      <source-position filename="libvips/include/vips/image.h" line="564"/>
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="format" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3801">format to test</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </parameter>
      </parameters>
    </function>
    <function name="band_format_iscomplex"
              c:identifier="vips_band_format_iscomplex"
              moved-to="BandFormat.iscomplex">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="3859">Return %TRUE if @fmt is one of the complex types.</doc>
      <source-position filename="libvips/include/vips/image.h" line="568"/>
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="format" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3861">format to test</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </parameter>
      </parameters>
    </function>
    <function name="band_format_isfloat"
              c:identifier="vips_band_format_isfloat"
              moved-to="BandFormat.isfloat">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="3829">Return %TRUE if @format is one of the float types.</doc>
      <source-position filename="libvips/include/vips/image.h" line="566"/>
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="format" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3831">format to test</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </parameter>
      </parameters>
    </function>
    <function name="band_format_isint"
              c:identifier="vips_band_format_isint"
              moved-to="BandFormat.isint">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="3739">Return %TRUE if @format is one of the integer types.</doc>
      <source-position filename="libvips/include/vips/image.h" line="560"/>
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="format" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3741">format to test</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </parameter>
      </parameters>
    </function>
    <function name="band_format_isuint"
              c:identifier="vips_band_format_isuint"
              moved-to="BandFormat.isuint">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="3769">Return %TRUE if @format is one of the unsigned integer types.</doc>
      <source-position filename="libvips/include/vips/image.h" line="562"/>
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="format" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="3771">format to test</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </parameter>
      </parameters>
    </function>
    <function name="bandjoin" c:identifier="vips_bandjoin" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/bandjoin.c"
           line="228">Join a set of images together, bandwise.

If the images
have n and m bands, then the output image will have n + m
bands, with the first n coming from the first image and the last m
from the second.

If the images differ in size, the smaller images are enlarged to match the
larger by adding zero pixels along the bottom and right.

The input images are cast up to the smallest common type (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;).

See also: vips_insert().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="273"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandjoin.c"
             line="251">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="230">array of input images</doc>
          <array length="2" zero-terminated="0" c:type="VipsImage**">
            <type name="Image" c:type="VipsImage*"/>
          </array>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="231">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="232">number of input images</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="233">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="bandjoin2"
              c:identifier="vips_bandjoin2"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/bandjoin.c"
           line="266">Join a pair of images together, bandwise. See vips_bandjoin().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="276"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandjoin.c"
             line="275">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="268">first input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="in2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="269">second input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="270">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandjoin.c"
               line="271">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="bandrank" c:identifier="vips_bandrank" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/bandrank.c"
           line="289">Optional arguments:

* @index: pick this index from list of sorted values

Sorts the images @in band-element-wise, then outputs an
image in which each band element is selected from the sorted list by the
@index parameter. For example, if @index
is zero, then each output band element will be the minimum of all the
corresponding input band elements.

By default, @index is -1, meaning pick the median value.

It works for any uncoded, non-complex image type. Images are cast up to the
smallest common-format.

Any image can have either 1 band or n bands, where n is the same for all
the non-1-band images. Single band images are then effectively copied to
make n-band images.

Smaller input images are expanded by adding black pixels.

See also: vips_rank().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="285"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/bandrank.c"
             line="319">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandrank.c"
               line="291">array of input images</doc>
          <array length="2" zero-terminated="0" c:type="VipsImage**">
            <type name="Image" c:type="VipsImage*"/>
          </array>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandrank.c"
               line="292">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandrank.c"
               line="293">number of input images</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/bandrank.c"
               line="294">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="basic">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="60">A few simple typedefs used by VIPS.</doc>
    </docsection>
    <function name="black" c:identifier="vips_black" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/black.c"
           line="167">Optional arguments:

* @bands: output bands

Make a black unsigned char image of a specified size.

See also: vips_xyz(), vips_text(), vips_gaussnoise().</doc>
      <source-position filename="libvips/include/vips/create.h" line="58"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/black.c"
             line="182">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/black.c"
               line="169">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/black.c"
               line="170">output width</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/black.c"
               line="171">output height</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/black.c"
               line="172">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="blob_copy"
              c:identifier="vips_blob_copy"
              moved-to="Blob.copy">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="662">Like vips_blob_new(), but take a copy of the data. Useful for bindings
which struggle with callbacks.

See also: vips_blob_new().</doc>
      <source-position filename="libvips/include/vips/type.h" line="187"/>
      <return-value transfer-ownership="full">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="672">the new #VipsBlob.</doc>
        <type name="Blob" c:type="VipsBlob*"/>
      </return-value>
      <parameters>
        <parameter name="data" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="664">data to store</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="length" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="665">number of bytes in @data</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="block_untrusted_set"
              c:identifier="vips_block_untrusted_set">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="1310">Set the block state on all untrusted operations.

|[
vips_block_untrusted_set(TRUE);
]|

Will block all untrusted operations from running.

Use `vips -l` at the command-line to see the class hierarchy and which
operations are marked as untrusted.

Set the environment variable `VIPS_BLOCK_UNTRUSTED` to block all untrusted
operations on vips_init().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="185"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="state" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="1312">the block state to set</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="boolean" c:identifier="vips_boolean" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/boolean.c"
           line="297">Perform various boolean operations on pairs of images.

The output image is the same format as the upcast input images for integer
types. Float types are cast to int before processing. Complex types are not
supported.

If the images differ in size, the smaller image is enlarged to match the
larger by adding zero pixels along the bottom and right.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;).

See also: vips_boolean_const().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="422"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="325">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="299">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="300">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="301">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="boolean" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="302">boolean operation to perform</doc>
          <type name="OperationBoolean" c:type="VipsOperationBoolean"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="303">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="buf">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/buf.c"
           line="48">A message buffer you can append stuff to safely and quickly. If the message
gets too long, you get "..." and truncation. Message buffers can be on the
stack or heap.

For example:

|[
char txt[256];
VipsBuf buf = VIPS_BUF_STATIC(txt);
int i;

vips_buf_appends(&amp;buf, "Numbers are: ");
for (i = 0; i &amp;lt; array_length; i++) {
  if (i &amp;gt; 0)
    vips_buf_appends(&amp;buf, ", ");
  vips_buf_appendg(&amp;buf, array[i]);
}
printf("%s", vips_buf_all(&amp;buf));
]|</doc>
    </docsection>
    <function name="cache_drop_all" c:identifier="vips_cache_drop_all">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="671">Drop the whole operation cache, handy for leak tracking. Also called
automatically on vips_shutdown().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="137"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="cache_get_max" c:identifier="vips_cache_get_max">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="935">Get the maximum number of operations we keep in cache.</doc>
      <source-position filename="libvips/include/vips/operation.h" line="149"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/cache.c"
             line="940">the maximum number of operations we keep in cache</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="cache_get_max_files"
              c:identifier="vips_cache_get_max_files">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="987">Get the maximum number of tracked files we allow before we start dropping
cached operations. See vips_tracked_get_files().

libvips only tracks file descriptors it allocates, it can't track ones
allocated by external libraries. If you use an operation like
vips_magickload(), most of the descriptors it uses won't be included.

See also: vips_tracked_get_files().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="155"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/cache.c"
             line="999">the maximum number of tracked files we allow</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="cache_get_max_mem" c:identifier="vips_cache_get_max_mem">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="971">Get the maximum amount of tracked memory we allow before we start dropping
cached operations. See vips_tracked_get_mem().

See also: vips_tracked_get_mem().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="153"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/cache.c"
             line="979">the maximum amount of tracked memory we allow</doc>
        <type name="gsize" c:type="size_t"/>
      </return-value>
    </function>
    <function name="cache_get_size" c:identifier="vips_cache_get_size">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="948">Get the current number of operations in cache.</doc>
      <source-position filename="libvips/include/vips/operation.h" line="151"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/cache.c"
             line="953">get the current number of operations in cache.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="cache_operation_build"
              c:identifier="vips_cache_operation_build">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="872">A binding-friendly version of vips_cache_operation_buildp().

After calling this, @operation has the same ref count as when it went in,
and the result must be freed with vips_object_unref_outputs() and
g_object_unref().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="141"/>
      <return-value transfer-ownership="full">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/cache.c"
             line="882">The built operation.</doc>
        <type name="Operation" c:type="VipsOperation*"/>
      </return-value>
      <parameters>
        <parameter name="operation" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/cache.c"
               line="874">operation to lookup</doc>
          <type name="Operation" c:type="VipsOperation*"/>
        </parameter>
      </parameters>
    </function>
    <function name="cache_operation_buildp"
              c:identifier="vips_cache_operation_buildp"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="758">Look up @operation in the cache. If we get a hit, unref @operation, ref the
old one and return that through the argument pointer.

If we miss, build and add @operation.

Operators that have been tagged as invalid by the `invalidate` signal are
removed from cache.

Operators with the #VIPS_OPERATION_BLOCKED flag are never executed.

Operators with the #VIPS_OPERATION_REVALIDATE flag are always executed and
any old cache value is replaced.

Operators with the #VIPS_OPERATION_NOCACHE flag are never cached.</doc>
      <source-position filename="libvips/include/vips/operation.h" line="139"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/cache.c"
             line="777">0 on success, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="operation" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/cache.c"
               line="760">pointer to operation to lookup</doc>
          <type name="Operation" c:type="VipsOperation**"/>
        </parameter>
      </parameters>
    </function>
    <function name="cache_print" c:identifier="vips_cache_print">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="473">Print the whole operation cache to stdout. Handy for debugging.</doc>
      <source-position filename="libvips/include/vips/operation.h" line="143"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="cache_set_dump" c:identifier="vips_cache_set_dump">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="1023">Handy for debugging. Print the operation cache to stdout just before exit.

See also: vips_cache_set_trace().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="159"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="dump" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/cache.c"
               line="1025">if %TRUE, dump the operation cache on exit</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="cache_set_max" c:identifier="vips_cache_set_max">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="902">Set the maximum number of operations we keep in cache.</doc>
      <source-position filename="libvips/include/vips/operation.h" line="145"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="max" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/cache.c"
               line="904">maximum number of operation to cache</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="cache_set_max_files"
              c:identifier="vips_cache_set_max_files">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="1007">Set the maximum number of tracked files we allow before we start dropping
cached operations. See vips_tracked_get_files().

See also: vips_tracked_get_files().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="157"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="max_files" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/cache.c"
               line="1009">max open files we allow</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="cache_set_max_mem" c:identifier="vips_cache_set_max_mem">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="915">Set the maximum amount of tracked memory we allow before we start dropping
cached operations. See vips_tracked_get_mem().

libvips only tracks memory it allocates, it can't track memory allocated by
external libraries. If you use an operation like vips_magickload(), most of
the memory it uses won't be included.

See also: vips_tracked_get_mem().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="147"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="max_mem" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/cache.c"
               line="917">maximum amount of tracked memory we use</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="cache_set_trace" c:identifier="vips_cache_set_trace">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/cache.c"
           line="1037">Handy for debugging. Print operation cache actions to stdout as we run.

You can set the environment variable `VIPS_TRACE` to turn this option on, or
use the command-line flag `--vips-cache-trace`.

See also: vips_cache_set_dump().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="161"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="trace" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/cache.c"
               line="1039">if %TRUE, trace the operation cache</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="call" c:identifier="vips_call" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/operation.c"
           line="1036">vips_call() calls the named operation, passing in required arguments and
then setting any optional ones from the remainder of the arguments as a set
of name/value pairs.

For example, vips_embed() takes six required arguments, @in, @out, @x, @y,
@width, @height, and has two optional arguments, @extend and @background.
You can run it with vips_call() like this:

|[
VipsImage *in = ...
VipsImage *out;

if (vips_call("embed", in, &amp;out, 10, 10, 100, 100,
        "extend", VIPS_EXTEND_COPY,
        NULL))
    ... error
]|

Normally of course you'd just use the vips_embed() wrapper function and get
type-safety for the required arguments.

See also: vips_call_split(), vips_call_options().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="123"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="1064">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="operation_name" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/operation.c"
               line="1038">name of operation to call</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/operation.c"
               line="1039">required args, then a %NULL-terminated list of argument/value pairs</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="call_argv" c:identifier="vips_call_argv">
      <source-position filename="libvips/include/vips/operation.h" line="134"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="operation" transfer-ownership="none">
          <type name="Operation" c:type="VipsOperation*"/>
        </parameter>
        <parameter name="argc" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="argv" transfer-ownership="none">
          <type name="utf8" c:type="char**"/>
        </parameter>
      </parameters>
    </function>
    <function name="call_options" c:identifier="vips_call_options">
      <source-position filename="libvips/include/vips/operation.h" line="132"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="group" transfer-ownership="none">
          <type name="GLib.OptionGroup" c:type="GOptionGroup*"/>
        </parameter>
        <parameter name="operation" transfer-ownership="none">
          <type name="Operation" c:type="VipsOperation*"/>
        </parameter>
      </parameters>
    </function>
    <function name="call_required_optional"
              c:identifier="vips_call_required_optional"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/operation.c"
           line="940">This is the main entry point for the C and C++ varargs APIs. @operation
is executed, supplying @required and @optional arguments.

Beware, this can change @operation to point at an old, cached one.</doc>
      <source-position filename="libvips/include/vips/operation.h" line="120"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/operation.c"
             line="951">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="operation" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/operation.c"
               line="942">the operation to execute</doc>
          <type name="Operation" c:type="VipsOperation**"/>
        </parameter>
        <parameter name="required" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/operation.c"
               line="943">%va_list of required arguments</doc>
          <type name="va_list" c:type="va_list"/>
        </parameter>
        <parameter name="optional" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/operation.c"
               line="944">NULL-terminated %va_list of name / value pairs</doc>
          <type name="va_list" c:type="va_list"/>
        </parameter>
      </parameters>
    </function>
    <function name="call_split"
              c:identifier="vips_call_split"
              introspectable="0">
      <source-position filename="libvips/include/vips/operation.h" line="126"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="operation_name" transfer-ownership="none">
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="optional" transfer-ownership="none">
          <type name="va_list" c:type="va_list"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="call_split_option_string"
              c:identifier="vips_call_split_option_string"
              introspectable="0">
      <source-position filename="libvips/include/vips/operation.h" line="128"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="operation_name" transfer-ownership="none">
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="option_string" transfer-ownership="none">
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="optional" transfer-ownership="none">
          <type name="va_list" c:type="va_list"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="check_8or16" c:identifier="vips_check_8or16">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="838">Check that the image is 8 or 16-bit integer, signed or unsigned.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="114"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="849">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="840">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="841">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_bandno" c:identifier="vips_check_bandno">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1023">@bandno should be a valid band number (ie. 0 to im-&gt;Bands - 1), or can be
-1, meaning all bands.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="95"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1036">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1025">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1026">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="bandno" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1027">band number</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_bands" c:identifier="vips_check_bands">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="556">Check that the image has @bands bands.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="83"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="568">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="558">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="559">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="bands" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="560">must have this many bands</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_bands_1or3" c:identifier="vips_check_bands_1or3">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="581">Check that the image has either one or three bands.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="85"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="592">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="583">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="584">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_bands_1orn" c:identifier="vips_check_bands_1orn">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="632">Check that the images have the same number of bands, or that one of the
images has just 1 band.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="89"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="645">0 on OK, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="634">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="635">first image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="im2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="636">second image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_bands_1orn_unary"
              c:identifier="vips_check_bands_1orn_unary">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="661">Check that an image has 1 or @n bands. Handy for unary operations, cf.
vips_check_bands_1orn().
If not, set an error message
and return non-zero.

See also: vips_check_bands_1orn().</doc>
      <source-position filename="libvips/include/vips/error.h" line="91"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="674">0 on OK, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="663">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="664">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="665">number of bands, or 1</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_bands_atleast"
              c:identifier="vips_check_bands_atleast">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="606">Check that the image has at least @bands bands.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="87"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="618">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="608">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="609">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="bands" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="610">at least this many bands</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_bands_same" c:identifier="vips_check_bands_same">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="997">Check that the images have the same number of bands.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="93"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1009">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="999">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1000">first image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="im2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1001">second image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_coding" c:identifier="vips_check_coding">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="506">Check that the image has the required @coding.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="73"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="518">0 on OK, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="508">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="509">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="coding" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="510">required coding</doc>
          <type name="Coding" c:type="VipsCoding"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_coding_known" c:identifier="vips_check_coding_known">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="478">Check that the image is uncoded, LABQ coded or RAD coded.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="75"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="489">0 on OK, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="480">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="481">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_coding_noneorlabq"
              c:identifier="vips_check_coding_noneorlabq">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="450">Check that the image is uncoded or LABQ coded.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="77"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="461">0 on OK, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="452">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="453">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_coding_same" c:identifier="vips_check_coding_same">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1077">Check that the images have the same coding.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="79"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1089">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1079">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1080">first image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="im2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1081">second image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_complex" c:identifier="vips_check_complex">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="711">Check that the image is complex.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="106"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="722">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="713">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="714">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_format" c:identifier="vips_check_format">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="762">Check that the image has the specified format.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="110"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="774">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="764">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="765">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="fmt" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="766">format to test for</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_format_same" c:identifier="vips_check_format_same">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1051">Check that the images have the same format.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="118"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1063">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1053">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1054">first image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="im2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1055">second image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_hist" c:identifier="vips_check_hist">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1164">Histogram images must have width or height 1, and must not have more than
65536 elements. Return 0 if the image will pass as a histogram, or -1 and
set an error message otherwise.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="128"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1175">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1166">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1167">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_int" c:identifier="vips_check_int">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="789">Check that the image is in one of the integer formats.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="98"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="800">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="791">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="792">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_matrix" c:identifier="vips_check_matrix">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1195">Matrix images must have width and height less than 100000 and have 1 band.

Return 0 if the image will pass as a matrix, or -1 and set an error
message otherwise.

@out is set to be @im cast to double and stored in memory. Use
VIPS_MATRIX() to address values in @out.

You must unref @out when you are done with it.

See also: VIPS_MATRIX(), vips_object_local()</doc>
      <source-position filename="libvips/include/vips/error.h" line="130"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1213">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1197">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1198">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1199">put image as in-memory doubles here</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_mono" c:identifier="vips_check_mono">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="532">Check that the image has exactly one band.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="81"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="543">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="534">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="535">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_noncomplex" c:identifier="vips_check_noncomplex">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="687">Check that the image is not complex.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="104"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="698">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="689">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="690">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_oddsquare" c:identifier="vips_check_oddsquare">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="971">Check that the image is square and that the sides are odd.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="122"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="982">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="973">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="974">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_precision_intfloat"
              c:identifier="vips_check_precision_intfloat">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1270">Check that @prec image is either float or int.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="135"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1281">0 on OK, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1272">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="precision" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1273">precision to check</doc>
          <type name="Precision" c:type="VipsPrecision"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_separable" c:identifier="vips_check_separable">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1244">Separable matrix images must have width or height 1.
Return 0 if the image will pass, or -1 and
set an error message otherwise.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="132"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1255">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1246">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1247">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_size_same" c:identifier="vips_check_size_same">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="945">Check that the images have the same size.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="120"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="957">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="947">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="948">first image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="im2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="949">second image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_twocomponents"
              c:identifier="vips_check_twocomponents">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="735">Check that the image is has two "components", ie. is a one-band complex or
a two-band non-complex.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="108"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="747">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="737">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="738">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_u8or16" c:identifier="vips_check_u8or16">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="866">Check that the image is 8 or 16-bit unsigned integer.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="112"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="877">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="868">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="869">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_u8or16orf" c:identifier="vips_check_u8or16orf">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="892">Check that the image is 8 or 16-bit unsigned integer, or float.
Otherwise set an error message and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="116"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="902">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="894">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="895">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_uint" c:identifier="vips_check_uint">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="813">Check that the image is in one of the unsigned integer formats.
Otherwise set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="100"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="824">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="815">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="816">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_uintorf" c:identifier="vips_check_uintorf">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="918">Check that the image is unsigned int or float.
Otherwise set an error message and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="102"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="928">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="920">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="921">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_uncoded" c:identifier="vips_check_uncoded">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="426">Check that the image is not coded.
If not, set an error message
and return non-zero.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="71"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="437">0 on OK, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="428">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="429">image to check</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_vector" c:identifier="vips_check_vector">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1126">Operations with a vector constant need a 1-element vector, or a vector with
the same number of elements as there are bands in the image, or a 1-band
image and a many-element vector.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="126"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1138">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1128">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1129">number of elements in vector</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="im" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1130">image to check against</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_vector_length"
              c:identifier="vips_check_vector_length">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="1103">Check that @n == @len.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="124"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="1113">0 if OK, -1 otherwise.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1105">the originating domain for the error message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1106">number of elements in vector</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="1107">number of elements vector should have</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="class_find" c:identifier="vips_class_find">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="2876">Search below @basename, return the first class whose name or @nickname
matches.

See also: vips_type_find()</doc>
      <source-position filename="libvips/include/vips/object.h" line="689"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2886">the found class.</doc>
        <type name="ObjectClass" c:type="const VipsObjectClass*"/>
      </return-value>
      <parameters>
        <parameter name="basename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2878">name of base class</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="nickname" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2879">search for a class with this nickname</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="class_map_all"
              c:identifier="vips_class_map_all"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="2811">Loop over all the subclasses of @type. Non-abstract classes only.
Stop when @fn returns
non-%NULL and return that value.</doc>
      <source-position filename="libvips/include/vips/object.h" line="687"/>
      <return-value transfer-ownership="none" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2821">%NULL if @fn returns %NULL for all arguments, otherwise the first
non-%NULL value from @fn.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="type" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2813">base type</doc>
          <type name="GType" c:type="GType"/>
        </parameter>
        <parameter name="fn" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2814">call this function for every type</doc>
          <type name="ClassMapFn" c:type="VipsClassMapFn"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2815">client data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_C2Ccmc" c:identifier="vips_col_C2Ccmc">
      <doc xml:space="preserve"
           filename="libvips/colour/LCh2UCS.c"
           line="102">Calculate Ccmc from C.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="255"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/LCh2UCS.c"
             line="108">Ccmc.</doc>
        <type name="gfloat" c:type="float"/>
      </return-value>
      <parameters>
        <parameter name="C" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2UCS.c"
               line="104">Chroma</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_Ccmc2C" c:identifier="vips_col_Ccmc2C">
      <doc xml:space="preserve"
           filename="libvips/colour/UCS2LCh.c"
           line="161">Calculate C from Ccmc using a table.
Call vips_col_make_tables_CMC() at
least once before using this function.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="264"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/UCS2LCh.c"
             line="169">C.</doc>
        <type name="gfloat" c:type="float"/>
      </return-value>
      <parameters>
        <parameter name="Ccmc" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/UCS2LCh.c"
               line="163">Ccmc</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_Ch2ab" c:identifier="vips_col_Ch2ab">
      <doc xml:space="preserve"
           filename="libvips/colour/LCh2Lab.c"
           line="60">Calculate ab from Ch, h in degrees.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="250"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="C" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2Lab.c"
               line="62">Chroma</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="h" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2Lab.c"
               line="63">Hue angle (degrees)</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="a" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2Lab.c"
               line="64">return CIE a* value</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2Lab.c"
               line="65">return CIE b* value</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_Ch2hcmc" c:identifier="vips_col_Ch2hcmc">
      <doc xml:space="preserve"
           filename="libvips/colour/LCh2UCS.c"
           line="122">Calculate hcmc from C and h.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="257"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/LCh2UCS.c"
             line="129">hcmc.</doc>
        <type name="gfloat" c:type="float"/>
      </return-value>
      <parameters>
        <parameter name="C" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2UCS.c"
               line="124">Chroma</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="h" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2UCS.c"
               line="125">Hue (degrees)</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_Chcmc2h" c:identifier="vips_col_Chcmc2h">
      <doc xml:space="preserve"
           filename="libvips/colour/UCS2LCh.c"
           line="183">Calculate h from C and hcmc, using a table.
Call vips_col_make_tables_CMC() at
least once before using this function.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="266"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/UCS2LCh.c"
             line="192">h.</doc>
        <type name="gfloat" c:type="float"/>
      </return-value>
      <parameters>
        <parameter name="C" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/UCS2LCh.c"
               line="185">Chroma</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="hcmc" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/UCS2LCh.c"
               line="186">Hue cmc (degrees)</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_L2Lcmc" c:identifier="vips_col_L2Lcmc">
      <doc xml:space="preserve"
           filename="libvips/colour/LCh2UCS.c"
           line="81">Calculate Lcmc from L.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="253"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/LCh2UCS.c"
             line="87">Lcmc</doc>
        <type name="gfloat" c:type="float"/>
      </return-value>
      <parameters>
        <parameter name="L" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LCh2UCS.c"
               line="83">CIE L*</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_Lab2XYZ" c:identifier="vips_col_Lab2XYZ">
      <doc xml:space="preserve"
           filename="libvips/colour/Lab2XYZ.c"
           line="230">Calculate XYZ from Lab, D65.

See also: vips_Lab2XYZ().</doc>
      <source-position filename="libvips/include/vips/colour.h" line="240"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="L" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2XYZ.c"
               line="232">Input CIE Lab value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="a" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2XYZ.c"
               line="233">Input CIE Lab value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2XYZ.c"
               line="234">Input CIE Lab value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="X"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2XYZ.c"
               line="235">Return CIE XYZ colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="Y"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2XYZ.c"
               line="236">Return CIE XYZ colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="Z"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2XYZ.c"
               line="237">Return CIE XYZ colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_Lcmc2L" c:identifier="vips_col_Lcmc2L">
      <doc xml:space="preserve"
           filename="libvips/colour/UCS2LCh.c"
           line="140">Calculate L from Lcmc using a table. Call vips_col_make_tables_CMC() at
least once before using this function.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="262"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/UCS2LCh.c"
             line="147">L*</doc>
        <type name="gfloat" c:type="float"/>
      </return-value>
      <parameters>
        <parameter name="Lcmc" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/UCS2LCh.c"
               line="142">L cmc</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_XYZ2Lab" c:identifier="vips_col_XYZ2Lab">
      <doc xml:space="preserve"
           filename="libvips/colour/XYZ2Lab.c"
           line="172">Calculate XYZ from Lab, D65.

See also: vips_XYZ2Lab().</doc>
      <source-position filename="libvips/include/vips/colour.h" line="243"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="X" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2Lab.c"
               line="174">Input CIE XYZ colour</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="Y" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2Lab.c"
               line="175">Input CIE XYZ colour</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="Z" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2Lab.c"
               line="176">Input CIE XYZ colour</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="L"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2Lab.c"
               line="177">Return CIE Lab value</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="a"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2Lab.c"
               line="178">Return CIE Lab value</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="b"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/XYZ2Lab.c"
               line="179">Return CIE Lab value</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_XYZ2scRGB" c:identifier="vips_col_XYZ2scRGB">
      <doc xml:space="preserve"
           filename="libvips/colour/LabQ2sRGB.c"
           line="247">Turn XYZ into scRGB.

See also: vips_XYZ2scRGB().</doc>
      <source-position filename="libvips/include/vips/colour.h" line="283"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="X" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="249">Input XYZ value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="Y" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="250">Input XYZ value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="Z" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="251">Input XYZ value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="R"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="252">Return scRGB colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="G"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="253">Return scRGB colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="B"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="254">Return scRGB colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_ab2Ch" c:identifier="vips_col_ab2Ch">
      <source-position filename="libvips/include/vips/colour.h" line="248"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="a" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="C" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="h" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_ab2h" c:identifier="vips_col_ab2h">
      <source-position filename="libvips/include/vips/colour.h" line="246"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/Lab2LCh.c"
             line="59">Hue (degrees)</doc>
        <type name="gdouble" c:type="double"/>
      </return-value>
      <parameters>
        <parameter name="a" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2LCh.c"
               line="56">CIE a</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/Lab2LCh.c"
               line="57">CIE b</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_dE00" c:identifier="vips_col_dE00">
      <doc xml:space="preserve"
           filename="libvips/colour/dE00.c"
           line="56">CIEDE2000, from:

Luo, Cui, Rigg, "The Development of the CIE 2000 Colour-Difference
Formula: CIEDE2000", COLOR research and application, pp 340</doc>
      <source-position filename="libvips/include/vips/colour.h" line="301"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/dE00.c"
             line="70">CIE dE2000 colour difference.</doc>
        <type name="gfloat" c:type="float"/>
      </return-value>
      <parameters>
        <parameter name="L1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="58">Input coordinate 1</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="a1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="59">Input coordinate 1</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="b1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="60">Input coordinate 1</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="L2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="61">Input coordinate 2</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="a2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="62">Input coordinate 2</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="b2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="63">Input coordinate 2</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_make_tables_CMC"
              c:identifier="vips_col_make_tables_CMC">
      <doc xml:space="preserve"
           filename="libvips/colour/UCS2LCh.c"
           line="222">Make the lookup tables for cmc.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="260"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="col_sRGB2scRGB_16" c:identifier="vips_col_sRGB2scRGB_16">
      <source-position filename="libvips/include/vips/colour.h" line="271"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="r" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="g" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="R" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_sRGB2scRGB_16_noclip"
              c:identifier="vips_col_sRGB2scRGB_16_noclip">
      <source-position filename="libvips/include/vips/colour.h" line="276"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="r" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="g" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="R" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_sRGB2scRGB_8" c:identifier="vips_col_sRGB2scRGB_8">
      <source-position filename="libvips/include/vips/colour.h" line="269"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="r" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="g" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="R" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_sRGB2scRGB_8_noclip"
              c:identifier="vips_col_sRGB2scRGB_8_noclip">
      <source-position filename="libvips/include/vips/colour.h" line="273"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="r" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="g" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="R" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_scRGB2BW_16" c:identifier="vips_col_scRGB2BW_16">
      <source-position filename="libvips/include/vips/colour.h" line="293"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="R" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="g" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="og" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_scRGB2BW_8" c:identifier="vips_col_scRGB2BW_8">
      <source-position filename="libvips/include/vips/colour.h" line="295"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="R" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="g" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="og" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_scRGB2XYZ" c:identifier="vips_col_scRGB2XYZ">
      <doc xml:space="preserve"
           filename="libvips/colour/LabQ2sRGB.c"
           line="214">Turn scRGB into XYZ.

See also: vips_scRGB2XYZ().</doc>
      <source-position filename="libvips/include/vips/colour.h" line="280"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="R" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="216">Input scRGB value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="217">Input scRGB value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="218">Input scRGB value</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="X"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="219">Return XYZ colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="Y"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="220">Return XYZ colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
        <parameter name="Z"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/LabQ2sRGB.c"
               line="221">Return XYZ colour</doc>
          <type name="gfloat" c:type="float*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_scRGB2sRGB_16" c:identifier="vips_col_scRGB2sRGB_16">
      <source-position filename="libvips/include/vips/colour.h" line="290"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="R" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="r" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="g" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="og" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
      </parameters>
    </function>
    <function name="col_scRGB2sRGB_8" c:identifier="vips_col_scRGB2sRGB_8">
      <source-position filename="libvips/include/vips/colour.h" line="287"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="R" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="G" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="B" transfer-ownership="none">
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="r" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="g" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="og" transfer-ownership="none">
          <type name="gint" c:type="int*"/>
        </parameter>
      </parameters>
    </function>
    <docsection name="colour">
      <doc xml:space="preserve"
           filename="libvips/colour/colour.c"
           line="49">These operators let you transform coordinates and images between colour
spaces, calculate colour differences, and move
to and from device spaces.

All operations process colour from the first few bands and pass other bands
through unaltered. This means you can operate on images with alpha channels
safely. If you move to or from 16-bit RGB, any alpha channels are rescaled
for you.

Radiance images have four 8-bits bands and store 8 bits of R, G and B and
another 8 bits of exponent, common to all channels. They are widely used in
the HDR imaging community.

The colour functions can be divided into three main groups. First,
functions to transform images between the different colour spaces supported
by VIPS: #VIPS_INTERPRETATION_sRGB, #VIPS_INTERPRETATION_scRGB,
#VIPS_INTERPRETATION_B_W,
#VIPS_INTERPRETATION_XYZ, #VIPS_INTERPRETATION_YXY,
#VIPS_INTERPRETATION_LAB,
#VIPS_INTERPRETATION_LCH, and
#VIPS_INTERPRETATION_CMC.

There are also a set of minor colourspaces which are one of the above in a
slightly different format:
#VIPS_INTERPRETATION_LAB, #VIPS_INTERPRETATION_LABQ,
#VIPS_INTERPRETATION_LABS, #VIPS_INTERPRETATION_LCH,
#VIPS_INTERPRETATION_RGB16, and #VIPS_INTERPRETATION_GREY16.

Use vips_colourspace() to move an image to a
target colourspace using the best sequence of colour transform operations.

Secondly, there are a set of operations for
calculating colour difference metrics. Finally, VIPS wraps LittleCMS and
uses it to provide a set of operations for reading and writing images with
ICC profiles.

This figure shows how the VIPS colour spaces interconvert:

&lt;para&gt;
  &lt;inlinegraphic fileref="interconvert.png" format="PNG" /&gt;
&lt;/para&gt;

The colour spaces supported by VIPS are:

* #VIPS_INTERPRETATION_LAB -- CIELAB '76 colourspace with a D65 white. This
  uses three floats for each band, and bands have the obvious range.

  There are two
  variants, #VIPS_INTERPRETATION_LABQ and #VIPS_INTERPRETATION_LABS, which
  use ints to store values. These are less precise, but can be quicker to
  store and process.

  #VIPS_INTERPRETATION_LCH is the same, but with a*b* as polar coordinates.
  Hue is expressed in degrees.

* #VIPS_INTERPRETATION_XYZ -- CIE XYZ. This uses three floats.
  See #VIPS_D75_X0 and friends for values for the ranges
  under various illuminants.

  #VIPS_INTERPRETATION_YXY is the same, but with little x and y.

* #VIPS_INTERPRETATION_scRGB -- a linear colourspace with the sRGB
  primaries. This is useful if you need linear light and don't care
  much what the primaries are.

  Linearization is performed with the usual sRGB equations, see below.

* #VIPS_INTERPRETATION_sRGB -- the standard sRGB colourspace, see:
  [wikipedia sRGB](http://en.wikipedia.org/wiki/SRGB).

  This uses three 8-bit values for each of RGB.

  #VIPS_INTERPRETATION_RGB16 is the same, but using three 16-bit values for
  RGB.

  #VIPS_INTERPRETATION_HSV is sRGB, but in polar coordinates.
  #VIPS_INTERPRETATION_LCH is much better, only use HSV if you have to.

* #VIPS_INTERPRETATION_B_W -- a monochrome image, roughly G from sRGB.
  The grey value is
  calculated in linear #VIPS_INTERPRETATION_scRGB space with RGB ratios
  0.2126, 0.7152, 0.0722 as defined by CIE 1931 linear luminance.

  #VIPS_INTERPRETATION_GREY16 is the same, but using 16 bits.

* #VIPS_INTERPRETATION_CMC -- a colour space based on the CMC(1:1)
  colour difference measurement. This is a highly uniform colour space,
  and much better than CIELAB for expressing small differences.

  The CMC colourspace is described in "Uniform Colour Space Based on the
  CMC(l:c) Colour-difference Formula", M R Luo and B Rigg, Journal of the
  Society of Dyers and Colourists, vol 102, 1986. Distances in this
  colourspace approximate, within 10% or so, differences in the CMC(l:c)
  colour difference formula.

  You can calculate metrics like CMC(2:1) by scaling the spaces before
  finding differences.</doc>
    </docsection>
    <function name="complex2" c:identifier="vips_complex2" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/complex.c"
           line="558">Perform various binary operations on complex images.

Angles are expressed in degrees. The output type is complex unless the
input is double or dpcomplex, in which case the output is dpcomplex.</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="326"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="571">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="560">input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="561">input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="562">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="cmplx" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="563">complex2 operation to perform</doc>
          <type name="OperationComplex2" c:type="VipsOperationComplex2"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="564">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="complexform"
              c:identifier="vips_complexform"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/complex.c"
           line="992">Compose two real images to make a complex image. If either @left or @right
are #VIPS_FORMAT_DOUBLE, @out is #VIPS_FORMAT_DPCOMPLEX. Otherwise @out
is #VIPS_FORMAT_COMPLEX. @left becomes the real component of @out and
@right the imaginary.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

See also: vips_complexget().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="345"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="1011">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="994">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="995">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="996">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="997">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="composite"
              c:identifier="vips_composite"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="72">Optional arguments:

* @compositing_space: #VipsInterpretation to composite in
* @premultiplied: %gboolean, images are already premultiplied
* @x: #VipsArrayInt, array of (@n - 1) x coordinates
* @y: #VipsArrayInt, array of (@n - 1) y coordinates

Composite an array of images together.

Images are placed in a stack, with @in[0] at the bottom and @in[@n - 1] at
the top. Pixels are blended together working from the bottom upwards, with
the blend mode at each step being set by the corresponding #VipsBlendMode
in @mode.

Images are transformed to a compositing space before processing. This is
#VIPS_INTERPRETATION_sRGB, #VIPS_INTERPRETATION_B_W,
#VIPS_INTERPRETATION_RGB16, or #VIPS_INTERPRETATION_GREY16
by default, depending on
how many bands and bits the input images have. You can select any other
space, such as #VIPS_INTERPRETATION_LAB or #VIPS_INTERPRETATION_scRGB.

The output image is in the compositing space. It will always be
#VIPS_FORMAT_FLOAT unless one of the inputs is #VIPS_FORMAT_DOUBLE, in
which case the output will be double as well.

Complex images are not supported.

The output image will always have an alpha band. A solid alpha is
added to any input missing an alpha.

The images do not need to match in size or format. The output image is
always the size of @in[0], with other images being
positioned with the @x and @y parameters and clipped
against that rectangle.

Image are normally treated as unpremultiplied, so this operation can be used
directly on PNG images. If your images have been through vips_premultiply(),
set @premultiplied.

See also: vips_insert().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="336"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/conversion.c"
             line="121">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/conversion.c"
               line="74">array of input images</doc>
          <array length="2" zero-terminated="0" c:type="VipsImage**">
            <type name="Image" c:type="VipsImage*"/>
          </array>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/conversion/conversion.c"
               line="75">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/conversion.c"
               line="76">number of input images</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="mode" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/conversion.c"
               line="77">array of (@n - 1) #VipsBlendMode</doc>
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/conversion.c"
               line="78">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="concurrency_get" c:identifier="vips_concurrency_get">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/thread.c"
           line="249">Returns the number of worker threads that vips should use when running a
#VipsThreadPool.

vips gets this values from these sources in turn:

If vips_concurrency_set() has been called, this value is used. The special
value 0 means "default". You can also use the command-line argument
"--vips-concurrency" to set this value.

If vips_concurrency_set() has not been called and no command-line argument
was used, vips uses the value of the environment variable VIPS_CONCURRENCY,

If VIPS_CONCURRENCY has not been set, vips finds the number of hardware
threads that the host machine can run in parallel and uses that value.

The final value is clipped to the range 1 - 1024.

See also: vips_concurrency_get().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="169"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/thread.c"
             line="271">number of worker threads to use.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="concurrency_set" c:identifier="vips_concurrency_set">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/thread.c"
           line="220">Sets the number of worker threads that vips should use when running a
#VipsThreadPool.

The special value 0 means "default". In this case, the number of threads
is set by the environment variable VIPS_CONCURRENCY, or if that is not
set, the number of threads available on the host machine.

See also: vips_concurrency_get().</doc>
      <source-position filename="libvips/include/vips/operation.h" line="167"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="concurrency" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/thread.c"
               line="222">number of threads to run</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <docsection name="connection">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/connection.c"
           line="58">A #VipsConnection is a source or sink of bytes for something like jpeg
loading, see for example vips_jpegload_source().

It can be connected to a network socket, for example, or perhaps
a node.js stream, or to an area of memory.

Subclass to add other input sources. Use #VipsSourceCustom and
#VipsTargetCustom to make a source or target with action signals for
::read, ::write and ::seek.</doc>
    </docsection>
    <docsection name="conversion">
      <doc xml:space="preserve"
           filename="libvips/conversion/conversion.c"
           line="52">These operations convert an image in some way. They can be split into a two
main groups.

The first set of operations change an image's format in some way. You
can change the band format (for example, cast to 32-bit unsigned
int), form complex images from real images, convert images to
matrices and back, change header fields, and a few others.

The second group move pixels about in some way. You can flip, rotate,
extract, insert and join pairs of images in various ways.</doc>
    </docsection>
    <docsection name="convolution">
      <doc xml:space="preserve"
           filename="libvips/convolution/convolution.c"
           line="54">These operations convolve an image in some way, or are operations based on
simple convolution, or are useful with convolution.</doc>
    </docsection>
    <docsection name="create">
      <doc xml:space="preserve"
           filename="libvips/create/create.c"
           line="54">These functions generate various images. You can combine them with
the arithmetic and rotate functions to build more complicated images.</doc>
    </docsection>
    <function name="cross_phase"
              c:identifier="vips_cross_phase"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/complex.c"
           line="587">Perform #VIPS_OPERATION_COMPLEX2_CROSS_PHASE on an image.
See vips_complex2().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="330"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/complex.c"
             line="597">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="589">input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="590">input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="591">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/complex.c"
               line="592">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="csvload" c:identifier="vips_csvload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/csvload.c"
           line="673">Optional arguments:

* @skip: skip this many lines at start of file
* @lines: read this many lines from file
* @whitespace: set of whitespace characters
* @separator: set of separator characters
* @fail_on: #VipsFailOn, types of read error to fail on

Load a CSV (comma-separated values) file. The output image is always 1
band (monochrome), #VIPS_FORMAT_DOUBLE. Use vips_bandfold() to turn
RGBRGBRGB mono images into colour images.

Items in lines can be either floating point numbers in the C locale, or
strings enclosed in double-quotes ("), or empty.
You can use a backslash (\) within the quotes to escape special characters,
such as quote marks.

@skip sets the number of lines to skip at the start of the file.
Default zero.

@lines sets the number of lines to read from the file. Default -1,
meaning read all lines to end of file.

@whitespace sets the skippable whitespace characters.
Default &lt;emphasis&gt;space&lt;/emphasis&gt;.
Whitespace characters are always run together.

@separator sets the characters that separate fields.
Default ;,&lt;emphasis&gt;tab&lt;/emphasis&gt;. Separators are never run together.

Use @fail_on to set the type of error that will cause load to fail. By
default, loaders are permissive, that is, #VIPS_FAIL_ON_NONE.

See also: vips_image_new_from_file(), vips_bandfold().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="657"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/csvload.c"
             line="714">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/csvload.c"
               line="675">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/csvload.c"
               line="676">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/csvload.c"
               line="677">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="csvload_source"
              c:identifier="vips_csvload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/csvload.c"
           line="729">Optional arguments:

* @skip: skip this many lines at start of file
* @lines: read this many lines from file
* @whitespace: set of whitespace characters
* @separator: set of separator characters
* @fail_on: #VipsFailOn, types of read error to fail on

Exactly as vips_csvload(), but read from a source.

See also: vips_csvload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="660"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/csvload.c"
             line="747">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/csvload.c"
               line="731">source to load</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/csvload.c"
               line="732">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/csvload.c"
               line="733">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="dE00" c:identifier="vips_dE00" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/colour/dE00.c"
           line="249">Calculate dE 00.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="233"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/dE00.c"
             line="258">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="251">first input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="252">second input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="253">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE00.c"
               line="254">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="dE76" c:identifier="vips_dE76" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/colour/dE76.c"
           line="126">Calculate dE 76.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="230"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/dE76.c"
             line="135">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="128">first input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="129">second input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="130">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="131">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="dECMC" c:identifier="vips_dECMC" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/colour/dECMC.c"
           line="74">Calculate dE CMC. The input images are transformed to CMC colour space and
the euclidean distance between corresponding pixels calculated.

To calculate a colour difference with values for (l:c) other than (1:1),
transform the two source images to CMC yourself, scale the channels
appropriately, and call this function.

See also: vips_colourspace()</doc>
      <source-position filename="libvips/include/vips/colour.h" line="236"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/dECMC.c"
             line="90">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dECMC.c"
               line="76">first input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dECMC.c"
               line="77">second input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/dECMC.c"
               line="78">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dECMC.c"
               line="79">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="divide" c:identifier="vips_divide" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/divide.c"
           line="222">This operation calculates @in1 / @in2 and writes the result to @out. If any
pixels in @in2 are zero, the corresponding pixel in @out is also zero.

If the images differ in size, the smaller image is enlarged to match the
larger by adding zero pixels along the bottom and right.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;), then the
following table is used to determine the output type:

&lt;table&gt;
  &lt;title&gt;vips_divide() type promotion&lt;/title&gt;
  &lt;tgroup cols='2' align='left' colsep='1' rowsep='1'&gt;
    &lt;thead&gt;
      &lt;row&gt;
        &lt;entry&gt;input type&lt;/entry&gt;
        &lt;entry&gt;output type&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;uchar&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;char&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;
&lt;/table&gt;

In other words, the output type is just large enough to hold the whole
range of possible values.

See also: vips_multiply(), vips_linear(), vips_pow().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="207"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/divide.c"
             line="304">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/divide.c"
               line="224">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/divide.c"
               line="225">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/divide.c"
               line="226">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/divide.c"
               line="227">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="draw">
      <doc xml:space="preserve"
           filename="libvips/draw/draw.c"
           line="48">These operations directly modify the image. They do not thread, on 32-bit
machines they will be limited to 2GB images, and a little care needs to be
taken if you use them as part of an image pipeline.
They are mostly supposed to be useful for paintbox-style programs.

libvips operations are all functional: they take zero or more existing input
images and generate zero or more new output images. Images are
never altered, you always create new images. This means libvips can cache
and thread very aggressively.

The downside is that creating entirely fresh images each time can be very
slow. libvips has a range of tricks to avoid these problems, but there are
still times when you really have to be able to modify an image. An example
might be drawing a curved line from a set of straight line segments: if you
need to draw 1,000 straight lines, a 1,000 operation-deep pipeline is going
to be a slow way to do it. This is where the draw operations come in.

To use these operations, use vips_image_copy_memory() to make a private
memory copy of the image you want to modify, then call a
series of draw operations.

Once you are done drawing, return to normal use of vips operations. Any time
you want to start drawing again, you'll need to copy again.</doc>
    </docsection>
    <function name="eorimage" c:identifier="vips_eorimage" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/boolean.c"
           line="393">Perform #VIPS_OPERATION_BOOLEAN_EOR on a pair of images. See
vips_boolean().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="432"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="403">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="395">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="396">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="397">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="398">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="equal" c:identifier="vips_equal" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/relational.c"
           line="315">Perform #VIPS_OPERATION_RELATIONAL_EQUAL on a pair of images. See
vips_relational().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="353"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="325">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="317">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="318">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="319">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="320">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="error" c:identifier="vips_error" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="259">Format the string in the style of printf() and append to the error buffer.

See also: vips_error_system(), vips_verror().</doc>
      <source-position filename="libvips/include/vips/error.h" line="51"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="261">the source of the error</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="fmt" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="262">printf()-style format string for the error</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="263">arguments to the format string</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="error_buffer" c:identifier="vips_error_buffer">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="167">Get a pointer to the start of the error buffer as a C string.
The string is owned by the error system and must not be freed.

See also: vips_error_clear().</doc>
      <source-position filename="libvips/include/vips/error.h" line="39"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="175">the error buffer as a C string which must not be freed</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
    </function>
    <function name="error_buffer_copy" c:identifier="vips_error_buffer_copy">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="189">Return a copy of the vips error buffer, and clear it.</doc>
      <source-position filename="libvips/include/vips/error.h" line="41"/>
      <return-value transfer-ownership="full">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/error.c"
             line="194">a copy of the libvips error buffer</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
    </function>
    <function name="error_clear" c:identifier="vips_error_clear">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="371">Clear and reset the error buffer. This is typically called after presenting
an error to the user.

See also: vips_error_buffer().</doc>
      <source-position filename="libvips/include/vips/error.h" line="43"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="error_exit"
              c:identifier="vips_error_exit"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="387">Sends a formatted error message to stderr, then sends the contents of the
error buffer, if any, then shuts down vips and terminates the program with
an error code.

@fmt may be %NULL, in which case only the error buffer is printed before
exiting.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="67"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="fmt" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="389">printf()-style format string for the message</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="390">arguments to the format string</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="error_freeze" c:identifier="vips_error_freeze">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="138">Stop errors being logged. Use vips_error_thaw() to unfreeze. You can
nest freeze/thaw pairs.</doc>
      <source-position filename="libvips/include/vips/error.h" line="46"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="error_g" c:identifier="vips_error_g" throws="1">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="322">This function sets the glib error pointer from the vips error buffer and
clears it. It's handy for returning errors to glib functions from vips.

See vips_g_error() for the inverse operation.

See also: g_set_error(), vips_g_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="62"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="error_system"
              c:identifier="vips_error_system"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="299">Format the string in the style of printf() and append to the error buffer.
Then create and append a localised message based on the system error code,
usually the value of errno.

See also: vips_verror_system().</doc>
      <source-position filename="libvips/include/vips/error.h" line="56"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="err" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="301">the system error code</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="302">the source of the error</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="fmt" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="303">printf()-style format string for the error</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="304">arguments to the format string</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="error_thaw" c:identifier="vips_error_thaw">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="153">Re-enable error logging.</doc>
      <source-position filename="libvips/include/vips/error.h" line="48"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <docsection name="errors">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="73">VIPS maintains an error buffer (a log of localised text messages),
a set of functions
for adding messages, and a way to access and clear the buffer.

The error buffer is global, that is, it is shared between all threads. You
can add to the buffer from any thread (there is a lock to prevent
corruption), but it's sensible to only read and clear the buffer from the
main thread of execution.

The general principle is: if you detect an error, log a message for the
user. If a function you call detects an error, just propagate it and don't
add another message.

|[
VipsImage *im;

if (!(im = vips_image_new_from_file(filename, NULL)))
    // vips_image_new_from_file() will set a message, we don't need to
    return -1;

if (vips_image_get_width(im) &amp;lt; 100) {
    // we have detected an error, we must set a message
    vips_error("myprogram", "%s", _("width too small"));
    return -1;
}
]|

The domain argument most of these functions take is not localised and is
supposed to indicate the component which failed.

libvips uses g_warning() and g_info() to send warning and information
messages to the user. You can use the usual glib mechanisms to display or
divert these messages. For example, info messages are hidden by default, but
you can see them with:

|[
$ G_MESSAGES_DEBUG=VIPS vipsthumbnail k2.jpg
VIPS-INFO: thumbnailing k2.jpg
VIPS-INFO: selected loader is VipsForeignLoadJpegFile
VIPS-INFO: input size is 1450 x 2048
VIPS-INFO: loading jpeg with factor 8 pre-shrink
VIPS-INFO: converting to processing space srgb
VIPS-INFO: residual reducev by 0.5
VIPS-INFO: 13 point mask
VIPS-INFO: using vector path
VIPS-INFO: residual reduceh by 0.5
VIPS-INFO: 13 point mask
VIPS-INFO: thumbnailing k2.jpg as ./tn_k2.jpg
]|</doc>
    </docsection>
    <function name="eye" c:identifier="vips_eye" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/eye.c"
           line="121">Optional arguments:

* @factor: %gdouble, maximum spatial frequency
* @uchar: %gboolean, output a uchar image

Create a test pattern with increasing spatial frequency in X and
amplitude in Y. @factor should be between 0 and 1 and determines the
maximum spatial frequency.

Set @uchar to output a uchar image.

See also: vips_zone().</doc>
      <source-position filename="libvips/include/vips/create.h" line="82"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/eye.c"
             line="141">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/eye.c"
               line="123">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/eye.c"
               line="124">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/eye.c"
               line="125">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/eye.c"
               line="126">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="filename_get_filename"
              c:identifier="vips_filename_get_filename">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="1804">Given a vips filename like "fred.jpg[Q=90]", return a new string of
just the filename part, "fred.jpg" in this case.

Useful for language bindings.

See also: vips_filename_get_options().</doc>
      <source-position filename="libvips/include/vips/image.h" line="455"/>
      <return-value transfer-ownership="full">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1815">transfer full: just the filename component.</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="vips_filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1806">a filename including a set of options</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="filename_get_options"
              c:identifier="vips_filename_get_options">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="1828">Given a vips filename like "fred.jpg[Q=90]", return a new string of
just the options part, "[Q=90]" in this case.

Useful for language bindings.

See also: vips_filename_get_filename().</doc>
      <source-position filename="libvips/include/vips/image.h" line="457"/>
      <return-value transfer-ownership="full">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="1839">transfer full: just the options component.</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="vips_filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="1830">a filename including a set of options</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="fitsload" c:identifier="vips_fitsload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/fitsload.c"
           line="352">Read a FITS image file into a VIPS image.

This operation can read images with up to three dimensions. Any higher
dimensions must be empty.

It can read 8, 16 and 32-bit integer images, signed and unsigned, float and
double.

FITS metadata is attached with the "fits-" prefix.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="632"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/fitsload.c"
             line="370">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/fitsload.c"
               line="354">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/fitsload.c"
               line="355">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/fitsload.c"
               line="356">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="foreign">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="76">This set of operations load and save images in a variety of formats.

# Load and save

You can load and save from and to files, memory areas, and the libvips IO
abstractions, #VipsSource and #VipsTarget.

Use vips_foreign_find_load(), vips_foreign_find_load_buffer() and
vips_foreign_find_load_source() to find a loader for an object. Use
vips_foreign_find_save(), vips_foreign_find_save_buffer() and
vips_foreign_find_save_target() to find a saver for a format. You can then
run these operations using vips_call() and friends to perform the load or
save.

vips_image_write_to_file() and vips_image_new_from_file() and friends use
these functions to automate file load and save.

You can also invoke the operations directly, for example:

|[
vips_tiffsave(my_image, "frank.anything",
    "compression", VIPS_FOREIGN_TIFF_COMPRESSION_JPEG,
    NULL);
]|

# Image metadata

All loaders attach all image metadata as libvips properties on load.

You can change metadata with vips_image_set_int() and friends.

During save, you can use @keep to specify which metadata to retain,
defaults to all, see #VipsForeignKeep. Setting @profile will
automatically keep the ICC profile.

# Many page images

By default, libvips will only load the first page of many page or animated
images. Use @page and @n to set the start page and the number of pages to
load. Set @n to -1 to load all pages.

Many page images are loaded as a tall, thin strip of pages.

Use vips_image_get_page_height() and vips_image_get_n_pages() to find the
page height and number of pages of a loaded image.

Use @page_height to set the page height for image save.

# Alpha save

Not all image formats support alpha. If you try to save an image with an
alpha channel to a format that does not support it, the alpha will be
automatically flattened out. Use @background (default 0) to set the colour
that alpha should be flattened against.

# Adding new formats

To add support for a new file format to vips, simply define a new subclass
of #VipsForeignLoad or #VipsForeignSave.

If you define a new operation which is a subclass of #VipsForeign, support
for it automatically appears in all VIPS user-interfaces. It will also be
transparently supported by vips_image_new_from_file() and friends.

## Writing a new loader

Add a new loader to VIPS by subclassing #VipsForeignLoad. Subclasses need to
implement at least @header().

@header() must set at least the header fields of @out. @load(), if defined,
must load the pixels to @real.

The suffix list is used to select a format to save a file in, and to pick a
loader if you don't define is_a().

You should also define @nickname and @description in #VipsObject.

As a complete example, here's code for a PNG loader, minus the actual
calls to libpng.

|[
typedef struct _VipsForeignLoadPng {
    VipsForeignLoad parent_object;

    char *filename;
} VipsForeignLoadPng;

typedef VipsForeignLoadClass VipsForeignLoadPngClass;

G_DEFINE_TYPE(VipsForeignLoadPng, vips_foreign_load_png,
    VIPS_TYPE_FOREIGN_LOAD);

static VipsForeignFlags
vips_foreign_load_png_get_flags_filename(const char *filename)
{
    VipsForeignFlags flags;

    flags = 0;
    if (vips__png_isinterlaced(filename))
         flags = VIPS_FOREIGN_PARTIAL;
    else
         flags = VIPS_FOREIGN_SEQUENTIAL;

    return flags;
}

static VipsForeignFlags
vips_foreign_load_png_get_flags(VipsForeignLoad *load)
{
  VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;

  return vips_foreign_load_png_get_flags_filename(png-&gt;filename);
}

static int
vips_foreign_load_png_header(VipsForeignLoad *load)
{
    VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;

    if (vips__png_header(png-&gt;filename, load-&gt;out))
        return -1;

    return 0;
}

static int
vips_foreign_load_png_load(VipsForeignLoad *load)
{
    VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;

    if (vips__png_read(png-&gt;filename, load-&gt;real))
        return -1;

    return 0;
}

static void
vips_foreign_load_png_class_init(VipsForeignLoadPngClass *class)
{
    GObjectClass *gobject_class = G_OBJECT_CLASS(class);
    VipsObjectClass *object_class = (VipsObjectClass *) class;
    VipsForeignClass *foreign_class = (VipsForeignClass *) class;
    VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;

    gobject_class-&gt;set_property = vips_object_set_property;
    gobject_class-&gt;get_property = vips_object_get_property;

    object_class-&gt;nickname = "pngload";
    object_class-&gt;description = _("load png from file");

    foreign_class-&gt;suffs = vips__png_suffs;

    load_class-&gt;is_a = vips__png_ispng;
    load_class-&gt;get_flags_filename =
        vips_foreign_load_png_get_flags_filename;
    load_class-&gt;get_flags = vips_foreign_load_png_get_flags;
    load_class-&gt;header = vips_foreign_load_png_header;
    load_class-&gt;load = vips_foreign_load_png_load;

    VIPS_ARG_STRING(class, "filename", 1,
        _("Filename"),
        _("Filename to load from"),
        VIPS_ARGUMENT_REQUIRED_INPUT,
        G_STRUCT_OFFSET(VipsForeignLoadPng, filename),
        NULL);
}

static void
vips_foreign_load_png_init(VipsForeignLoadPng *png)
{
}
]|

## Writing a new saver

Call your saver in the class' @build() method after chaining up. The
prepared image should be ready for you to save in @ready.

As a complete example, here's the code for the CSV saver, minus the calls
to the actual save routines.

|[
typedef struct _VipsForeignSaveCsv {
    VipsForeignSave parent_object;

    char *filename;
    const char *separator;
} VipsForeignSaveCsv;

typedef VipsForeignSaveClass VipsForeignSaveCsvClass;

G_DEFINE_TYPE(VipsForeignSaveCsv, vips_foreign_save_csv,
  VIPS_TYPE_FOREIGN_SAVE);

static int
vips_foreign_save_csv_build(VipsObject *object)
{
    VipsForeignSave *save = (VipsForeignSave *) object;
    VipsForeignSaveCsv *csv = (VipsForeignSaveCsv *) object;

    if (VIPS_OBJECT_CLASS(vips_foreign_save_csv_parent_class)
            -&gt;build(object))
        return -1;

    if (vips__csv_write(save-&gt;ready, csv-&gt;filename, csv-&gt;separator))
  	  return -1;

    return 0;
}

static void
vips_foreign_save_csv_class_init(VipsForeignSaveCsvClass *class)
{
    GObjectClass *gobject_class = G_OBJECT_CLASS(class);
    VipsObjectClass *object_class = (VipsObjectClass *) class;
    VipsForeignClass *foreign_class = (VipsForeignClass *) class;
    VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;

    gobject_class-&gt;set_property = vips_object_set_property;
    gobject_class-&gt;get_property = vips_object_get_property;

    object_class-&gt;nickname = "csvsave";
    object_class-&gt;description = _("save image to csv file");
    object_class-&gt;build = vips_foreign_save_csv_build;

    foreign_class-&gt;suffs = vips__foreign_csv_suffs;

    save_class-&gt;saveable = VIPS_SAVEABLE_MONO;
    // no need to define -&gt;format_table, we don't want the input
    // cast for us

    VIPS_ARG_STRING(class, "filename", 1,
        _("Filename"),
        _("Filename to save to"),
        VIPS_ARGUMENT_REQUIRED_INPUT,
        G_STRUCT_OFFSET(VipsForeignSaveCsv, filename),
        NULL);

    VIPS_ARG_STRING(class, "separator", 13,
        _("Separator"),
        _("Separator characters"),
        VIPS_ARGUMENT_OPTIONAL_INPUT,
        G_STRUCT_OFFSET(VipsForeignSaveCsv, separator),
        "\t");
}

static void
vips_foreign_save_csv_init(VipsForeignSaveCsv *csv)
{
    csv-&gt;separator = g_strdup("\t");
}
]|</doc>
    </docsection>
    <function name="foreign_flags" c:identifier="vips_foreign_flags">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="860">Return the flags for @filename using @loader.
@loader is something like "tiffload" or "VipsForeignLoadTiff".</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="284"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="868">the flags for @filename.</doc>
        <type name="ForeignFlags" c:type="VipsForeignFlags"/>
      </return-value>
      <parameters>
        <parameter name="loader" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="862">name of loader to use for test</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="863">file to test</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="format_sizeof" c:identifier="vips_format_sizeof">
      <source-position filename="libvips/include/vips/header.h" line="182"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="208">number of bytes for a band format.</doc>
        <type name="guint64" c:type="guint64"/>
      </return-value>
      <parameters>
        <parameter name="format" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="206">format type</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </parameter>
      </parameters>
    </function>
    <function name="format_sizeof_unsafe"
              c:identifier="vips_format_sizeof_unsafe"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/header.c"
           line="218">A fast but dangerous version of vips_format_sizeof(). You must have
previously range-checked @format or you'll crash.</doc>
      <source-position filename="libvips/include/vips/header.h" line="184"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="225">number of bytes for a band format.</doc>
        <type name="guint64" c:type="guint64"/>
      </return-value>
      <parameters>
        <parameter name="format" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="220">format type</doc>
          <type name="BandFormat" c:type="VipsBandFormat"/>
        </parameter>
      </parameters>
    </function>
    <function name="fractsurf"
              c:identifier="vips_fractsurf"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/fractsurf.c"
           line="133">Generate an image of size @width by @height and fractal dimension
@fractal_dimension. The dimension should be between 2 and 3.

See also: vips_gaussnoise(), vips_mask_fractal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="157"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/fractsurf.c"
             line="146">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/fractsurf.c"
               line="135">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/fractsurf.c"
               line="136">output width</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/fractsurf.c"
               line="137">output height</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="fractal_dimension" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/fractsurf.c"
               line="138">fractal dimension</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/fractsurf.c"
               line="139">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="freqfilt">
      <doc xml:space="preserve"
           filename="libvips/freqfilt/freqfilt.c"
           line="52">To and from Fourier space, filter in Fourier space, convert Fourier-space
images to a displayable form.</doc>
    </docsection>
    <function name="g_error" c:identifier="vips_g_error" throws="1">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="351">This function adds the %GError to the vips error buffer and clears it. It's
the opposite of vips_error_g().

See also: vips_error_g().</doc>
      <source-position filename="libvips/include/vips/error.h" line="64"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="gaussmat" c:identifier="vips_gaussmat" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/gaussmat.c"
           line="228">Optional arguments:

* @separable: generate a separable gaussian
* @precision: #VipsPrecision for @out

Creates a circularly symmetric Gaussian image of radius
@sigma.  The size of the mask is determined by the variable @min_ampl;
if for instance the value .1 is entered this means that the produced mask
is clipped at values less than 10 percent of the maximum amplitude.

The program uses the following equation:

  H(r) = exp(-(r * r) / (2 * @sigma * @sigma))

The generated image has odd size and its maximum value is normalised to
1.0, unless @precision is #VIPS_PRECISION_INTEGER.

If @separable is set, only the centre horizontal is generated. This is
useful for separable convolutions.

If @precision is #VIPS_PRECISION_INTEGER, an integer gaussian is generated.
This is useful for integer convolutions.

"scale" is set to the sum of all the mask elements.

See also: vips_logmat(), vips_conv().</doc>
      <source-position filename="libvips/include/vips/create.h" line="68"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/gaussmat.c"
             line="262">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/gaussmat.c"
               line="230">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="sigma" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/gaussmat.c"
               line="231">standard deviation of mask</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="min_ampl" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/gaussmat.c"
               line="232">minimum amplitude</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/gaussmat.c"
               line="233">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="gaussnoise"
              c:identifier="vips_gaussnoise"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/gaussnoise.c"
           line="210">Optional arguments:

* @mean: mean of generated pixels
* @sigma: standard deviation of generated pixels

Make a one band float image of gaussian noise with the specified
distribution. The noise distribution is created by averaging 12 random
numbers with the appropriate weights.

See also: vips_black(), vips_xyz(), vips_text().</doc>
      <source-position filename="libvips/include/vips/create.h" line="79"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/gaussnoise.c"
             line="228">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/gaussnoise.c"
               line="212">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/gaussnoise.c"
               line="213">output width</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/gaussnoise.c"
               line="214">output height</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/gaussnoise.c"
               line="215">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="generate">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/generate.c"
           line="114">These functions let you attach generate functions to images
and ask for regions of images to be calculated.</doc>
    </docsection>
    <function name="get_argv0" c:identifier="vips_get_argv0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="168">See also: VIPS_INIT().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="170"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/init.c"
             line="173">a pointer to an internal copy of the
argv0 string passed to
VIPS_INIT(). Do not free this value</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
    </function>
    <function name="get_disc_threshold" c:identifier="vips_get_disc_threshold">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="2507">Return the number of bytes at which we flip between open via memory and
open via disc. This defaults to 100mb, but can be changed with the
VIPS_DISC_THRESHOLD environment variable or the --vips-disc-threshold
command-line flag. See vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/image.h" line="506"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/image.c"
             line="2515">disc threshold in bytes.</doc>
        <type name="guint64" c:type="guint64"/>
      </return-value>
    </function>
    <function name="get_prgname" c:identifier="vips_get_prgname">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="183">Return the program name. This can be useful for the user tio see,.

See also: VIPS_INIT().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="172"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/init.c"
             line="190">a pointer to an internal copy of the program
name. Do not free this value</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
    </function>
    <function name="gifload" c:identifier="vips_gifload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/nsgifload.c"
           line="917">Optional arguments:

* @page: %gint, page (frame) to read
* @n: %gint, load this many pages
* @fail_on: #VipsFailOn, types of read error to fail on

Read a GIF file into a libvips image.

Use @page to select a page to render, numbering from zero.

Use @n to select the number of pages to render. The default is 1. Pages are
rendered in a vertical column. Set to -1 to mean "until the end of the
document". Use vips_grid() to change page layout.

Use @fail_on to set the type of error that will cause load to fail. By
default, loaders are permissive, that is, #VIPS_FAIL_ON_NONE.

The output image is RGBA for GIFs containing transparent elements, RGB
otherwise.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="829"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/nsgifload.c"
             line="945">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="919">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="920">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="921">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="gifload_buffer"
              c:identifier="vips_gifload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/nsgifload.c"
           line="960">Optional arguments:

* @page: %gint, page (frame) to read
* @n: %gint, load this many pages
* @fail_on: #VipsFailOn, types of read error to fail on

Exactly as vips_gifload(), but read from a memory buffer.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_gifload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="832"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/nsgifload.c"
             line="980">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="962">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="963">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="964">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="965">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="gifload_source"
              c:identifier="vips_gifload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/nsgifload.c"
           line="1002">Optional arguments:

* @page: %gint, page (frame) to read
* @n: %gint, load this many pages
* @fail_on: #VipsFailOn, types of read error to fail on

Exactly as vips_gifload(), but read from a source.

See also: vips_gifload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="835"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/nsgifload.c"
             line="1018">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="1004">source to load</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="1005">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/nsgifload.c"
               line="1006">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="gravity" c:identifier="vips_gravity" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/embed.c"
           line="824">Optional arguments:

* @extend: #VipsExtend to generate the edge pixels (default: black)
* @background: #VipsArrayDouble colour for edge pixels

The opposite of vips_extract_area(): place @in within an image of size
@width by @height at a certain gravity.

@extend
controls what appears in the new pels, see #VipsExtend.

See also: vips_extract_area(), vips_insert().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="158"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/embed.c"
             line="846">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/embed.c"
               line="826">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/embed.c"
               line="827">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="direction" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/embed.c"
               line="828">place @in at this direction in @out</doc>
          <type name="CompassDirection" c:type="VipsCompassDirection"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/embed.c"
               line="829">@out should be this many pixels across</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/embed.c"
               line="830">@out should be this many pixels down</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/embed.c"
               line="831">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="grey" c:identifier="vips_grey" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/grey.c"
           line="101">Optional arguments:

* @uchar: output a uchar image

Create a one-band float image with the left-most column zero and the
right-most 1. Intermediate pixels are a linear ramp.

Set @uchar to output a uchar image with the leftmost pixel 0 and the
rightmost 255.

See also: vips_xyz(), vips_identity().</doc>
      <source-position filename="libvips/include/vips/create.h" line="65"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/grey.c"
             line="120">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/grey.c"
               line="103">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/grey.c"
               line="104">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/grey.c"
               line="105">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/grey.c"
               line="106">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="guess_libdir" c:identifier="vips_guess_libdir">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="1180">vips_guess_libdir() tries to guess the install directory (usually the
configure libdir, or $prefix/lib). You should pass
in the value of argv[0] (the name your program was run as) as a clue to
help it out, plus the name of the environment variable you let the user
override your package install area with (eg. "VIPSHOME").

On success, vips_guess_libdir() returns the libdir it discovered, and as a
side effect, sets the prefix environment variable (if it's not set).

Don't free the return string!

See also: vips_guess_prefix().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="195"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/init.c"
             line="1198">the libdir as a static string, do not free.</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
      <parameters>
        <parameter name="argv0" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="1182">program name (typically argv[0])</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="env_name" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="1183">save prefix in this environment variable</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="guess_prefix" c:identifier="vips_guess_prefix">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="1134">vips_guess_prefix() tries to guess the install directory. You should pass
in the value of argv[0] (the name your program was run as) as a clue to
help it out, plus the name of the environment variable you let the user
override your package install area with (eg. "VIPSHOME").

On success, vips_guess_prefix() returns the prefix it discovered, and as a
side effect, sets the environment variable (if it's not set).

Don't free the return string!

See also: vips_guess_libdir().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="193"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/init.c"
             line="1151">the install prefix as a static string, do not free.</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
      <parameters>
        <parameter name="argv0" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="1136">program name (typically argv[0])</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="env_name" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="1137">save prefix in this environment variable</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <docsection name="header">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/header.c"
           line="89">These functions let you get at image header data (including metadata) in a
uniform way.

Use vips_image_get_typeof() to test for the
existence and #GType of a header field.

You can attach arbitrary metadata to images. Metadata is copied as images
are processed, so all images which used this image as input, directly or
indirectly, will have this same bit of metadata attached to them. Copying
is implemented with reference-counted pointers, so it is efficient, even for
large items of data. This does however mean that metadata items need to be
immutable. Metadata is handy for things like ICC profiles or EXIF data.

Various convenience functions (eg. vips_image_set_int()) let you easily
attach
simple types like
numbers, strings and memory blocks to images. Use vips_image_map() to loop
over an image's fields, including all metadata.

Items of metadata are identified by strings. Some strings are reserved, for
example the ICC profile for an image is known by convention as
"icc-profile-data".

If you save an image in VIPS format, all metadata (with a restriction, see
below) is automatically saved for you in a block of XML at the end of the
file. When you load a VIPS image, the metadata is restored. You can use the
`vipsedit` command-line tool to extract or replace this block of XML.

VIPS metadata is based on %GValue. See the docs for that system if you want
to do fancy stuff such as defining a new metadata type.
VIPS defines a new %GValue called `vips_save_string`, a variety of string,
see vips_value_set_save_string().
If your %GValue can be transformed to `vips_save_string`, it will be
saved and loaded to and from VIPS files for you.

VIPS provides a couple of base classes which implement
reference-counted areas of memory. If you base your metadata on one of
these types, it can be copied between images efficiently.</doc>
    </docsection>
    <function name="heifload" c:identifier="vips_heifload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2227">Optional arguments:

* @page: %gint, page (top-level image number) to read
* @n: %gint, load this many pages
* @thumbnail: %gboolean, fetch thumbnail instead of image
* @unlimited: %gboolean, remove all denial of service limits

Read a HEIF image file into a VIPS image.

Use @page to select a page to render, numbering from zero. If neither @n
nor @page are set, @page defaults to the primary page, otherwise to 0.

Use @n to select the number of pages to render. The default is 1. Pages are
rendered in a vertical column. Set to -1 to mean "until the end of the
document". Use vips_grid() to reorganise pages.

HEIF images have a primary image. The metadata item `heif-primary` gives
the page number of the primary.

If @thumbnail is %TRUE, then fetch a stored thumbnail rather than the
image.

By default, input image dimensions are limited to 16384x16384.
If @unlimited is %TRUE, this increases to the maximum of 65535x65535.

The bitdepth of the heic image is recorded in the metadata item
`heif-bitdepth`.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="849"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2263">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2229">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2230">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2231">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="heifload_buffer"
              c:identifier="vips_heifload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2278">Optional arguments:

* @page: %gint, page (top-level image number) to read
* @n: %gint, load this many pages
* @thumbnail: %gboolean, fetch thumbnail instead of image
* @unlimited: %gboolean, remove all denial of service limits

Read a HEIF image file into a VIPS image.
Exactly as vips_heifload(), but read from a memory buffer.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_heifload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="852"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2300">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2280">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2281">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2282">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2283">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="heifload_source"
              c:identifier="vips_heifload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2322">Optional arguments:

* @page: %gint, page (top-level image number) to read
* @n: %gint, load this many pages
* @thumbnail: %gboolean, fetch thumbnail instead of image
* @unlimited: %gboolean, remove all denial of service limits

Exactly as vips_heifload(), but read from a source.

See also: vips_heifload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="855"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2339">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2324">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2325">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2326">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="histogram">
      <doc xml:space="preserve"
           filename="libvips/histogram/histogram.c"
           line="49">Histograms and look-up tables are 1xn or nx1 images, where n is less than
256 or less than 65536, corresponding to 8- and 16-bit unsigned int images.
They are tagged with a #VipsInterpretation of
#VIPS_INTERPRETATION_HISTOGRAM and usually displayed by user-interfaces
such as nip2 as plots rather than images.

These functions can be broadly grouped as things to find or build
histograms (vips_hist_find(), vips_hist_find_indexed(),
vips_hist_find_ndim(), vips_buildlut(), vips_identity()),
operations that
manipulate histograms in some way (vips_hist_cum(), vips_hist_norm()),
operations to apply histograms (vips_maplut()), and a variety of utility
operations.

A final group of operations build tone curves. These are useful in
pre-press work for adjusting the appearance of images. They are designed
for CIELAB images, but might be useful elsewhere.</doc>
    </docsection>
    <function name="icc_is_compatible_profile"
              c:identifier="vips_icc_is_compatible_profile">
      <source-position filename="libvips/include/vips/colour.h" line="226"/>
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="image" transfer-ownership="none">
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="data"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="data_length" transfer-ownership="none">
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="icc_present" c:identifier="vips_icc_present">
      <doc xml:space="preserve"
           filename="libvips/colour/icc_transform.c"
           line="125">VIPS can optionally be built without the ICC library. Use this function to
test for its availability.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="211"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/icc_transform.c"
             line="131">non-zero if the ICC library is present.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="identity" c:identifier="vips_identity" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/identity.c"
           line="172">Optional arguments:

* @bands: number of bands to create
* @ushort: %TRUE for an unsigned short identity
* @size: number of LUT elements for a ushort image

Creates an identity lookup table, ie. one which will leave an image
unchanged when applied with vips_maplut(). Each entry in the table has a
value equal to its position.

Use the arithmetic operations on these tables to make LUTs representing
arbitrary functions.

Normally LUTs are 8-bit. Set @ushort to create a 16-bit table.

Normally 16-bit tables have 65536 entries. You can set this smaller with
@size.

See also: vips_xyz(), vips_maplut().</doc>
      <source-position filename="libvips/include/vips/create.h" line="95"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/identity.c"
             line="197">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/identity.c"
               line="174">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/identity.c"
               line="175">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="ifthenelse"
              c:identifier="vips_ifthenelse"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/ifthenelse.c"
           line="559">Optional arguments:

* @blend: blend smoothly between @in1 and @in2

This operation scans the condition image @cond
and uses it to select pixels from either the then image @in1 or the else
image @in2. Non-zero means @in1, 0 means @in2.

Any image can have either 1 band or n bands, where n is the same for all
the non-1-band images. Single band images are then effectively copied to
make n-band images.

Images @in1 and @in2 are cast up to the smallest common format. @cond is
cast to uchar.

If the images differ in size, the smaller images are enlarged to match the
largest by adding zero pixels along the bottom and right.

If @blend is %TRUE, then values in @out are smoothly blended between @in1
and @in2 using the formula:

  @out = (@cond / 255) * @in1 + (1 - @cond / 255) * @in2

See also: vips_equal().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="316"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/ifthenelse.c"
             line="592">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="cond" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/ifthenelse.c"
               line="561">condition #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="in1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/ifthenelse.c"
               line="562">then #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="in2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/ifthenelse.c"
               line="563">else #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/conversion/ifthenelse.c"
               line="564">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/ifthenelse.c"
               line="565">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="image">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="74">The image class and associated types and macros.

Images can be created from formatted files on disc, from C-style arrays on
disc, from formatted areas of memory, or from C-style arrays in memory. See
vips_image_new_from_file() and friends.
Creating an image is fast. VIPS reads just enough of
the image to be able to get the various properties, such as width in
pixels. It delays reading any pixels until they are really needed.

Once you have an image, you can get properties from it in the usual way.
You can use projection functions, like vips_image_get_width() or
g_object_get(), to get %GObject properties.

VIPS images are three-dimensional arrays, the dimensions being width,
height and bands. Each dimension can be up to 2 ** 31 pixels (or band
elements). An image has a format, meaning the machine number type used
to represent each value. VIPS supports 10 formats, from 8-bit unsigned
integer up to 128-bit double complex, see vips_image_get_format().

In VIPS, images are uninterpreted arrays, meaning that from the point of
view of most operations, they are just large collections of numbers.
There's no difference between an RGBA (RGB with alpha) image and a CMYK
image, for example, they are both just four-band images. It's up to the
user of the library to pass the right sort of image to each operation.

To take an example, VIPS has vips_Lab2XYZ(), an operation to transform
an image from CIE LAB colour space to CIE XYZ space. It assumes the
first three bands represent pixels in LAB colour space and returns an
image where the first three bands are transformed to XYZ and any
remaining bands are just copied. Pass it a RGB image by mistake and
you'll just get nonsense.

VIPS has a feature to help (a little) with this: it sets a
#VipsInterpretation hint for each image (see
vips_image_get_interpretation()); a hint which says how pixels should
be interpreted. For example, vips_Lab2XYZ() will set the
interpretation of the output image to #VIPS_INTERPRETATION_XYZ. A
few utility operations will also use interpretation as a guide. For
example, you can give vips_colourspace() an input image and a desired
colourspace and it will use the input's interpretation hint to apply
the best sequence of colourspace transforms to get to the desired space.

Use things like vips_invert() to manipulate your images. When you are done,
you can write images to disc files (with vips_image_write_to_file()),
to formatted memory buffers (with vips_image_write_to_buffer()) and to
C-style memory arrays (with vips_image_write_to_memory().

You can also write images to other images. Create, for example, a temporary
disc image with vips_image_new_temp_file(), then write your image to that
with vips_image_write(). You can create several other types of image and
write to them, see vips_image_new_memory(), for example.

See &lt;link linkend="VipsOperation"&gt;operation&lt;/link&gt; for an introduction to
running operations on images, see &lt;link
linkend="libvips-header"&gt;header&lt;/link&gt; for getting and setting image
metadata. See &lt;link linkend="VipsObject"&gt;object&lt;/link&gt; for a discussion of
the lower levels.</doc>
    </docsection>
    <function name="init" c:identifier="vips_init">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="424">This function starts up libvips, see VIPS_INIT().

This function is for bindings which need to start up vips. C programs
should use the VIPS_INIT() macro, which does some extra checks.

See also: VIPS_INIT().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="168"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/init.c"
             line="435">0 on success, -1 otherwise</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="argv0" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="426">name of application</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="interpolate"
              c:identifier="vips_interpolate"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/resample/interpolate.c"
           line="203">Look up the @interpolate method in the class and call it. Use
vips_interpolate_get_method() to get a direct pointer to the function and
avoid the lookup overhead.

You need to set @in and @out up correctly.</doc>
      <source-position filename="libvips/include/vips/interpolate.h"
                       line="99"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="interpolate" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="205">interpolator to use</doc>
          <type name="Interpolate" c:type="VipsInterpolate*"/>
        </parameter>
        <parameter name="out"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="206">write result here</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="207">read source data from here</doc>
          <type name="Region" c:type="VipsRegion*"/>
        </parameter>
        <parameter name="x" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="208">interpolate value at this position</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="y" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/interpolate.c"
               line="209">interpolate value at this position</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
      </parameters>
    </function>
    <docsection name="interpolator">
      <doc xml:space="preserve"
           filename="libvips/resample/interpolate.c"
           line="65">A number of image interpolators.</doc>
    </docsection>
    <function name="interpretation_max_alpha"
              c:identifier="vips_interpretation_max_alpha"
              moved-to="Interpretation.max_alpha">
      <source-position filename="libvips/include/vips/header.h" line="187"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/header.c"
             line="239">the maximum alpha value for an interpretation.</doc>
        <type name="gdouble" c:type="double"/>
      </return-value>
      <parameters>
        <parameter name="interpretation" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/header.c"
               line="237">image interpretation</doc>
          <type name="Interpretation" c:type="VipsInterpretation"/>
        </parameter>
      </parameters>
    </function>
    <function name="join" c:identifier="vips_join" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/join.c"
           line="294">Optional arguments:

* @expand: %TRUE to expand the output image to hold all of the input pixels
* @shim: space between images, in pixels
* @background: background ink colour
* @align: low, centre or high alignment

Join @in1 and @in2 together, left-right or up-down depending on the value
of @direction.

If one is taller or wider than the
other, @out will be has high as the smaller. If @expand is %TRUE, then
the output will be expanded to contain all of the input pixels.

Use @align to set the edge that the images align on. By default, they align
on the edge with the lower value coordinate.

Use @background to set the colour of any pixels in @out which are not
present in either @in1 or @in2.

Use @shim to set the spacing between the images. By default this is 0.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common type (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;).

If you are going to be joining many thousands of images in a regular
grid, vips_arrayjoin() is a better choice.

See also: vips_arrayjoin(), vips_insert().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="169"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/join.c"
             line="338">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/join.c"
               line="296">first input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="in2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/join.c"
               line="297">second input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/conversion/join.c"
               line="298">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="direction" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/join.c"
               line="299">join horizontally or vertically</doc>
          <type name="Direction" c:type="VipsDirection"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/join.c"
               line="300">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jp2kload" c:identifier="vips_jp2kload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/jp2kload.c"
           line="1606">Optional arguments:

* @page: %gint, load this page
* @fail_on: #VipsFailOn, types of read error to fail on

Read a JPEG2000 image. The loader supports 8, 16 and 32-bit int pixel
values, signed and unsigned. It supports greyscale, RGB, YCC, CMYK and
multispectral colour spaces. It will read any ICC profile on the image.

It will only load images where all channels have the same format.

Use @page to set the page to load, where page 0 is the base resolution
image and higher-numbered pages are x2 reductions. Use the metadata item
"n-pages" to find the number of pyramid layers.

Use @fail_on to set the type of error that will cause load to fail. By
default, loaders are permissive, that is, #VIPS_FAIL_ON_NONE.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="878"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/jp2kload.c"
             line="1632">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1608">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1609">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1610">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jp2kload_buffer"
              c:identifier="vips_jp2kload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/jp2kload.c"
           line="1647">Optional arguments:

* @page: %gint, load this page
* @fail_on: #VipsFailOn, types of read error to fail on

Exactly as vips_jp2kload(), but read from a buffer.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="881"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/jp2kload.c"
             line="1664">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1649">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1650">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1651">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1652">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jp2kload_source"
              c:identifier="vips_jp2kload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/jp2kload.c"
           line="1686">Optional arguments:

* @page: %gint, load this page
* @fail_on: #VipsFailOn, types of read error to fail on

Exactly as vips_jp2kload(), but read from a source.</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="884"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/jp2kload.c"
             line="1699">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1688">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1689">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jp2kload.c"
               line="1690">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jpegload" c:identifier="vips_jpegload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/jpegload.c"
           line="444">Optional arguments:

* @shrink: %gint, shrink by this much on load
* @fail_on: #VipsFailOn, types of read error to fail on
* @autorotate: %gboolean, rotate image upright during load

Read a JPEG file into a VIPS image. It can read most 8-bit JPEG images,
including CMYK and YCbCr.

@shrink means shrink by this integer factor during load.  Possible values
are 1, 2, 4 and 8. Shrinking during read is very much faster than
decompressing the whole image and then shrinking later.

Use @fail_on to set the type of error that will cause load to fail. By
default, loaders are permissive, that is, #VIPS_FAIL_ON_NONE.

Setting @autorotate to %TRUE will make the loader interpret the
orientation tag and automatically rotate the image appropriately during
load.

If @autorotate is %FALSE, the metadata field #VIPS_META_ORIENTATION is set
to the value of the orientation tag. Applications may read and interpret
this field
as they wish later in processing. See vips_autorot(). Save
operations will use #VIPS_META_ORIENTATION, if present, to set the
orientation of output images.

Example:

|[
vips_jpegload("fred.jpg", &amp;amp;out,
    "shrink", 8,
    "fail_on", VIPS_FAIL_ON_TRUNCATED,
    NULL);
]|

Any embedded ICC profiles are ignored: you always just get the RGB from
the file. Instead, the embedded profile will be attached to the image as
#VIPS_META_ICC_NAME. You need to use something like
vips_icc_import() to get CIE values from the file.

EXIF metadata is attached as #VIPS_META_EXIF_NAME, IPTC as
#VIPS_META_IPTC_NAME, and XMP as #VIPS_META_XMP_NAME.

The int metadata item "jpeg-multiscan" is set to the result of
jpeg_has_multiple_scans(). Interlaced jpeg images need a large amount of
memory to load, so this field gives callers a chance to handle these
images differently.

The string-valued field "jpeg-chroma-subsample" gives the chroma subsample
in standard notation. 4:4:4 means no subsample, 4:2:0 means YCbCr with
Cb and Cr subsampled horizontally and vertically, 4:4:4:4 means a CMYK
image with no subsampling.

The EXIF thumbnail, if present, is attached to the image as
"jpeg-thumbnail-data". See vips_image_get_blob().

See also: vips_jpegload_buffer(), vips_image_new_from_file(), vips_autorot().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="478"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/jpegload.c"
             line="509">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="446">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="447">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="448">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jpegload_buffer"
              c:identifier="vips_jpegload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/jpegload.c"
           line="524">Optional arguments:

* @shrink: %gint, shrink by this much on load
* @fail_on: #VipsFailOn, types of read error to fail on
* @autorotate: %gboolean, use exif Orientation tag to rotate the image
  during load

Read a JPEG-formatted memory block into a VIPS image. Exactly as
vips_jpegload(), but read from a memory buffer.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_jpegload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="481"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/jpegload.c"
             line="546">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="526">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="527">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="528">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="529">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jpegload_source"
              c:identifier="vips_jpegload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/jpegload.c"
           line="568">Optional arguments:

* @shrink: %gint, shrink by this much on load
* @fail_on: #VipsFailOn, types of read error to fail on
* @autorotate: %gboolean, use exif Orientation tag to rotate the image
  during load

Read a JPEG-formatted memory block into a VIPS image. Exactly as
vips_jpegload(), but read from a source.

See also: vips_jpegload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="484"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/jpegload.c"
             line="586">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="570">source to load</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="571">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/jpegload.c"
               line="572">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jxlload" c:identifier="vips_jxlload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2499">Read a JPEG-XL image.

The JPEG-XL loader and saver are experimental features and may change
in future libvips versions.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="903"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2512">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2501">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2502">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2503">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jxlload_buffer"
              c:identifier="vips_jxlload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2527">Exactly as vips_jxlload(), but read from a buffer.</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="900"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2536">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2529">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2530">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2531">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2532">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="jxlload_source"
              c:identifier="vips_jxlload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2558">Exactly as vips_jxlload(), but read from a source.</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="897"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2566">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2560">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2561">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2562">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="leak_set" c:identifier="vips_leak_set">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="1283">Turn on or off vips leak checking. See also --vips-leak,
vips_add_option_entries() and the `VIPS_LEAK` environment variable.

You should call this very early in your program.</doc>
      <source-position filename="libvips/include/vips/vips.h" line="182"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="leak" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="1285">turn leak checking on or off</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="less" c:identifier="vips_less" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/relational.c"
           line="419">Perform #VIPS_OPERATION_RELATIONAL_LESS on a pair of images. See
vips_relational().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="359"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="429">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="421">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="422">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="423">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="424">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="lesseq" c:identifier="vips_lesseq" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/relational.c"
           line="445">Perform #VIPS_OPERATION_RELATIONAL_LESSEQ on a pair of images. See
vips_relational().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="362"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="455">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="447">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="448">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="449">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="450">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="logmat" c:identifier="vips_logmat" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/logmat.c"
           line="244">Optional arguments:

* @separable: generate a separable mask
* @precision: #VipsPrecision for @out

Creates a circularly symmetric Laplacian of Gaussian mask
of radius
@sigma.  The size of the mask is determined by the variable @min_ampl;
if for instance the value .1 is entered this means that the produced mask
is clipped at values within 10 percent of zero, and where the change
between mask elements is less than 10%.

The program uses the following equation: (from Handbook of Pattern
Recognition and image processing by Young and Fu, AP 1986 pages 220-221):

 H(r) = (1 / (2 * M_PI * s4)) *
	(2 - (r2 / s2)) *
	exp(-r2 / (2 * s2))

where s2 = @sigma * @sigma, s4 = s2 * s2, r2 = r * r.

The generated mask has odd size and its maximum value is normalised to
1.0, unless @precision is #VIPS_PRECISION_INTEGER.

If @separable is set, only the centre horizontal is generated. This is
useful for separable convolutions.

If @precision is #VIPS_PRECISION_INTEGER, an integer mask is generated.
This is useful for integer convolutions.

"scale" is set to the sum of all the mask elements.

See also: vips_gaussmat(), vips_conv().</doc>
      <source-position filename="libvips/include/vips/create.h" line="71"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/logmat.c"
             line="285">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/logmat.c"
               line="246">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="sigma" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/logmat.c"
               line="247">standard deviation of mask</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="min_ampl" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/logmat.c"
               line="248">minimum amplitude</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/logmat.c"
               line="249">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="lshift" c:identifier="vips_lshift" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/boolean.c"
           line="419">Perform #VIPS_OPERATION_BOOLEAN_LSHIFT on a pair of images. See
vips_boolean().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="435"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="429">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="421">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="422">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="423">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="424">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="magickload"
              c:identifier="vips_magickload"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/magickload.c"
           line="63">Optional arguments:

* @page: %gint, load from this page
* @n: %gint, load this many pages
* @density: string, canvas resolution for rendering vector formats like SVG

Read in an image using libMagick, the ImageMagick library. This library can
read more than 80 file formats, including SVG, BMP, EPS, DICOM and many
others.
The reader can handle any ImageMagick image, including the float and double
formats. It will work with any quantum size, including HDR. Any metadata
attached to the libMagick image is copied on to the VIPS image.

The reader should also work with most versions of GraphicsMagick. See the
"--with-magickpackage" configure option.

The file format is usually guessed from the filename suffix, or sniffed
from the file contents.

Normally it will only load the first image in a many-image sequence (such
as a GIF or a PDF). Use @page and @n to set the start page and number of
pages to load. Set @n to -1 to load all pages from @page onwards.

@density is "WxH" in DPI, e.g. "600x300" or "600" (default is "72x72"). See
the [density
docs](http://www.imagemagick.org/script/command-line-options.php#density)
on the imagemagick website.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="686"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/magickload.c"
             line="99">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/magickload.c"
               line="65">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/magickload.c"
               line="66">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/magickload.c"
               line="67">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="magickload_buffer"
              c:identifier="vips_magickload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/magickload.c"
           line="114">Optional arguments:

* @page: %gint, load from this page
* @n: %gint, load this many pages
* @density: string, canvas resolution for rendering vector formats like SVG

Read an image memory block using libMagick into a VIPS image. Exactly as
vips_magickload(), but read from a memory source.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_magickload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="689"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/magickload.c"
             line="135">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/magickload.c"
               line="116">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/magickload.c"
               line="117">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/magickload.c"
               line="118">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/magickload.c"
               line="119">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="malloc" c:identifier="vips_malloc">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="159">g_malloc() local to @object, that is, the memory will be automatically
freed for you when the object is closed. If @object is %NULL, you need to
free the memory explicitly with g_free().

This function cannot fail. See vips_tracked_malloc() if you are
allocating large amounts of memory.

See also: vips_tracked_malloc().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="93"/>
      <return-value transfer-ownership="full" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="173">a pointer to the allocated memory.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="object"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="161">allocate memory local to this #VipsObject, or %NULL</doc>
          <type name="Object" c:type="VipsObject*"/>
        </parameter>
        <parameter name="size" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="162">number of bytes to allocate</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_butterworth"
              c:identifier="vips_mask_butterworth"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_butterworth.c"
           line="120">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make an butterworth high- or low-pass filter, that is, one with a variable,
smooth transition
positioned at @frequency_cutoff, where @frequency_cutoff is in
range 0 - 1. The shape of the curve is controlled by
@order --- higher values give a sharper transition. See Gonzalez and Wintz,
Digital Image Processing, 1987.

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="121"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_butterworth.c"
             line="146">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth.c"
               line="122">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth.c"
               line="123">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth.c"
               line="124">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="order" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth.c"
               line="125">filter order</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="frequency_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth.c"
               line="126">frequency threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="amplitude_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth.c"
               line="127">amplitude threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth.c"
               line="128">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_butterworth_band"
              c:identifier="vips_mask_butterworth_band"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_butterworth_band.c"
           line="161">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make an butterworth band-pass or band-reject filter, that is, one with a
variable, smooth transition positioned at @frequency_cutoff_x,
@frequency_cutoff_y, of radius @radius.
The shape of the curve is controlled by
@order --- higher values give a sharper transition. See Gonzalez and Wintz,
Digital Image Processing, 1987.

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="132"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_butterworth_band.c"
             line="189">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="163">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="164">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="165">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="order" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="166">filter order</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="frequency_cutoff_x" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="167">band position</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="frequency_cutoff_y" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="168">band position</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="radius" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="169">band radius</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="amplitude_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="170">amplitude threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_band.c"
               line="171">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_butterworth_ring"
              c:identifier="vips_mask_butterworth_ring"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_butterworth_ring.c"
           line="120">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make a butterworth ring-pass or ring-reject filter, that is, one with a
variable,
smooth transition
positioned at @frequency_cutoff of width @width, where @frequency_cutoff is
in the range 0 - 1. The shape of the curve is controlled by
@order --- higher values give a sharper transition. See Gonzalez and Wintz,
Digital Image Processing, 1987.

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="126"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_butterworth_ring.c"
             line="148">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_ring.c"
               line="122">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_ring.c"
               line="123">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_ring.c"
               line="124">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="order" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_ring.c"
               line="125">filter order</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="frequency_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_ring.c"
               line="126">frequency threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="amplitude_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_ring.c"
               line="127">amplitude threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="ringwidth" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_ring.c"
               line="128">ringwidth</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_butterworth_ring.c"
               line="129">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_fractal"
              c:identifier="vips_mask_fractal"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_fractal.c"
           line="106">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

This operation should be used to create fractal images by filtering the
power spectrum of Gaussian white noise. See vips_gaussnoise().

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="152"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_fractal.c"
             line="126">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_fractal.c"
               line="108">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_fractal.c"
               line="109">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_fractal.c"
               line="110">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="fractal_dimension" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_fractal.c"
               line="111">fractal dimension</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_fractal.c"
               line="112">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_gaussian"
              c:identifier="vips_mask_gaussian"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_gaussian.c"
           line="107">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make a gaussian high- or low-pass filter, that is, one with a variable,
smooth transition positioned at @frequency_cutoff.

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="138"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_gaussian.c"
             line="128">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian.c"
               line="109">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian.c"
               line="110">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian.c"
               line="111">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="frequency_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian.c"
               line="112">frequency threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="amplitude_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian.c"
               line="113">amplitude threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian.c"
               line="114">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_gaussian_band"
              c:identifier="vips_mask_gaussian_band"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_gaussian_band.c"
           line="144">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make a gaussian band-pass or band-reject filter, that is, one with a
variable, smooth transition positioned at @frequency_cutoff_x,
@frequency_cutoff_y, of radius @radius.

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="147"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_gaussian_band.c"
             line="168">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_band.c"
               line="146">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_band.c"
               line="147">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_band.c"
               line="148">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="frequency_cutoff_x" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_band.c"
               line="149">band position</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="frequency_cutoff_y" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_band.c"
               line="150">band position</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="radius" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_band.c"
               line="151">band radius</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="amplitude_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_band.c"
               line="152">amplitude threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_band.c"
               line="153">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_gaussian_ring"
              c:identifier="vips_mask_gaussian_ring"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_gaussian_ring.c"
           line="114">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make a gaussian ring-pass or ring-reject filter, that is, one with a
variable, smooth transition positioned at @frequency_cutoff of width
@ringwidth.

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="142"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_gaussian_ring.c"
             line="137">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_ring.c"
               line="116">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_ring.c"
               line="117">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_ring.c"
               line="118">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="frequency_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_ring.c"
               line="119">frequency threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="amplitude_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_ring.c"
               line="120">amplitude threshold</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="ringwidth" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_ring.c"
               line="121">ringwidth</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_gaussian_ring.c"
               line="122">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_ideal"
              c:identifier="vips_mask_ideal"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_ideal.c"
           line="97">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make an ideal high- or low-pass filter, that is, one with a sharp cutoff
positioned at @frequency_cutoff, where @frequency_cutoff is in
the range 0 - 1.

This operation creates a one-band float image of the specified size.
The image has
values in the range [0, 1] and is typically used for multiplying against
frequency domain images to filter them.
Masks are created with the DC component at (0, 0). The DC pixel always
has the value 1.0.

Set @nodc to not set the DC pixel.

Set @optical to position the DC component in the centre of the image. This
makes the mask suitable for multiplying against optical Fourier transforms.
See vips_wrap().

Set @reject to invert the sense of
the filter. For example, low-pass becomes low-reject.

Set @uchar to output an 8-bit unsigned char image rather than a
float image. In this case, pixels are in the range [0 - 255].

See also: vips_mask_ideal(), vips_mask_ideal_ring(),
vips_mask_ideal_band(), vips_mask_butterworth(),
vips_mask_butterworth_ring(), vips_mask_butterworth_band(),
vips_mask_gaussian(), vips_mask_gaussian_ring(),
vips_mask_gaussian_band().</doc>
      <source-position filename="libvips/include/vips/create.h" line="108"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_ideal.c"
             line="141">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal.c"
               line="99">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal.c"
               line="100">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal.c"
               line="101">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="frequency_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal.c"
               line="102">threshold at which filter ends</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal.c"
               line="103">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_ideal_band"
              c:identifier="vips_mask_ideal_band"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_ideal_band.c"
           line="127">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make an ideal band-pass or band-reject filter, that is, one with a
sharp cutoff around the point @frequency_cutoff_x, @frequency_cutoff_y,
of size @radius.

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="116"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_ideal_band.c"
             line="150">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_band.c"
               line="129">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_band.c"
               line="130">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_band.c"
               line="131">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="frequency_cutoff_x" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_band.c"
               line="132">position of band</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="frequency_cutoff_y" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_band.c"
               line="133">position of band</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="radius" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_band.c"
               line="134">size of band</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_band.c"
               line="135">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mask_ideal_ring"
              c:identifier="vips_mask_ideal_ring"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/mask_ideal_ring.c"
           line="111">Optional arguments:

* @nodc: don't set the DC pixel
* @reject: invert the filter sense
* @optical: coordinates in optical space
* @uchar: output a uchar image

Make an ideal ring-pass or ring-reject filter, that is, one with a sharp
ring positioned at @frequency_cutoff of width @width, where
@frequency_cutoff and @width are expressed as the range 0 - 1.

See also: vips_mask_ideal().</doc>
      <source-position filename="libvips/include/vips/create.h" line="112"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/mask_ideal_ring.c"
             line="133">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_ring.c"
               line="113">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_ring.c"
               line="114">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_ring.c"
               line="115">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="frequency_cutoff" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_ring.c"
               line="116">threshold at which filter ends</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="ringwidth" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_ring.c"
               line="117">ring width</doc>
          <type name="gdouble" c:type="double"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/mask_ideal_ring.c"
               line="118">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="match" c:identifier="vips_match" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/mosaicing/match.c"
           line="305">Optional arguments:

* @search: search to improve tie-points
* @hwindow: half window size
* @harea: half search size
* @interpolate: interpolate pixels with this

Scale, rotate and translate @sec so that the tie-points line up.

If @search is %TRUE, before performing the transformation, the tie-points
are improved by searching an area of @sec of size @harea for a
match of size @hwindow to @ref.

This function will only work well for small rotates and scales.</doc>
      <source-position filename="libvips/include/vips/mosaicing.h" line="58"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/mosaicing/match.c"
             line="335">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="ref" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="307">reference image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="sec" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="308">secondary image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="309">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="xr1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="310">first reference tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="yr1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="311">first reference tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="xs1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="312">first secondary tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="ys1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="313">first secondary tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="xr2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="314">second reference tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="yr2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="315">second reference tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="xs2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="316">second secondary tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="ys2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="317">second secondary tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/match.c"
               line="318">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="math2" c:identifier="vips_math2" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/math2.c"
           line="260">This operation calculates a 2-ary maths operation on a pair of images
and writes the result to @out. The images may have any
non-complex format. @out is float except in the case that either of @left
or @right are double, in which case @out is also double.

It detects division by zero, setting those pixels to zero in the output.
Beware: it does this silently!

If the images differ in size, the smaller image is enlarged to match the
larger by adding zero pixels along the bottom and right.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;), and that format is the
result type.

See also: vips_math2_const().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="486"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="291">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="262">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="263">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="264">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="math2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="265">math operation to perform</doc>
          <type name="OperationMath2" c:type="VipsOperationMath2"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="266">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="matload" c:identifier="vips_matload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/matload.c"
           line="152">Read a Matlab save file into a VIPS image.

This operation searches the save
file for the first array variable with between 1 and 3 dimensions and loads
it as an image. It will not handle complex images. It does not handle
sparse matrices.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="783"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/matload.c"
             line="167">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matload.c"
               line="154">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/matload.c"
               line="155">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matload.c"
               line="156">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="matrixload"
              c:identifier="vips_matrixload"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/matrixload.c"
           line="473">Reads a matrix from a file.

Matrix files have a simple format that's supposed to be easy to create with
a text editor or a spreadsheet.

The first line has four numbers for width, height, scale and
offset (scale and offset may be omitted, in which case they default to 1.0
and 0.0). Scale must be non-zero. Width and height must be positive
integers. The numbers are separated by any mixture of spaces, commas,
tabs and quotation marks ("). The scale and offset fields may be
floating-point, and must use '.'
as a decimal separator.

Subsequent lines each hold one row of matrix data, with numbers again
separated by any mixture of spaces, commas,
tabs and quotation marks ("). The numbers may be floating-point, and must
use '.'
as a decimal separator.

Extra characters at the ends of lines or at the end of the file are
ignored.

See also: vips_matrixload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="670"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/matrixload.c"
             line="503">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixload.c"
               line="475">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixload.c"
               line="476">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixload.c"
               line="477">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="matrixload_source"
              c:identifier="vips_matrixload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/matrixload.c"
           line="518">Exactly as vips_matrixload(), but read from a source.

See also: vips_matrixload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="673"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/matrixload.c"
             line="528">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixload.c"
               line="520">source to load</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixload.c"
               line="521">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/matrixload.c"
               line="522">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="max_coord_get" c:identifier="vips_max_coord_get">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="140">Return the maximum coordinate value. This can be the default, a value set
set by the `--vips-max-coord` CLI arg, or a value set in the `VIPS_MAX_COORD`
environment variable.

These strings can include unit specifiers, eg. "10m" for 10 million pixels.
Values above INT_MAX are not supported.</doc>
      <source-position filename="libvips/include/vips/vips.h" line="166"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/init.c"
             line="150">The maximum value a coordinate, or image dimension, can have.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="maxpair" c:identifier="vips_maxpair" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/maxpair.c"
           line="163">For each pixel, pick the maximum of a pair of images.

See also: vips_minpair().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="240"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/maxpair.c"
             line="174">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/maxpair.c"
               line="165">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/maxpair.c"
               line="166">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/maxpair.c"
               line="167">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/maxpair.c"
               line="168">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="memory">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="79">These functions cover two main areas.

First, some simple utility functions over the underlying
g_malloc()/g_free() functions. Memory allocated and freeded using these
functions is interchangeable with any other glib library.

Second, a pair of functions, vips_tracked_malloc() and vips_tracked_free(),
which are NOT compatible. If you g_free() memory that has been allocated
with vips_tracked_malloc() you will see crashes.

The tracked functions are
only suitable for large allocations internal to the library, for example
pixel buffers. libvips watches the total amount of live tracked memory and
uses this information to decide when to trim caches.</doc>
    </docsection>
    <function name="merge" c:identifier="vips_merge" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/mosaicing/merge.c"
           line="174">Optional arguments:

* @mblend: %gint, maximum blend size

This operation joins two images left-right (with @ref on the left) or
up-down (with @ref above) with a smooth seam.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common type (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;).

@dx and @dy give the displacement of @sec relative to @ref, in other words,
the vector to get from the origin of @sec to the origin of @ref, in other
words, @dx will generally be a negative number.

@mblend limits  the  maximum width of the
blend area.  A value of "-1" means "unlimited". The two images are blended
with a raised cosine.

Pixels with all bands equal to zero are "transparent", that
is, zero pixels in the overlap area do not  contribute  to  the  merge.
This makes it possible to join non-rectangular images.

See also: vips_mosaic(), vips_insert().</doc>
      <source-position filename="libvips/include/vips/mosaicing.h" line="42"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/mosaicing/merge.c"
             line="214">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="ref" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/merge.c"
               line="176">reference image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="sec" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/merge.c"
               line="177">secondary image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/merge.c"
               line="178">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="direction" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/merge.c"
               line="179">horizontal or vertical merge</doc>
          <type name="Direction" c:type="VipsDirection"/>
        </parameter>
        <parameter name="dx" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/merge.c"
               line="180">displacement of ref from sec</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="dy" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/merge.c"
               line="181">displacement of ref from sec</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/merge.c"
               line="182">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="minpair" c:identifier="vips_minpair" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/minpair.c"
           line="163">For each pixel, pick the minimum of a pair of images.

See also: vips_minpair().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="243"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/minpair.c"
             line="174">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/minpair.c"
               line="165">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/minpair.c"
               line="166">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/minpair.c"
               line="167">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/minpair.c"
               line="168">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="more" c:identifier="vips_more" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/relational.c"
           line="367">Perform #VIPS_OPERATION_RELATIONAL_MORE on a pair of images. See
vips_relational().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="365"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="377">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="369">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="370">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="371">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="372">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="moreeq" c:identifier="vips_moreeq" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/relational.c"
           line="393">Perform #VIPS_OPERATION_RELATIONAL_MOREEQ on a pair of images. See
vips_relational().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="368"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="403">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="395">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="396">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="397">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="398">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="morphology">
      <doc xml:space="preserve"
           filename="libvips/morphology/morphology.c"
           line="52">The morphological functions search images
for particular patterns of pixels, specified with the mask argument,
either adding or removing pixels when they find a match. They are useful
for cleaning up images --- for example, you might threshold an image, and
then use one of the morphological functions to remove all single isolated
pixels from the result.

If you combine the morphological operators with the mask rotators
(vips_rot45(), for example) and apply them repeatedly, you
can achieve very complicated effects: you can thin, prune, fill, open edges,
close gaps, and many others. For example, see `Fundamentals  of  Digital
Image Processing' by A.  Jain, pp 384-388, Prentice-Hall, 1989 for more
ideas.

Beware that VIPS reverses the usual image processing convention, by
assuming white objects (non-zero pixels) on a black background (zero
pixels).

The mask you give to the morphological functions should contain only the
values 0 (for background), 128 (for don't care) and 255 (for object). The
mask must have odd length sides --- the origin of the mask is taken to be
the centre value. For example, the mask:

    VipsImage *mask = vips_image_new_matrixv(3, 3,
        128.0, 255.0, 128.0,
        255.0, 255.0, 255.0,
        128.0, 255.0, 128.0);

applied to an image with vips_morph() #VIPS_OPERATION_MORPHOLOGY_DILATE will
do a 4-connected dilation.

Dilate sets pixels in the output if any part of the mask matches, whereas
erode sets pixels only if all of the mask matches.

See vips_andimage(), vips_orimage() and vips_eorimage()
for analogues of the usual set difference and set union operations.

Use vips_image_new_matrixv() to create a mask in source, vips_matrixload()
to load a mask from a simple text file, and vips_mask_ideal() and friends to
create square, circular and ring masks of specific sizes.</doc>
    </docsection>
    <function name="mosaic" c:identifier="vips_mosaic" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/mosaicing/mosaic.c"
           line="311">Optional arguments:

* @bandno: %gint, band to search for features
* @hwindow: %gint, half window size
* @harea: %gint, half search size
* @mblend: %gint, maximum blend size
* @dx0: %gint, output, detected displacement
* @dy0: %gint, output, detected displacement
* @scale1: %gdouble, output, detected first order scale
* @angle1: %gdouble, output, detected first order rotation
* @dx1: %gdouble, output, detected first order displacement
* @dy1: %gdouble, output, detected first order displacement

This operation joins two images left-right (with @ref on the left) or
top-bottom (with @ref above) given an approximate overlap.

@sec is positioned so that the pixel (@xsec, @ysec) in @sec lies on top of
the pixel (@xref, @yref) in @ref. The overlap area is divided into three
sections, 20 high-contrast points in band @bandno of image @ref are found
in each, and a window of pixels of size @hwindow around each high-contrast
point is searched for in @sec over an area of @harea.

A linear model is fitted to the 60 tie-points, points a long way from the
fit are discarded, and the model refitted until either too few points
remain or the model reaches good agreement.

The detected displacement is used with vips_merge() to join the two images
together.

You can read out the detected transform with @dx0, @dy0, @scale1, @angle1,
@dx1, @dy1.

See also: vips_merge(), vips_insert().</doc>
      <source-position filename="libvips/include/vips/mosaicing.h" line="46"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/mosaicing/mosaic.c"
             line="357">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="ref" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="313">reference image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="sec" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="314">secondary image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="315">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="direction" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="316">horizontal or vertical join</doc>
          <type name="Direction" c:type="VipsDirection"/>
        </parameter>
        <parameter name="xref" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="317">position in reference image</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="yref" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="318">position in reference image</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="xsec" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="319">position in secondary image</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="ysec" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="320">position in secondary image</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic.c"
               line="321">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="mosaic1" c:identifier="vips_mosaic1" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/mosaicing/mosaic1.c"
           line="628">Optional arguments:

* @search: search to improve tie-points
* @hwindow: half window size
* @harea: half search size
* @interpolate: interpolate pixels with this
* @mblend: maximum blend size

This operation joins two images top-bottom (with @sec on the right)
or left-right (with @sec at the bottom)
given an approximate pair of tie-points. @sec is scaled and rotated as
necessary before the join.

If @search is %TRUE, before performing the transformation, the tie-points
are improved by searching an area of @sec of size @harea for a
object of size @hwindow in @ref.

@mblend limits  the  maximum size of the
blend area.  A value of "-1" means "unlimited". The two images are blended
with a raised cosine.

Pixels with all bands equal to zero are "transparent", that
is, zero pixels in the overlap area do not  contribute  to  the  merge.
This makes it possible to join non-rectangular images.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common type (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;).

See also: vips_merge(), vips_insert(), vips_globalbalance().</doc>
      <source-position filename="libvips/include/vips/mosaicing.h" line="51"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/mosaicing/mosaic1.c"
             line="680">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="ref" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="630">reference image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="sec" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="631">secondary image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="632">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="direction" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="633">horizontal or vertical join</doc>
          <type name="Direction" c:type="VipsDirection"/>
        </parameter>
        <parameter name="xr1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="634">first reference tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="yr1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="635">first reference tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="xs1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="636">first secondary tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="ys1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="637">first secondary tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="xr2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="638">second reference tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="yr2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="639">second reference tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="xs2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="640">second secondary tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="ys2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="641">second secondary tie-point</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/mosaicing/mosaic1.c"
               line="642">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="mosaicing">
      <doc xml:space="preserve"
           filename="libvips/mosaicing/mosaicing.c"
           line="48">These functions are useful for joining many small images together to make
one large image. They can cope with unstable contrast and arbitrary sub-image
layout, but will not do any geometric correction. Geometric errors should
be removed before using these functions.

The mosaicing functions can be grouped into layers:

The lowest level operation is vips_merge()  which
joins two images together
left-right or up-down with a smooth seam.

Next, vips_mosaic() uses
search functions plus the two low-level merge operations to join two images
given just an approximate overlap as a start point.

vips_mosaic1() is a first-order
analogue of the basic mosaic functions: it takes two approximate
tie-points and uses
them to rotate and scale the right-hand or bottom image before starting to
join.

Finally, vips_globalbalance() can be used to remove contrast differences in
a mosaic
which has been assembled with these functions. It takes the mosaic apart,
measures image contrast differences along the seams, finds a set of
correction factors which will minimise these differences, and reassembles
the mosaic.
vips_remosaic() uses the
same
techniques, but will reassemble the image from a different set of source
images.</doc>
    </docsection>
    <function name="multiply" c:identifier="vips_multiply" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/multiply.c"
           line="207">This operation calculates @left * @right and writes the result to @out.

If the images differ in size, the smaller image is enlarged to match the
larger by adding zero pixels along the bottom and right.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;), then the
following table is used to determine the output type:

&lt;table&gt;
  &lt;title&gt;VipsMultiply type promotion&lt;/title&gt;
  &lt;tgroup cols='2' align='left' colsep='1' rowsep='1'&gt;
    &lt;thead&gt;
      &lt;row&gt;
        &lt;entry&gt;input type&lt;/entry&gt;
        &lt;entry&gt;output type&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;uchar&lt;/entry&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;char&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;
&lt;/table&gt;

In other words, the output type is just large enough to hold the whole
range of possible values.

See also: vips_add(), vips_linear().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="204"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/multiply.c"
             line="288">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/multiply.c"
               line="209">left-hand image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/multiply.c"
               line="210">right-hand image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/multiply.c"
               line="211">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/multiply.c"
               line="212">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="nickname_find" c:identifier="vips_nickname_find">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="3009">Return the VIPS nickname for a %GType. Handy for language bindings.</doc>
      <source-position filename="libvips/include/vips/object.h" line="684"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="3015">the class nickname.</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
      <parameters>
        <parameter name="type" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="3011">#GType to search for</doc>
          <type name="GType" c:type="GType"/>
        </parameter>
      </parameters>
    </function>
    <function name="niftiload"
              c:identifier="vips_niftiload"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/niftiload.c"
           line="807">Read a NIFTI image file into a VIPS image.

NIFTI metadata is attached with the "nifti-" prefix.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="868"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/niftiload.c"
             line="819">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/niftiload.c"
               line="809">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/niftiload.c"
               line="810">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/niftiload.c"
               line="811">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="niftiload_source"
              c:identifier="vips_niftiload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/niftiload.c"
           line="834">Exactly as vips_niftiload(), but read from a source.</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="871"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/niftiload.c"
             line="842">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/niftiload.c"
               line="836">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/niftiload.c"
               line="837">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/niftiload.c"
               line="838">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="notequal" c:identifier="vips_notequal" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/relational.c"
           line="341">Perform #VIPS_OPERATION_RELATIONAL_NOTEQ on a pair of images. See
vips_relational().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="356"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="351">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="343">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="344">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="345">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="346">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="object">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="60">The #VipsObject class and associated types and macros.

#VipsObject is the base class for all objects in libvips. It has the
following major features:

&lt;emphasis&gt;Functional class creation&lt;/emphasis&gt; Vips objects have a very
regular lifecycle: initialise, build, use, destroy. They behave rather like
function calls and are free of side-effects.

&lt;emphasis&gt;Run-time introspection&lt;/emphasis&gt; Vips objects can be fully
introspected at run-time. There is no need for separate source-code
analysis.

&lt;emphasis&gt;Command-line interface&lt;/emphasis&gt; Any vips object can be run from
the command-line with the `vips` driver program.

## The #VipsObject lifecycle

#VipsObject s have a strictly defined lifecycle, split broadly as construct
and then use. In detail, the stages are:

1. g_object_new(). The #VipsObject is created with g_object_new(). Objects
in this state are blank slates and need to have their various parameters
set.

2. g_object_set(). You loop over the #VipsArgument that the object has
defined with vips_argument_map(). Arguments have a set of flags attached to
them for required, optional, input, output, type, and so on. You must set
all required arguments.

3. vips_object_build(). Call this to construct the object and get it ready
for use. Building an object happens in four stages, see below.

4. g_object_get(). The object has now been built. You can read out any
computed values.

5. g_object_unref(). When you are done with an object, you can unref it.
See the section on reference counting for an explanation of the convention
that #VipsObject uses. When the last ref to an object is released, the
object is closed. Objects close in three stages, see below.

The stages inside vips_object_build() are:

1. Chain up through the object's @build class methods. At each stage,
each class does any initial setup and checking, then chains up to its
superclass.

2. The innermost @build method inside #VipsObject itself checks that all
input arguments have been set and then returns.

3. All object @build methods now finish executing, from innermost to
outermost. They know all input arguments have been checked and supplied, so
now they set all output arguments.

4. vips_object_build() finishes the process by checking that all output
objects have been set, and then triggering the #VipsObject::postbuild
signal. #VipsObject::postbuild only runs if the object has constructed
successfully.

#VipsOperation has a cache of recent operation objects, see that class for
an explanation of vips_cache_operation_build().

Finally the stages inside close are:

1. #VipsObject::preclose. This is emitted at the start of
the #VipsObject dispose. The object is still functioning.

2. #VipsObject::close. This runs just after all #VipsArgument held by
the object have been released.

3. #VipsObject::postclose. This runs right at the end. The object
pointer is still valid, but nothing else is.

## #VipsArgument

libvips has a simple mechanism for automating at least some aspects of
%GObject properties. You add a set of macros to your _class_init() which
describe the arguments, and set the get and set functions to the vips ones.

See &lt;link linkend="extending"&gt;extending&lt;/link&gt; for a complete example.

## The #VipsObject reference counting convention

#VipsObject has a set of conventions to simplify reference counting.

1. All input %GObject have a ref added to them, owned by the object. When a
#VipsObject is unreffed, all of these refs to input objects are
automatically dropped.

2. All output %GObject hold a ref to the object. When a %GObject which is an
output of a #VipsObject is disposed, it must drop this reference.
#VipsObject which are outputs of other #VipsObject will do this
automatically.

See #VipsOperation for an example of #VipsObject reference counting.</doc>
    </docsection>
    <function name="openexrload"
              c:identifier="vips_openexrload"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/openexrload.c"
           line="163">Read a OpenEXR file into a VIPS image.

The reader can handle scanline and tiled OpenEXR images. It can't handle
OpenEXR colour management, image attributes, many pixel formats, anything
other than RGBA.

This reader uses the rather limited OpenEXR C API. It should really be
redone in C++.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="628"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/openexrload.c"
             line="180">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/openexrload.c"
               line="165">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/openexrload.c"
               line="166">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/openexrload.c"
               line="167">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="openslideload"
              c:identifier="vips_openslideload"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2846">Optional arguments:

* @level: %gint, load this level
* @associated: %gchararray, load this associated image
* @attach_associated: %gboolean, attach all associated images as metadata
* @autocrop: %gboolean, crop to image bounds
* @rgb: %gboolean, output RGB (not RGBA) pixels

Read a virtual slide supported by the OpenSlide library into a VIPS image.
OpenSlide supports images in Aperio, Hamamatsu, MIRAX, Sakura, Trestle,
and Ventana formats.

To facilitate zooming, virtual slide formats include multiple scaled-down
versions of the high-resolution image.  These are typically called
"levels".  By default, vips_openslideload() reads the highest-resolution
level (level 0).  Set @level to the level number you want.

In addition to the slide image itself, virtual slide formats sometimes
include additional images, such as a scan of the slide's barcode.
OpenSlide calls these "associated images".  To read an associated image,
set @associated to the image's name.
A slide's associated images are listed in the
"slide-associated-images" metadata item.

If you set @attach_associated, then all associated images are attached as
metadata items. Use vips_image_get_image() on @out to retrieve them. Images
are attached as "openslide-associated-XXXXX", where XXXXX is the name of the
associated image.

By default, the output of this operator is RGBA. Set @rgb to enable RGB
output.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="456"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2886">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2848">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2849">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2850">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="openslideload_source"
              c:identifier="vips_openslideload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2901">Optional arguments:

* @level: %gint, load this level
* @associated: %gchararray, load this associated image
* @attach_associated: %gboolean, attach all associated images as metadata
* @autocrop: %gboolean, crop to image bounds
* @rgb: %gboolean, output RGB (not RGBA) pixels

Exactly as vips_openslideload(), but read from a source.</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="459"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2917">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2903">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2904">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2905">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="operation">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/operation.c"
           line="54">The #VipsOperation class and associated types and macros.

#VipsOperation is the base class for all operations in libvips. It builds
on #VipsObject to provide the introspection and command-line interface to
libvips.

It also maintains a cache of recent operations. See below.

vips_call(), vips_call_split() and vips_call_split_option_string() are used
by vips to implement the C API. They can execute any #VipsOperation,
passing in a set of required and optional arguments. Normally you would not
use these functions directly: every operation has a tiny wrapper function
which provides type-safety for the required arguments. For example,
vips_embed() is defined as:

|[
int
vips_embed(VipsImage *in, VipsImage **out,
    int x, int y, int width, int height, ...)
{
    va_list ap;
    int result;

    va_start(ap, height);
    result = vips_call_split("embed", ap, in, out, x, y, width, height);
    va_end(ap);

    return result;
}
]|

Use vips_call_argv() to run any vips operation from a command-line style
argc/argv array. This is the thing used by the vips main program to
implement the vips command-line interface.

## #VipsOperation and reference counting

After calling a #VipsOperation you are responsible for unreffing any output
objects. For example, consider:

|[
VipsImage *im = ...;
VipsImage *t1;

if (vips_invert(im, &amp;t1, NULL))
  error ..
]|

This will invert @im and return a new #VipsImage, @t1. As the caller
of vips_invert(), you are responsible for @t1 and must unref it when you no
longer need it. If vips_invert() fails, no @t1 is returned and you don't
need to do anything.

If you don't need to use @im for another operation,
you can unref @im immediately after the call. If @im is needed to calculate
@t1, vips_invert() will add a ref to @im and automatically drop it when @t1
is unreffed.

Consider running two operations, one after the other. You could write:

|[
VipsImage *im = ...;
VipsImage *t1, *t2;

if (vips_invert(im, &amp;t1, NULL)) {
    g_object_unref(im);
    return -1;
}
g_object_unref(im);

if (vips_flip(t1, &amp;t2, VIPS_DIRECTION_HORIZONTAL, NULL)) {
    g_object_unref(t1);
    return -1;
}
g_object_unref(t1);
]|

This is correct, but rather long-winded. libvips provides a handy thing to
make a vector of auto-freeing object references. You can write this as:

|[
VipsObject *parent = ...;
VipsImage *im = ...;
VipsImage *t = (VipsImage **) vips_object_local_array(parent, 2);

if (vips_invert(im, &amp;t[0], NULL) ||
    vips_flip(t[0], &amp;t[1], VIPS_DIRECTION_HORIZONTAL, NULL))
  return -1;
]|

where @parent is some enclosing object which will be unreffed when this
task is complete. vips_object_local_array() makes an array of #VipsObject
(or #VipsImage, in this case) where when @parent is freed, all non-NULL
#VipsObject in the array are also unreffed.

## The #VipsOperation cache

Because all #VipsObject are immutable, they can be cached. The cache is
very simple to use: instead of calling vips_object_build(), call
vips_cache_operation_build(). This function calculates a hash from the
operations's input arguments and looks it up in table of all recent
operations. If there's a hit, the new operation is unreffed, the old
operation reffed, and the old operation returned in place of the new one.

The cache size is controlled with vips_cache_set_max() and friends.</doc>
    </docsection>
    <function name="orimage" c:identifier="vips_orimage" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/boolean.c"
           line="367">Perform #VIPS_OPERATION_BOOLEAN_OR on a pair of images. See
vips_boolean().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="429"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="377">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="369">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="370">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="371">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="372">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="path_filename7" c:identifier="vips_path_filename7">
      <doc xml:space="preserve"
           filename="libvips/deprecated/vips7compat.c"
           line="128">Return the filename part of a vips7 path. For testing only.</doc>
      <source-position filename="libvips/include/vips/basic.h" line="94"/>
      <return-value transfer-ownership="full">
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="path" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/deprecated/vips7compat.c"
               line="130">path to split</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="path_mode7" c:identifier="vips_path_mode7">
      <doc xml:space="preserve"
           filename="libvips/deprecated/vips7compat.c"
           line="145">Return the mode part of a vips7 path. For testing only.</doc>
      <source-position filename="libvips/include/vips/basic.h" line="96"/>
      <return-value transfer-ownership="full">
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="path" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/deprecated/vips7compat.c"
               line="147">path to split</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="pdfload" c:identifier="vips_pdfload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2709">Optional arguments:

* @page: %gint, load this page, numbered from zero
* @n: %gint, load this many pages
* @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor
* @background: #VipsArrayDouble background colour
* @password: %gchararray PDF password

Render a PDF file into a VIPS image.

The output image is always RGBA --- CMYK PDFs will be
converted. If you need CMYK bitmaps, you should use vips_magickload()
instead.

Use @page to select a page to render, numbering from zero.

Use @n to select the number of pages to render. The default is 1. Pages are
rendered in a vertical column, with each individual page aligned to the
left. Set to -1 to mean "until the end of the document". Use vips_grid()
to change page layout.

Use @dpi to set the rendering resolution. The default is 72. Additionally,
you can scale by setting @scale. If you set both, they combine.

Use @background to set the background RGBA colour. The default is 255
(solid white), use eg. 0 for a transparent background.

Use @password to supply a decryption password.

The operation fills a number of header fields with metadata, for example
"pdf-author". They may be useful.

This function only reads the image header and does not render any pixel
data. Rendering occurs when pixels are accessed.

See also: vips_image_new_from_file(), vips_magickload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="806"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2753">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2711">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2712">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2713">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="pdfload_buffer"
              c:identifier="vips_pdfload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2768">Optional arguments:

* @page: %gint, load this page, numbered from zero
* @n: %gint, load this many pages
* @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor
* @background: #VipsArrayDouble background colour

Read a PDF-formatted memory buffer into a VIPS image. Exactly as
vips_pdfload(), but read from memory.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_pdfload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="809"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2791">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2770">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2771">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2772">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2773">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="pdfload_source"
              c:identifier="vips_pdfload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/foreign.c"
           line="2813">Optional arguments:

* @page: %gint, load this page, numbered from zero
* @n: %gint, load this many pages
* @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor
* @background: #VipsArrayDouble background colour

Exactly as vips_pdfload(), but read from a source.

See also: vips_pdfload()</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="812"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/foreign.c"
             line="2831">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2815">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2816">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/foreign.c"
               line="2817">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="perlin" c:identifier="vips_perlin" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/perlin.c"
           line="336">Optional arguments:

* @cell_size: %gint, size of Perlin cells
* @uchar: output a uchar image

Create a one-band float image of Perlin noise. See:

https://en.wikipedia.org/wiki/Perlin_noise

Use @cell_size to set the size of the cells from which the image is
constructed. The default is 256 x 256.

If @width and @height are multiples of @cell_size, the image will tessellate.

Normally, output pixels are #VIPS_FORMAT_FLOAT in the range [-1, +1]. Set
@uchar to output a uchar image with pixels in [0, 255].

See also: vips_worley(), vips_fractsurf(), vips_gaussnoise().</doc>
      <source-position filename="libvips/include/vips/create.h" line="165"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/perlin.c"
             line="362">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/perlin.c"
               line="338">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/perlin.c"
               line="339">horizontal size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/perlin.c"
               line="340">vertical size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/perlin.c"
               line="341">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="phasecor" c:identifier="vips_phasecor" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/freqfilt/phasecor.c"
           line="122">Convert the two input images to Fourier space, calculate phase-correlation,
back to real space.

See also: vips_fwfft(), vips_cross_phase(),</doc>
      <source-position filename="libvips/include/vips/freqfilt.h" line="57"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/freqfilt/phasecor.c"
             line="134">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/freqfilt/phasecor.c"
               line="124">first input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="in2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/freqfilt/phasecor.c"
               line="125">second input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/freqfilt/phasecor.c"
               line="126">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/freqfilt/phasecor.c"
               line="127">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="pngload" c:identifier="vips_pngload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/pngload.c"
           line="408">Optional arguments:

* @fail_on: #VipsFailOn, types of read error to fail on
* @unlimited: %gboolean, remove all denial of service limits

Read a PNG file into a VIPS image. It can read all png images, including 8-
and 16-bit images, 1 and 3 channel, with and without an alpha channel.

Any ICC profile is read and attached to the VIPS image. It also supports
XMP metadata.

Use @fail_on to set the type of error that will cause load to fail. By
default, loaders are permissive, that is, #VIPS_FAIL_ON_NONE.

By default, the PNG loader limits the number of text and data chunks to
block some denial of service attacks. Set @unlimited to disable these
limits.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="723"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/pngload.c"
             line="434">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="410">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="411">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="412">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="pngload_buffer"
              c:identifier="vips_pngload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/pngload.c"
           line="449">Optional arguments:

* @fail_on: #VipsFailOn, types of read error to fail on
* @unlimited: %gboolean, Remove all denial of service limits

Exactly as vips_pngload(), but read from a PNG-formatted memory block.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_pngload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="726"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/pngload.c"
             line="468">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="451">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="452">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="453">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="454">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="pngload_source"
              c:identifier="vips_pngload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/pngload.c"
           line="490">Optional arguments:

* @fail_on: #VipsFailOn, types of read error to fail on
* @unlimited: %gboolean, Remove all denial of service limits

Exactly as vips_pngload(), but read from a source.

See also: vips_pngload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="720"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/pngload.c"
             line="505">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="492">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="493">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/pngload.c"
               line="494">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="pow" c:identifier="vips_pow" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/math2.c"
           line="307">Perform #VIPS_OPERATION_MATH2_POW on a pair of images. See
vips_math2().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="490"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="317">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="309">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="310">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="311">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="312">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="ppmload" c:identifier="vips_ppmload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/ppmload.c"
           line="904">Read a PPM/PBM/PGM/PFM file into a VIPS image.

It can read 1, 8, 16 and 32 bit images, colour or monochrome,
stored in binary or in ASCII. One bit images become 8 bit VIPS images,
with 0 and 255 for 0 and 1.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="770"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/ppmload.c"
             line="918">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/ppmload.c"
               line="906">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/ppmload.c"
               line="907">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/ppmload.c"
               line="908">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="ppmload_source"
              c:identifier="vips_ppmload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/ppmload.c"
           line="933">Exactly as vips_ppmload(), but read from a source.

See also: vips_ppmload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="773"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/ppmload.c"
             line="943">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/ppmload.c"
               line="935">source to load</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/ppmload.c"
               line="936">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/ppmload.c"
               line="937">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="profile_load"
              c:identifier="vips_profile_load"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/colour/profile_load.c"
           line="170">Load a named profile.

Profiles are loaded from four sources:

- The special name `"none"` means no profile. @profile will be %NULL in this
  case.

- @name can be the name of one of the ICC profiles embedded in libvips.
  These names can be at least `"cmyk"`, `"p3"` and `"srgb"`.

- @name can be the full path to a file.

- @name can be the name of an ICC profile in the system profile directory
  for your platform.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="208"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/colour/profile_load.c"
             line="191">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="name" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/profile_load.c"
               line="172">name of profile to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="profile"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/colour/profile_load.c"
               line="173">loaded profile</doc>
          <type name="Blob" c:type="VipsBlob**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/profile_load.c"
               line="174">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="progress_set"
              c:identifier="vips_progress_set"
              moved-to="Progress.set">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/image.c"
           line="397">If set, vips will print messages about the progress of computation to
stdout. This can also be enabled with the --vips-progress option, or by
setting the environment variable VIPS_PROGRESS.</doc>
      <source-position filename="libvips/include/vips/image.h" line="436"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="progress" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/image.c"
               line="399">%TRUE to enable progress messages</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="pythagoras" c:identifier="vips_pythagoras">
      <doc xml:space="preserve"
           filename="libvips/colour/dE76.c"
           line="61">Pythagorean distance between two points in colour space. Lab/XYZ/CMC etc.</doc>
      <source-position filename="libvips/include/vips/colour.h" line="298"/>
      <return-value transfer-ownership="none">
        <type name="gfloat" c:type="float"/>
      </return-value>
      <parameters>
        <parameter name="L1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="63">Input coordinate 1</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="a1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="64">Input coordinate 1</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="b1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="65">Input coordinate 1</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="L2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="66">Input coordinate 2</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="a2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="67">Input coordinate 2</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
        <parameter name="b2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/colour/dE76.c"
               line="68">Input coordinate 2</doc>
          <type name="gfloat" c:type="float"/>
        </parameter>
      </parameters>
    </function>
    <function name="radload" c:identifier="vips_radload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/radload.c"
           line="370">Read a Radiance (HDR) file into a VIPS image.

Radiance files are read as #VIPS_CODING_RAD. They have one byte for each of
red, green and blue, and one byte of shared exponent. Some operations (like
vips_extract_area()) can work directly with images in this format, but
mmany (all the arithmetic operations, for example) will not. Unpack
#VIPS_CODING_RAD images to 3 band float with vips_rad2float() if
you want to do arithmetic on them.

This operation ignores some header fields, like VIEW and DATE. It will not
rotate/flip as the FORMAT string asks.

Sections of this reader from Greg Ward and Radiance with kind permission.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="790"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/radload.c"
             line="392">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="372">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="373">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="374">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="radload_buffer"
              c:identifier="vips_radload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/radload.c"
           line="407">Exactly as vips_radload(), but read from a HDR-formatted memory block.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_radload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="793"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/radload.c"
             line="421">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="409">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="410">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="411">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="412">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="radload_source"
              c:identifier="vips_radload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/radload.c"
           line="443">Exactly as vips_radload(), but read from a source.

See also: vips_radload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="787"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/radload.c"
             line="453">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="445">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="446">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/radload.c"
               line="447">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="rawload" c:identifier="vips_rawload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/rawload.c"
           line="195">Optional arguments:

* @offset: %guint64, offset in bytes from start of file
* @format: #VipsBandFormat, set image format
* @interpretation: #VipsInterpretation, set image interpretation

This operation mmaps the file, setting up @out so that access to that
image will read from the file.

By default, it assumes uchar pixels. Use @format to select something else.

The image will be tagged as #VIPS_INTERPRETATION_MULTIBAND. Use
@interpretation to select something else.

Use vips_byteswap() to reverse the byte ordering if necessary.

See also: vips_image_new_from_file(), vips_copy(), vips_byteswap().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="643"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/rawload.c"
             line="222">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawload.c"
               line="197">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawload.c"
               line="198">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawload.c"
               line="199">width of image in pixels</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawload.c"
               line="200">height of image in pixels</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="bands" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawload.c"
               line="201">number of image bands</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/rawload.c"
               line="202">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="rectangle">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/rect.c"
           line="47">The #VipsRect class and associated types and macros.</doc>
    </docsection>
    <docsection name="region">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/region.c"
           line="108">A #VipsRegion is a small part of an image. You use regions to
read pixels out of images without having to have the whole image in memory
at once.

A region can be a memory buffer, part of a memory-mapped file, part of some
other image, or part of some other region.

Regions must be created, used and freed all within the same thread, since
they can reference private per-thread caches. VIPS sanity-checks region
ownership in various places, so you are likely to see g_assert() errors if
you don't follow this rule.

There
is API to transfer ownership of regions between threads, but hopefully this
is only needed within VIPS, so we don't expose it. Hopefully.</doc>
    </docsection>
    <function name="relational"
              c:identifier="vips_relational"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/relational.c"
           line="267">Perform various relational operations on pairs of images.

The output type is always uchar, with 0 for FALSE and 255 for TRUE.

Less-than and greater-than for complex images compare the modulus.

If the images differ in size, the smaller image is enlarged to match the
larger by adding zero pixels along the bottom and right.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;).

To decide if pixels match exactly, that is have the same value in every
band, use vips_bandbool() after this operation to AND or OR image bands
together.

See also: vips_boolean(), vips_bandbool(), vips_relational_const().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="349"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/relational.c"
             line="299">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="269">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="270">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="271">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="relational" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="272">relational operation to perform</doc>
          <type name="OperationRelational" c:type="VipsOperationRelational"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/relational.c"
               line="273">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="remainder"
              c:identifier="vips_remainder"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/remainder.c"
           line="206">This operation calculates @left % @right (remainder after integer division)
and writes the result to @out. The images may have any
non-complex format. For float formats, vips_remainder() calculates @in1 -
@in2 * floor (@in1 / @in2).

If the images differ in size, the smaller image is enlarged to match the
larger by adding zero pixels along the bottom and right.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;), and that format is the
result type.

See also: vips_remainder_const(), vips_divide(), vips_round().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="217"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/remainder.c"
             line="233">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/remainder.c"
               line="208">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/remainder.c"
               line="209">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/remainder.c"
               line="210">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/remainder.c"
               line="211">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="resample">
      <doc xml:space="preserve"
           filename="libvips/resample/resample.c"
           line="55">These operations build on each other in a set of layers.

First, vips_affine() applies an affine transform to an image. This is any
sort of 2D transform which preserves straight lines; so any combination of
stretch, sheer, rotate and translate. You supply an interpolator for it to
use to generate pixels, see vips_interpolate_new(). It will not produce
good results for very large shrinks: you'll see aliasing.

vips_reduce() is like vips_affine(), but it can only shrink images, it can't
enlarge, rotate, or skew. It's very fast and uses an adaptive kernel for
interpolation.

vips_shrink() is a fast block shrinker. It can quickly reduce images by
large integer factors. It will give poor results for small size reductions:
again, you'll see aliasing.

Next, vips_resize() specialises in the common task of image reduce and
enlarge. It strings together combinations of vips_shrink(), vips_reduce(),
vips_affine() and others to implement a general, high-quality image
resizer.

Finally, vips_thumbnail() combines load and resize in one operation, and adds
colour management and correct handling of alpha transparency. Because load
and resize happen together, it can exploit tricks like JPEG and TIFF
shrink-on-load, giving a (potentially) huge speedup. vips_thumbnail_image()
is only there for emergencies, don't use it unless you really have to.

As a separate thing, `vips_mapim() can apply arbitrary 2D image transforms
to an image.</doc>
    </docsection>
    <function name="rot90" c:identifier="vips_rot90" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/rot.c"
           line="418">Rotate @in by 90 degrees clockwise. A convenience function over vips_rot().

See also: vips_rot().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="206"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/rot.c"
             line="428">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/rot.c"
               line="420">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/rot.c"
               line="421">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/rot.c"
               line="422">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="rshift" c:identifier="vips_rshift" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/boolean.c"
           line="445">Perform #VIPS_OPERATION_BOOLEAN_RSHIFT on a pair of images. See
vips_boolean().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="438"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/boolean.c"
             line="455">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="447">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="448">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="449">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/boolean.c"
               line="450">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <docsection name="sbuf">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/sbuf.c"
           line="58">#VipsSbuf wraps up a #VipsSource and provides a set of calls for
text-oriented buffered reading. You can fetch lines of text, skip
whitespace, and so on.

It is useful for implementing things like CSV readers, for example.</doc>
    </docsection>
    <function name="sdf" c:identifier="vips_sdf" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/sdf.c"
           line="360">Optional arguments:

* @a: #VipsArrayDouble, first point
* @b: #VipsArrayDouble, second point
* @r: %gfloat, radius
* @corners: #VipsArrayDouble, corner radii

Create a signed distance field (SDF) image of the given shape. Different
shapes use different combinations of the optional arguments, see below.

@shape #VIPS_SDF_SHAPE_CIRCLE: create a circle centred on @a, radius @r.

@shape #VIPS_SDF_SHAPE_BOX: create a box with top-left corner @a and
bottom-right corner @b.

@shape #VIPS_SDF_SHAPE_ROUNDED_BOX: create a box with top-left corner @a
and bottom-right corner @b, whose four corners are
rounded by the four-element float array @corners. @corners will default to
0.0.

@shape #VIPS_SDF_SHAPE_LINE: draw a line from @a to @b.

See also: vips_grey(), vips_grid(), vips_xyz().</doc>
      <source-position filename="libvips/include/vips/create.h" line="91"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/sdf.c"
             line="392">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/sdf.c"
               line="362">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/sdf.c"
               line="363">horizontal size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/sdf.c"
               line="364">vertical size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="shape" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/sdf.c"
               line="365">SDF to create</doc>
          <type name="SdfShape" c:type="VipsSdfShape"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/sdf.c"
               line="366">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="shutdown" c:identifier="vips_shutdown">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="708">Call this to drop caches, close plugins, terminate background threads, and
finalize any internal library testing.

vips_shutdown() is optional. If you don't call it, your platform will
clean up for you. The only negative consequences are that the leak checker
and the profiler will not work.

You may call VIPS_INIT() many times and vips_shutdown() many times, but you
must not call VIPS_INIT() after vips_shutdown(). In other words, you cannot
stop and restart libvips.

See also: vips_profile_set(), vips_leak_set().</doc>
      <source-position filename="libvips/include/vips/vips.h" line="174"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="sines" c:identifier="vips_sines" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/sines.c"
           line="149">Optional arguments:

* @hfreq: horizontal frequency
* @vreq: vertical frequency
* @uchar: output a uchar image

Creates a float one band image of the a sine waveform in two
dimensions.

The number of horizontal and vertical spatial frequencies are
determined by the variables @hfreq and @vfreq respectively.  The
function is useful for creating displayable sine waves and
square waves in two dimensions.

If horfreq and verfreq are integers the resultant image is periodical
and therefore the Fourier transform does not present spikes

Pixels are normally in [-1, +1], set @uchar to output [0, 255].

See also: vips_grey(), vips_xyz().</doc>
      <source-position filename="libvips/include/vips/create.h" line="85"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/sines.c"
             line="177">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/sines.c"
               line="151">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/sines.c"
               line="152">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/sines.c"
               line="153">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/sines.c"
               line="154">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="strdup" c:identifier="vips_strdup">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="191">g_strdup() a string. When @object is freed, the string will be freed for
you.  If @object is %NULL, you need to
free the memory yourself with g_free().

This function cannot fail.

See also: vips_malloc().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="95"/>
      <return-value transfer-ownership="full">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="204">a pointer to the allocated memory</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="object"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="193">allocate memory local to this #VipsObject, or %NULL</doc>
          <type name="Object" c:type="VipsObject*"/>
        </parameter>
        <parameter name="str" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="194">string to copy</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="subtract" c:identifier="vips_subtract" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/subtract.c"
           line="186">This operation calculates @in1 - @in2 and writes the result to @out.

If the images differ in size, the smaller image is enlarged to match the
larger by adding zero pixels along the bottom and right.

If the number of bands differs, one of the images
must have one band. In this case, an n-band image is formed from the
one-band image by joining n copies of the one-band image together, and then
the two n-band images are operated upon.

The two input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;), then the
following table is used to determine the output type:

&lt;table&gt;
  &lt;title&gt;VipsSubtract type promotion&lt;/title&gt;
  &lt;tgroup cols='2' align='left' colsep='1' rowsep='1'&gt;
    &lt;thead&gt;
      &lt;row&gt;
        &lt;entry&gt;input type&lt;/entry&gt;
        &lt;entry&gt;output type&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;uchar&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;char&lt;/entry&gt;
        &lt;entry&gt;short&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;
&lt;/table&gt;

In other words, the output type is just large enough to hold the whole
range of possible values.

See also: vips_add(), vips_linear().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="201"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/subtract.c"
             line="267">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in1" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/subtract.c"
               line="188">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="in2" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/subtract.c"
               line="189">input image</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/subtract.c"
               line="190">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/subtract.c"
               line="191">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="sum" c:identifier="vips_sum" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/sum.c"
           line="174">This operation sums all images in @in and writes the result to @out.

If the images differ in size, the smaller images are enlarged to match the
largest by adding zero pixels along the bottom and right.

If the number of bands differs, all but one of the images
must have one band. In this case, n-band images are formed from the
one-band images by joining n copies of the one-band images together, and then
the n-band images are operated upon.

The input images are cast up to the smallest common format (see table
Smallest common format in
&lt;link linkend="libvips-arithmetic"&gt;arithmetic&lt;/link&gt;), then the
following table is used to determine the output type:

&lt;table&gt;
  &lt;title&gt;VipsSum type promotion&lt;/title&gt;
  &lt;tgroup cols='2' align='left' colsep='1' rowsep='1'&gt;
    &lt;thead&gt;
      &lt;row&gt;
        &lt;entry&gt;input type&lt;/entry&gt;
        &lt;entry&gt;output type&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;row&gt;
        &lt;entry&gt;uchar&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;char&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;ushort&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;short&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
        &lt;entry&gt;uint&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;int&lt;/entry&gt;
        &lt;entry&gt;int&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;float&lt;/entry&gt;
        &lt;entry&gt;float&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double&lt;/entry&gt;
        &lt;entry&gt;double&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
        &lt;entry&gt;complex&lt;/entry&gt;
      &lt;/row&gt;
      &lt;row&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
        &lt;entry&gt;double complex&lt;/entry&gt;
      &lt;/row&gt;
    &lt;/tbody&gt;
  &lt;/tgroup&gt;
&lt;/table&gt;

In other words, the output type is just large enough to hold the whole
range of possible values.

See also: vips_add().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="198"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/sum.c"
             line="255">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="in" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/sum.c"
               line="176">array of input images</doc>
          <array length="2" zero-terminated="0" c:type="VipsImage**">
            <type name="Image" c:type="VipsImage*"/>
          </array>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/sum.c"
               line="177">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/sum.c"
               line="178">number of input images</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/sum.c"
               line="179">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="svgload" c:identifier="vips_svgload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/svgload.c"
           line="1011">Optional arguments:

* @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor
* @unlimited: %gboolean, allow SVGs of any size

Render a SVG file into a VIPS image.  Rendering uses the librsvg library
and should be fast.

Use @dpi to set the rendering resolution. The default is 72. You can also
scale the rendering by @scale.

This function only reads the image header and does not render any pixel
data. Rendering occurs when pixels are accessed.

SVGs larger than 10MB are normally blocked for security. Set @unlimited to
allow SVGs of any size.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="816"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/svgload.c"
             line="1037">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1013">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1014">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1015">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="svgload_buffer"
              c:identifier="vips_svgload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/svgload.c"
           line="1052">Optional arguments:

* @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor
* @unlimited: %gboolean, allow SVGs of any size

Read a SVG-formatted memory block into a VIPS image. Exactly as
vips_svgload(), but read from a memory buffer.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_svgload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="819"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/svgload.c"
             line="1073">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1054">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1055">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1056">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1057">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="svgload_source"
              c:identifier="vips_svgload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/svgload.c"
           line="1134">Exactly as vips_svgload(), but read from a source.

See also: vips_svgload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="825"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/svgload.c"
             line="1144">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1136">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1137">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1138">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="svgload_string"
              c:identifier="vips_svgload_string"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/svgload.c"
           line="1095">Optional arguments:

* @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor
* @unlimited: %gboolean, allow SVGs of any size

Exactly as vips_svgload(), but read from a string. This function takes a
copy of the string.

See also: vips_svgload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="822"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/svgload.c"
             line="1112">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="str" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1097">string to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1098">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/svgload.c"
               line="1099">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="switch" c:identifier="vips_switch" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/conversion/switch.c"
           line="226">The @tests images are evaluated and at each point the index of the first
non-zero value is written to @out. If all @tests are false, the value
(@n + 1) is written.

Images in @tests must have one band. They are expanded to the
bounding box of the set of images in @tests, and that size is used for
@out. @tests can have up to 255 elements.

Combine with vips_case() to make an efficient multi-way vips_ifthenelse().

See also: vips_maplut(), vips_case(), vips_ifthenelse().</doc>
      <source-position filename="libvips/include/vips/conversion.h"
                       line="320"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/conversion/switch.c"
             line="245">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="tests" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/switch.c"
               line="228">test these images</doc>
          <array length="2" zero-terminated="0" c:type="VipsImage**">
            <type name="Image" c:type="VipsImage*"/>
          </array>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/conversion/switch.c"
               line="229">output index image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/switch.c"
               line="230">number of input images</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/conversion/switch.c"
               line="231">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="system" c:identifier="vips_system" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/system.c"
           line="323">Optional arguments:

* @in: array of input images
* @out: output image
* @in_format: write input files like this
* @out_format: write output filename like this
* @log: stdout of command is returned here

vips_system() runs a command, optionally passing a set of images in and
optionally getting an image back. The command's stdout is returned in @log.

First, if @in is set, the array of images are written to files. See
vips_image_new_temp_file() to see how temporary files are created.
If @in_format is
something like &amp;percnt;s.png, the file will be written in PNG format. By
default, @in_format is &amp;percnt;s.tif.

If @out_format is set, an output filename is formed in the same way. Any
trailing [options] are stripped from @out_format.

The command string to run is made by substituting the first set of &amp;percnt;s
in @cmd_format for the names of the input files, if @in is set, and then
the next &amp;percnt;s for the output filename, if @out_format is set.
You can put a number between the &amp;percnt; and the s to change the order
in which the substitution occurs.

The command is executed with popen() and the output captured in @log.

After the command finishes, if @out_format is set, the output image is
opened and returned in @out. You can append [options] to @out_format to
control how this open happens.
Closing @out image will automatically delete the output file.

Finally the input images are deleted.

For example, this call will run the ImageMagick convert program on an
image, using JPEG files to pass images into and out of the convert command.

|[
VipsArrayImage *in;
VipsImage *out;
char *log;

if (vips_system("convert %s -swirl 45 %s",
        "in", in,
        "out", &amp;out,
        "in_format", "%s.jpg",
        "out_format", "%s.jpg",
        "log", &amp;log,
        NULL))
    error ...
]|</doc>
      <source-position filename="libvips/include/vips/image.h" line="571"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/system.c"
             line="381">0 on success, -1 on failure.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="cmd_format" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/system.c"
               line="325">command to run</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/system.c"
               line="326">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="text" c:identifier="vips_text" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/text.c"
           line="650">Optional arguments:

* @font: %gchararray, font to render with
* @fontfile: %gchararray, load this font file
* @width: %gint, image should be no wider than this many pixels
* @height: %gint, image should be no higher than this many pixels
* @align: #VipsAlign, set justification alignment
* @justify: %gboolean, justify lines
* @dpi: %gint, render at this resolution
* @autofit_dpi: %gint, read out auto-fitted DPI
* @rgba: %gboolean, enable RGBA output
* @spacing: %gint, space lines by this in points
* @wrap: #VipsTextWrap, wrap lines on characters or words

Draw the string @text to an image. @out is normally a one-band 8-bit
unsigned char image, with 0 for no text and 255 for text. Values between
are used for anti-aliasing.

Set @rgba to enable RGBA output. This is useful for colour emoji rendering,
or support for pango markup features like `&lt;span
foreground="red"&gt;Red!&lt;/span&gt;`.

@text is the text to render as a UTF-8 string. It can contain Pango markup,
for example `&lt;i&gt;The&lt;/i&gt;Guardian`.

@font is the font to render with, as a fontconfig name. Examples might be
`sans 12` or perhaps `bitstream charter bold 10`.

You can specify a font to load with @fontfile. You'll need to also set the
name of the font with @font.

@width is the number of pixels to word-wrap at. By default, lines of text
wider than this will be broken at word boundaries.
Use @wrap to set lines to wrap on word or character boundaries, or to
disable line breaks.

Set @justify to turn on line justification.
@align can be used to set the alignment style for multi-line
text to the low (left) edge centre, or high (right) edge. Note that the
output image can be wider than @width if there are no
word breaks, or narrower if the lines don't break exactly at @width.

@height is the maximum number of pixels high the generated text can be. This
only takes effect when @dpi is not set, and @width is set, making a box.
In this case, vips_text() will search for a @dpi and set of line breaks
which will just fit the text into @width and @height.

You can use @autofit_dpi to read out the DPI selected by auto fit.

@dpi sets the resolution to render at. "sans 12" at 72 dpi draws characters
approximately 12 pixels high.

@spacing sets the line spacing, in points. It would typically be something
like font size times 1.2.

You can read the coordinate of the top edge of the character from `Xoffset`
/ `Yoffset`. This can be helpful if you need to line up the output of
several vips_text().

See also: vips_bandjoin(), vips_composite().</doc>
      <source-position filename="libvips/include/vips/create.h" line="75"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/text.c"
             line="717">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/text.c"
               line="652">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="text" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/text.c"
               line="653">utf-8 text string to render</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/text.c"
               line="654">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="thread_shutdown" c:identifier="vips_thread_shutdown">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="685">Free any thread-private data and flush any profiling information.

This function needs to be called when a thread that has been using vips
exits. It is called for you by vips_shutdown() and for any threads created
within the #VipsThreadPool.

You will need to call it from threads created in
other ways or there will be memory leaks. If you do not call it, vips
will generate a warning message.

It may be called many times, and you can continue using vips after
calling it. Calling it too often will reduce performance.</doc>
      <source-position filename="libvips/include/vips/vips.h" line="176"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <docsection name="threadpool">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/threadpool.c"
           line="81">vips_threadpool_run() loops a set of threads over an image. Threads take it
in turns to allocate units of work (a unit might be a tile in an image),
then run in parallel to process those units. An optional progress function
can be used to give feedback.</doc>
    </docsection>
    <function name="thumbnail"
              c:identifier="vips_thumbnail"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/resample/thumbnail.c"
           line="1210">Optional arguments:

* @height: %gint, target height in pixels
* @size: #VipsSize, upsize, downsize, both or force
* @no_rotate: %gboolean, don't rotate upright using orientation tag
* @crop: #VipsInteresting, shrink and crop to fill target
* @linear: %gboolean, perform shrink in linear light
* @import_profile: %gchararray, fallback import ICC profile
* @export_profile: %gchararray, export ICC profile
* @intent: #VipsIntent, rendering intent
* @fail_on: #VipsFailOn, load error types to fail on

Make a thumbnail from a file. Shrinking is done in three stages: using any
shrink-on-load features available in the file import library, using a block
shrink, and using a lanczos3 shrink. At least the final 200% is done with
lanczos3. The output should be high quality, and the operation should be
quick.

See vips_thumbnail_buffer() to thumbnail from a memory buffer, or
vips_thumbnail_source() to thumbnail from an arbitrary byte source.

By default, libvips will only use the first frame of animated or multipage
images. To thumbnail all pages or frames, pass `n=-1` to the loader in
@filename, for example `"x.gif[n=-1]"`.

The output image will fit within a square of size @width x @width. You can
specify a separate height with the @height option. Set either @width or
@height to a very large number to ignore that dimension.

If you set @crop, then the output image will fill the whole of the @width x
@height rectangle, with any excess cropped away. See vips_smartcrop() for
details on the cropping strategy.

Normally the operation will upsize or downsize as required to fit the image
inside or outside the target size. If @size is set
to #VIPS_SIZE_UP, the operation will only upsize and will just
copy if asked to downsize.
If @size is set
to #VIPS_SIZE_DOWN, the operation will only downsize and will just
copy if asked to upsize.
If @size is #VIPS_SIZE_FORCE, the image aspect ratio will be broken and the
image will be forced to fit the target.

Normally any orientation tags on the input image (such as EXIF tags) are
interpreted to rotate the image upright. If you set @no_rotate to %TRUE,
these tags will not be interpreted.

Shrinking is normally done in sRGB colourspace. Set @linear to shrink in
linear light colourspace instead. This can give better results, but can
also be far slower, since tricks like JPEG shrink-on-load cannot be used in
linear space.

If you set @export_profile to the filename of an ICC profile, the image
will be transformed to the target colourspace before writing to the
output. You can also give an @import_profile which will be used if the
input image has no ICC profile, or if the profile embedded in the
input image is broken.

Use @intent to set the rendering intent for any ICC transform. The default
is #VIPS_INTENT_RELATIVE.

Use @fail_on to control the types of error that will cause loading to fail.
The default is #VIPS_FAIL_ON_NONE, ie. thumbnail is permissive.

See also: vips_thumbnail_buffer().</doc>
      <source-position filename="libvips/include/vips/resample.h" line="82"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/resample/thumbnail.c"
             line="1283">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1212">file to read from</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1213">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1214">target width in pixels</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1215">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="thumbnail_buffer"
              c:identifier="vips_thumbnail_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/resample/thumbnail.c"
           line="1464">Optional arguments:

* @height: %gint, target height in pixels
* @size: #VipsSize, upsize, downsize, both or force
* @no_rotate: %gboolean, don't rotate upright using orientation tag
* @crop: #VipsInteresting, shrink and crop to fill target
* @linear: %gboolean, perform shrink in linear light
* @import_profile: %gchararray, fallback import ICC profile
* @export_profile: %gchararray, export ICC profile
* @intent: #VipsIntent, rendering intent
* @fail_on: #VipsFailOn, load error types to fail on
* @option_string: %gchararray, extra loader options

Exactly as vips_thumbnail(), but read from a memory buffer. One extra
optional argument, @option_string, lets you pass options to the underlying
loader.

See also: vips_thumbnail().</doc>
      <source-position filename="libvips/include/vips/resample.h" line="85"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/resample/thumbnail.c"
             line="1491">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1466">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1467">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1468">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1469">target width in pixels</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1470">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="thumbnail_source"
              c:identifier="vips_thumbnail_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/resample/thumbnail.c"
           line="1677">Optional arguments:

* @height: %gint, target height in pixels
* @size: #VipsSize, upsize, downsize, both or force
* @no_rotate: %gboolean, don't rotate upright using orientation tag
* @crop: #VipsInteresting, shrink and crop to fill target
* @linear: %gboolean, perform shrink in linear light
* @import_profile: %gchararray, fallback import ICC profile
* @export_profile: %gchararray, export ICC profile
* @intent: #VipsIntent, rendering intent
* @fail_on: #VipsFailOn, load error types to fail on
* @option_string: %gchararray, extra loader options

Exactly as vips_thumbnail(), but read from a source. One extra
optional argument, @option_string, lets you pass options to the underlying
loader.

See also: vips_thumbnail().</doc>
      <source-position filename="libvips/include/vips/resample.h" line="92"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/resample/thumbnail.c"
             line="1703">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1679">source to thumbnail</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1680">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1681">target width in pixels</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/resample/thumbnail.c"
               line="1682">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="tiffload" c:identifier="vips_tiffload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/tiffload.c"
           line="460">Optional arguments:

* @page: %gint, load this page
* @n: %gint, load this many pages
* @autorotate: %gboolean, use orientation tag to rotate the image
  during load
* @subifd: %gint, select this subifd index

Read a TIFF file into a VIPS image. It is a full baseline TIFF 6 reader,
with extensions for tiled images, multipage images, XYZ and LAB colour
space, pyramidal images and JPEG compression, including CMYK and YCbCr.

@page means load this page from the file. By default the first page (page
0) is read.

@n means load this many pages. By default a single page is read. All the
pages must have the same dimensions, and they are loaded as a tall, thin
"toilet roll" image. The #VIPS_META_PAGE_HEIGHT metadata
tag gives the height in pixels of each page. Use -1 to load all pages.

Setting @autorotate to %TRUE will make the loader interpret the
orientation tag and automatically rotate the image appropriately during
load.

If @autorotate is %FALSE, the metadata field #VIPS_META_ORIENTATION is set
to the value of the orientation tag. Applications may read and interpret
this field
as they wish later in processing. See vips_autorot(). Save
operations will use #VIPS_META_ORIENTATION, if present, to set the
orientation of output images.

If @autorotate is TRUE, the image will be rotated upright during load and
no metadata attached. This can be very slow.

If @subifd is -1 (the default), the main image is selected for each page.
If it is 0 or greater and there is a SUBIFD tag, the indexed SUBIFD is
selected. This can be used to read lower resolution layers from
bioformats-style image pyramids.

Any ICC profile is read and attached to the VIPS image as
#VIPS_META_ICC_NAME. Any XMP metadata is read and attached to the image
as #VIPS_META_XMP_NAME. Any IPTC is attached as #VIPS_META_IPTC_NAME. The
image description is
attached as #VIPS_META_IMAGEDESCRIPTION. Data in the photoshop tag is
attached as #VIPS_META_PHOTOSHOP_NAME.

See also: vips_image_new_from_file(), vips_autorot().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="609"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/tiffload.c"
             line="514">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="462">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="463">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="464">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="tiffload_buffer"
              c:identifier="vips_tiffload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/tiffload.c"
           line="529">Optional arguments:

* @page: %gint, load this page
* @n: %gint, load this many pages
* @autorotate: %gboolean, use orientation tag to rotate the image
  during load
* @subifd: %gint, select this subifd index

Read a TIFF-formatted memory block into a VIPS image. Exactly as
vips_tiffload(), but read from a memory source.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_tiffload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="612"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/tiffload.c"
             line="552">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="531">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="532">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="533">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="534">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="tiffload_source"
              c:identifier="vips_tiffload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/tiffload.c"
           line="574">Optional arguments:

* @page: %gint, load this page
* @n: %gint, load this many pages
* @autorotate: %gboolean, use orientation tag to rotate the image
  during load
* @subifd: %gint, select this subifd index

Exactly as vips_tiffload(), but read from a source.

See also: vips_tiffload().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="615"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/tiffload.c"
             line="592">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="576">source to load</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="577">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/tiffload.c"
               line="578">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="tonelut" c:identifier="vips_tonelut" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/tonelut.c"
           line="310">Optional arguments:

* @in_max: input range
* @out_max: output range
* @Lb: black-point [0-100]
* @Lw: white-point [0-100]
* @Ps: shadow point (eg. 0.2)
* @Pm: mid-tone point (eg. 0.5)
* @Ph: highlight point (eg. 0.8)
* @S: shadow adjustment (+/- 30)
* @M: mid-tone adjustment (+/- 30)
* @H: highlight adjustment (+/- 30)

vips_tonelut() generates a tone curve for the adjustment of image
levels. It is mostly designed for adjusting the L* part of a LAB image in
a way suitable for print work, but you can use it for other things too.

The curve is an unsigned 16-bit image with (@in_max + 1) entries,
each in the range [0, @out_max].

@Lb, @Lw are expressed as 0-100, as in LAB colour space. You
specify the scaling for the input and output images with the @in_max and
@out_max parameters.</doc>
      <source-position filename="libvips/include/vips/create.h" line="104"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/tonelut.c"
             line="339">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/tonelut.c"
               line="312">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/tonelut.c"
               line="313">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="tracked_aligned_alloc"
              c:identifier="vips_tracked_aligned_alloc">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="384">Allocate an area of memory aligned on a boundary specified
by @align that will be tracked by vips_tracked_get_mem()
and friends.

If allocation fails, vips_tracked_aligned_alloc() returns %NULL
and sets an error message.

You must only free the memory returned with vips_tracked_aligned_free().

See also: vips_tracked_malloc(), vips_tracked_aligned_free(), vips_malloc().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="104"/>
      <return-value transfer-ownership="full" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="400">a pointer to the allocated memory, or %NULL on error.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="size" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="386">number of bytes to allocate</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="align" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="387">specifies the alignment</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="tracked_aligned_free"
              c:identifier="vips_tracked_aligned_free">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="262">Only use it to free memory that was
previously allocated with vips_tracked_aligned_alloc()
with a %NULL first argument.

See also: vips_tracked_aligned_alloc().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="100"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="s"
                   transfer-ownership="full"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="264">memory to free</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </function>
    <function name="tracked_close" c:identifier="vips_tracked_close">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="502">Exactly as close(2), but update the number of files currently open via
vips_tracked_get_files(). This is used
by the vips operation cache to drop cache when the number of files
available is low.

You must only close file descriptors opened with vips_tracked_open().

See also: vips_tracked_open(), vips_tracked_get_files().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="115"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="515">a file descriptor, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="fd" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="504">file to close()</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="tracked_free" c:identifier="vips_tracked_free">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="222">Only use it to free memory that was
previously allocated with vips_tracked_malloc()
with a %NULL first argument.

See also: vips_tracked_malloc().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="98"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="s"
                   transfer-ownership="full"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="224">memory to free</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </function>
    <function name="tracked_get_allocs" c:identifier="vips_tracked_get_allocs">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="592">Returns the number of active allocations.</doc>
      <source-position filename="libvips/include/vips/memory.h" line="110"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="597">the number of active allocations</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="tracked_get_files" c:identifier="vips_tracked_get_files">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="615">Returns the number of open files.</doc>
      <source-position filename="libvips/include/vips/memory.h" line="117"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="620">the number of open files</doc>
        <type name="gint" c:type="int"/>
      </return-value>
    </function>
    <function name="tracked_get_mem" c:identifier="vips_tracked_get_mem">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="542">Returns the number of bytes currently allocated via vips_malloc() and
friends. vips uses this figure to decide when to start dropping cache, see
#VipsOperation.</doc>
      <source-position filename="libvips/include/vips/memory.h" line="106"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="549">the number of currently allocated bytes</doc>
        <type name="gsize" c:type="size_t"/>
      </return-value>
    </function>
    <function name="tracked_get_mem_highwater"
              c:identifier="vips_tracked_get_mem_highwater">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="567">Returns the largest number of bytes simultaneously allocated via
vips_tracked_malloc(). Handy for estimating max memory requirements for a
program.</doc>
      <source-position filename="libvips/include/vips/memory.h" line="108"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="574">the largest number of currently allocated bytes</doc>
        <type name="gsize" c:type="size_t"/>
      </return-value>
    </function>
    <function name="tracked_malloc" c:identifier="vips_tracked_malloc">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="320">Allocate an area of memory that will be tracked by vips_tracked_get_mem()
and friends.

If allocation fails, vips_tracked_malloc() returns %NULL and
sets an error message.

You must only free the memory returned with vips_tracked_free().

See also: vips_tracked_free(), vips_malloc().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="102"/>
      <return-value transfer-ownership="full" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="334">a pointer to the allocated memory, or %NULL on error.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="size" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="322">number of bytes to allocate</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="tracked_open" c:identifier="vips_tracked_open">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/memory.c"
           line="460">Exactly as open(2), but the number of files currently open via
vips_tracked_open() is available via vips_tracked_get_files(). This is used
by the vips operation cache to drop cache when the number of files
available is low.

You must only close the file descriptor with vips_tracked_close().

@pathname should be utf8.

See also: vips_tracked_close(), vips_tracked_get_files().</doc>
      <source-position filename="libvips/include/vips/memory.h" line="113"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/memory.c"
             line="477">a file descriptor, or -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="pathname" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="462">name of file to open</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="flags" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="463">flags for open()</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="mode" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/memory.c"
               line="464">open mode</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <docsection name="type">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="69">A selection of %GType definitions used by VIPS.</doc>
    </docsection>
    <function name="type_depth" c:identifier="vips_type_depth">
      <source-position filename="libvips/include/vips/object.h" line="680"/>
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="type" transfer-ownership="none">
          <type name="GType" c:type="GType"/>
        </parameter>
      </parameters>
    </function>
    <function name="type_find" c:identifier="vips_type_find">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="2956">Search below @basename, return the %GType of the class whose name or
@nickname matches, or 0 for not found.
If @basename is NULL, the whole of #VipsObject is searched.

This function uses a cache, so it should be quick.

See also: vips_class_find()</doc>
      <source-position filename="libvips/include/vips/object.h" line="682"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2969">the %GType of the class, or 0 if the class is not found.</doc>
        <type name="GType" c:type="GType"/>
      </return-value>
      <parameters>
        <parameter name="basename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2958">name of base class</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="nickname" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2959">search for a class with this nickname</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="type_map" c:identifier="vips_type_map" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="2757">Map over a type's children. Stop when @fn returns non-%NULL
and return that value.</doc>
      <source-position filename="libvips/include/vips/object.h" line="676"/>
      <return-value transfer-ownership="none" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2767">%NULL if @fn returns %NULL for all arguments, otherwise the first
non-%NULL value from @fn.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="base" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2759">base type</doc>
          <type name="GType" c:type="GType"/>
        </parameter>
        <parameter name="fn" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2760">call this function for every type</doc>
          <type name="TypeMap2Fn" c:type="VipsTypeMap2Fn"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2761">client data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
        <parameter name="b"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2762">client data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </function>
    <function name="type_map_all"
              c:identifier="vips_type_map_all"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/object.c"
           line="2787">Map over a type's children, direct and indirect. Stop when @fn returns
non-%NULL and return that value.</doc>
      <source-position filename="libvips/include/vips/object.h" line="678"/>
      <return-value transfer-ownership="none" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/object.c"
             line="2796">%NULL if @fn returns %NULL for all arguments, otherwise the first
non-%NULL value from @fn.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="base" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2789">base type</doc>
          <type name="GType" c:type="GType"/>
        </parameter>
        <parameter name="fn" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2790">call this function for every type</doc>
          <type name="TypeMapFn" c:type="VipsTypeMapFn"/>
        </parameter>
        <parameter name="a"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/object.c"
               line="2791">client data</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_area" c:identifier="vips_value_get_area">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1525">Get the pointer from an area. Don't touch count (area is static).</doc>
      <source-position filename="libvips/include/vips/type.h" line="256"/>
      <return-value transfer-ownership="none" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1532">The pointer held by @value.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1527">get from this value</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
        <parameter name="length"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1528">optionally return length here</doc>
          <type name="gsize" c:type="size_t*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_array" c:identifier="vips_value_get_array">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1743">Return the pointer to the array held by @value.
Optionally return the other properties of the array in @n, @type,
@sizeof_type.

See also: vips_value_set_array().</doc>
      <source-position filename="libvips/include/vips/type.h" line="283"/>
      <return-value transfer-ownership="none" nullable="1">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1756">The array address.</doc>
        <type name="gpointer" c:type="void*"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1745">%GValue to get from</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
        <parameter name="n"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1746">return the number of elements here, optionally</doc>
          <type name="gint" c:type="int*"/>
        </parameter>
        <parameter name="type"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1747">return the type of each element here, optionally</doc>
          <type name="GType" c:type="GType*"/>
        </parameter>
        <parameter name="sizeof_type"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1748">return the sizeof each element here, optionally</doc>
          <type name="gsize" c:type="size_t*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_array_double"
              c:identifier="vips_value_get_array_double">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1821">Return the start of the array of doubles held by @value.
optionally return the number of elements in @n.

See also: vips_array_double_new().</doc>
      <source-position filename="libvips/include/vips/type.h" line="287"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1831">The array address.</doc>
        <array length="1" zero-terminated="0" c:type="double*">
          <type name="gdouble" c:type="double"/>
        </array>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1823">%GValue to get from</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
        <parameter name="n"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1824">return the number of elements here, optionally</doc>
          <type name="gint" c:type="int*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_array_image"
              c:identifier="vips_value_get_array_image">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1862">Return the start of the array of images held by @value.
optionally return the number of elements in @n.

See also: vips_value_set_array_image().</doc>
      <source-position filename="libvips/include/vips/image.h" line="591"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1872">The array address.</doc>
        <array length="1" zero-terminated="0" c:type="VipsImage**">
          <type name="Image" c:type="VipsImage*"/>
        </array>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1864">%GValue to get from</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
        <parameter name="n"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1865">return the number of elements here, optionally</doc>
          <type name="gint" c:type="int*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_array_int"
              c:identifier="vips_value_get_array_int">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1780">Return the start of the array of ints held by @value.
optionally return the number of elements in @n.

See also: vips_array_int_new().</doc>
      <source-position filename="libvips/include/vips/type.h" line="292"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1790">The array address.</doc>
        <array length="1" zero-terminated="0" c:type="int*">
          <type name="gint" c:type="int"/>
        </array>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1782">%GValue to get from</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
        <parameter name="n"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1783">return the number of elements here, optionally</doc>
          <type name="gint" c:type="int*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_array_object"
              c:identifier="vips_value_get_array_object"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1900">Return the start of the array of %GObject held by @value.
Optionally return the number of elements in @n.

See also: vips_area_new_array_object().</doc>
      <source-position filename="libvips/include/vips/type.h" line="297"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1910">The array address.</doc>
        <array length="1" zero-terminated="0" c:type="GObject**">
          <type name="GObject.Object" c:type="GObject*"/>
        </array>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1902">%GValue to get from</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
        <parameter name="n"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1903">return the number of elements here, optionally</doc>
          <type name="gint" c:type="int*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_blob" c:identifier="vips_value_get_blob">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1699">Returns the data pointer from a blob. Optionally returns the length too.

blobs are things like ICC profiles or EXIF data. They are relocatable, and
are saved to VIPS files for you coded as base64 inside the XML. They are
copied by copying reference-counted pointers.

See also: vips_value_set_blob()</doc>
      <source-position filename="libvips/include/vips/type.h" line="272"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1712">The pointer held
by @value.</doc>
        <array length="1" zero-terminated="0" c:type="void*">
          <type name="guint8"/>
        </array>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1701">GValue to set</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
        <parameter name="length"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1702">optionally return length of memory area</doc>
          <type name="gsize" c:type="size_t*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_ref_string"
              c:identifier="vips_value_get_ref_string">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1601">Get the C string held internally by the %GValue.</doc>
      <source-position filename="libvips/include/vips/type.h" line="267"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1608">The C string held by @value.</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1603">%GValue to get from</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
        <parameter name="length"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full"
                   optional="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1604">return length here, optionally</doc>
          <type name="gsize" c:type="size_t*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_get_save_string"
              c:identifier="vips_value_get_save_string">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1544">Get the C string held internally by the GValue.</doc>
      <source-position filename="libvips/include/vips/type.h" line="259"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/type.c"
             line="1550">The C string held by @value.</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1546">GValue to get from</doc>
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_is_null" c:identifier="vips_value_is_null">
      <source-position filename="libvips/include/vips/object.h" line="597"/>
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="psoec" transfer-ownership="none">
          <type name="GObject.ParamSpec" c:type="GParamSpec*"/>
        </parameter>
        <parameter name="value" transfer-ownership="none">
          <type name="GObject.Value" c:type="const GValue*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_area" c:identifier="vips_value_set_area">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1506">Set value to be a ref-counted area of memory with a free function.</doc>
      <source-position filename="libvips/include/vips/type.h" line="254"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1508">set this value</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="free_fn"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1"
                   scope="async"
                   closure="2">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1509">data will be freed with this function</doc>
          <type name="CallbackFn" c:type="VipsCallbackFn"/>
        </parameter>
        <parameter name="data"
                   transfer-ownership="full"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1510">set @value to track this pointer</doc>
          <type name="gpointer" c:type="void*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_array" c:identifier="vips_value_set_array">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1721">Set @value to be an array of things.

This allocates memory but does not
initialise the contents: get the pointer and write instead.</doc>
      <source-position filename="libvips/include/vips/type.h" line="280"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value"
                   direction="out"
                   caller-allocates="1"
                   transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1723">%GValue to set</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1724">number of elements</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="type" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1725">the type of each element</doc>
          <type name="GType" c:type="GType"/>
        </parameter>
        <parameter name="sizeof_type" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1726">the sizeof each element</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_array_double"
              c:identifier="vips_value_set_array_double">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1839">Set @value to hold a copy of @array. Pass in the array length in @n.

See also: vips_array_double_get().</doc>
      <source-position filename="libvips/include/vips/type.h" line="289"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1841">%GValue to get from</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="array"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1842">array of doubles</doc>
          <array length="2" zero-terminated="0" c:type="const double*">
            <type name="gdouble" c:type="double"/>
          </array>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1843">the number of elements</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_array_image"
              c:identifier="vips_value_set_array_image">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1880">Set @value to hold an array of images. Pass in the array length in @n.

See also: vips_array_image_get().</doc>
      <source-position filename="libvips/include/vips/image.h" line="593"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1882">%GValue to get from</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1883">the number of elements</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_array_int"
              c:identifier="vips_value_set_array_int">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1798">Set @value to hold a copy of @array. Pass in the array length in @n.

See also: vips_array_int_get().</doc>
      <source-position filename="libvips/include/vips/type.h" line="294"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1800">%GValue to get from</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="array"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1801">array of ints</doc>
          <array length="2" zero-terminated="0" c:type="const int*">
            <type name="gint" c:type="int"/>
          </array>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1802">the number of elements</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_array_object"
              c:identifier="vips_value_set_array_object">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1918">Set @value to hold an array of %GObject. Pass in the array length in @n.

See also: vips_value_get_array_object().</doc>
      <source-position filename="libvips/include/vips/type.h" line="299"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value"
                   direction="out"
                   caller-allocates="1"
                   transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1920">%GValue to set</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="n" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1921">the number of elements</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_blob" c:identifier="vips_value_set_blob">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1641">Sets @value to hold a @data. When @value is freed, @data will be
freed with @free_fn. @value also holds a note of the size of the memory
area.

blobs are things like ICC profiles or EXIF data. They are relocatable, and
are saved to VIPS files for you coded as base64 inside the XML. They are
copied by copying reference-counted pointers.

See also: vips_value_get_blob()</doc>
      <source-position filename="libvips/include/vips/type.h" line="274"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value"
                   direction="out"
                   caller-allocates="1"
                   transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1643">GValue to set</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="free_fn"
                   transfer-ownership="none"
                   nullable="1"
                   allow-none="1"
                   scope="async">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1644">free function for @data</doc>
          <type name="CallbackFn" c:type="VipsCallbackFn"/>
        </parameter>
        <parameter name="data" transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1645">pointer to area of
memory</doc>
          <array length="3" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="length" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1647">length of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_blob_free"
              c:identifier="vips_value_set_blob_free">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1672">Just like vips_value_set_blob(), but when
@value is freed, @data will be
freed with g_free().

This can be easier to call for language bindings.

See also: vips_value_set_blob()</doc>
      <source-position filename="libvips/include/vips/type.h" line="277"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1674">GValue to set</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="data" transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1675">pointer to area of
memory</doc>
          <array length="2" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="length" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1677">length of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_ref_string"
              c:identifier="vips_value_set_ref_string">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1616">Copies the C string @str into @value.

vips_ref_string are immutable C strings that are copied between images by
copying reference-counted pointers, making them much more efficient than
regular %GValue strings.

@str should be a valid utf-8 string.</doc>
      <source-position filename="libvips/include/vips/type.h" line="269"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value"
                   direction="out"
                   caller-allocates="1"
                   transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1618">%GValue to set</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="str" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1619">C string to copy into the GValue</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_save_string"
              c:identifier="vips_value_set_save_string">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1558">Copies the C string into @value.

@str should be a valid utf-8 string.</doc>
      <source-position filename="libvips/include/vips/type.h" line="261"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value"
                   direction="out"
                   caller-allocates="1"
                   transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1560">GValue to set</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="str" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1561">C string to copy into the GValue</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="value_set_save_stringf"
              c:identifier="vips_value_set_save_stringf"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/type.c"
           line="1578">Generates a string and copies it into @value.</doc>
      <source-position filename="libvips/include/vips/type.h" line="263"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="value"
                   direction="out"
                   caller-allocates="1"
                   transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1580">GValue to set</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="fmt" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1581">printf()-style format string</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/type.c"
               line="1582">arguments to printf()-formatted @fmt</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="verror" c:identifier="vips_verror" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="218">Append a message to the error buffer.

See also: vips_error().</doc>
      <source-position filename="libvips/include/vips/error.h" line="54"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="220">the source of the error</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="fmt" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="221">printf()-style format string for the error</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="ap" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="222">arguments to the format string</doc>
          <type name="va_list" c:type="va_list"/>
        </parameter>
      </parameters>
    </function>
    <function name="verror_system"
              c:identifier="vips_verror_system"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/error.c"
           line="279">Format the string in the style of printf() and append to the error buffer.
Then create and append a localised message based on the system error code,
usually the value of errno.

See also: vips_error_system().</doc>
      <source-position filename="libvips/include/vips/error.h" line="59"/>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="err" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="281">the system error code</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="domain" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="282">the source of the error</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="fmt" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="283">printf()-style format string for the error</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="ap" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/error.c"
               line="284">arguments to the format string</doc>
          <type name="va_list" c:type="va_list"/>
        </parameter>
      </parameters>
    </function>
    <function name="version" c:identifier="vips_version">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="1243">Get the major, minor or micro library version, with @flag values 0, 1 and
2.

Get the ABI current, revision and age (as used by Meson) with @flag
values 3, 4, 5.</doc>
      <source-position filename="libvips/include/vips/vips.h" line="190"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/init.c"
             line="1253">library version number</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="flag" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/iofuncs/init.c"
               line="1245">which field of the version to get</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="version_string" c:identifier="vips_version_string">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/init.c"
           line="1229">Get the VIPS version as a static string, including a build date and time.
Do not free.</doc>
      <source-position filename="libvips/include/vips/vips.h" line="188"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/iofuncs/init.c"
             line="1235">a static version string</doc>
        <type name="utf8" c:type="const char*"/>
      </return-value>
    </function>
    <docsection name="video">
      <doc xml:space="preserve"
           filename="libvips/deprecated/video_dispatch.c"
           line="40">Read an image from a video source.</doc>
    </docsection>
    <docsection name="vips">
      <doc xml:space="preserve"
           filename="libvips/iofuncs/vips.c"
           line="106">Start VIPS up, shut VIPS down, get version information, relocation.

VIPS is a relocatable package, meaning you can move the directory tree you
compiled it to at runtime and it will still be able to find all data files.
This is required for OS X and Windows, but slightly unusual in the Unix
world. See vips_init() and vips_guess_prefix().</doc>
    </docsection>
    <function name="vipsload" c:identifier="vips_vipsload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/vipsload.c"
           line="324">Read in a vips image.

See also: vips_vipssave().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="443"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/vipsload.c"
             line="334">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/vipsload.c"
               line="326">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/vipsload.c"
               line="327">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/vipsload.c"
               line="328">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="vipsload_source"
              c:identifier="vips_vipsload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/vipsload.c"
           line="349">Exactly as vips_vipsload(), but read from a source.</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="446"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/vipsload.c"
             line="357">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/vipsload.c"
               line="351">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/vipsload.c"
               line="352">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/vipsload.c"
               line="353">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="webpload" c:identifier="vips_webpload" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/webpload.c"
           line="438">Optional arguments:

* @page: %gint, page (frame) to read
* @n: %gint, load this many pages
* @scale: %gdouble, scale by this much on load

Read a WebP file into a VIPS image.

Use @page to select a page to render, numbering from zero.

Use @n to select the number of pages to render. The default is 1. Pages are
rendered in a vertical column, with each individual page aligned to the
left. Set to -1 to mean "until the end of the document". Use vips_grid()
to change page layout.

Use @scale to specify a scale-on-load factor. For example, 2.0 to double
the size on load. Animated webp images don't support shrink-on-load, so a
further resize may be necessary.

The loader supports ICC, EXIF and XMP metadata.

See also: vips_image_new_from_file().</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="525"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/webpload.c"
             line="467">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="440">file to load</doc>
          <type name="utf8" c:type="const char*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="441">decompressed image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="442">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="webpload_buffer"
              c:identifier="vips_webpload_buffer"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/webpload.c"
           line="482">Optional arguments:

* @page: %gint, page (frame) to read
* @n: %gint, load this many pages
* @scale: %gdouble, scale by this much on load

Read a WebP-formatted memory block into a VIPS image. Exactly as
vips_webpload(), but read from a memory buffer.

You must not free the buffer while @out is active. The
#VipsObject::postclose signal on @out is a good place to free.

See also: vips_webpload()</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="528"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/webpload.c"
             line="503">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="buf" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="484">memory area to load</doc>
          <array length="1" zero-terminated="0" c:type="void*">
            <type name="guint8"/>
          </array>
        </parameter>
        <parameter name="len" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="485">size of memory area</doc>
          <type name="gsize" c:type="size_t"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="486">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="487">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="webpload_source"
              c:identifier="vips_webpload_source"
              introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/foreign/webpload.c"
           line="525">Optional arguments:

* @page: %gint, page (frame) to read
* @n: %gint, load this many pages
* @scale: %gdouble, scale by this much on load

Exactly as vips_webpload(), but read from a source.

See also: vips_webpload()</doc>
      <source-position filename="libvips/include/vips/foreign.h" line="522"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/foreign/webpload.c"
             line="541">0 on success, -1 on error.</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="527">source to load from</doc>
          <type name="Source" c:type="VipsSource*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="528">image to write</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/foreign/webpload.c"
               line="529">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="wop" c:identifier="vips_wop" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/arithmetic/math2.c"
           line="332">Perform #VIPS_OPERATION_MATH2_WOP on a pair of images. See
vips_math2().</doc>
      <source-position filename="libvips/include/vips/arithmetic.h"
                       line="493"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/arithmetic/math2.c"
             line="342">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="left" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="334">left-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="right" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="335">right-hand input #VipsImage</doc>
          <type name="Image" c:type="VipsImage*"/>
        </parameter>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="336">output #VipsImage</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/arithmetic/math2.c"
               line="337">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="worley" c:identifier="vips_worley" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/worley.c"
           line="342">Optional arguments:

* @cell_size: %gint, size of Worley cells

Create a one-band float image of Worley noise. See:

https://en.wikipedia.org/wiki/Worley_noise

Use @cell_size to set the size of the cells from which the image is
constructed. The default is 256 x 256.

If @width and @height are multiples of @cell_size, the image will tessellate.

See also: vips_perlin(), vips_fractsurf(), vips_gaussnoise().</doc>
      <source-position filename="libvips/include/vips/create.h" line="162"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/worley.c"
             line="364">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/worley.c"
               line="344">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/worley.c"
               line="345">horizontal size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/worley.c"
               line="346">vertical size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/worley.c"
               line="347">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="xyz" c:identifier="vips_xyz" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/xyz.c"
           line="237">Optional arguments:

* @csize: %gint, size for third dimension
* @dsize: %gint, size for fourth dimension
* @esize: %gint, size for fifth dimension

Create a two-band uint32 image where the elements in the first band have the
value of their x coordinate and elements in the second band have their y
coordinate.

You can make any image where the value of a pixel is a function of its (x,
y) coordinate by combining this operator with the arithmetic operators.

Set @csize, @dsize, @esize to generate higher dimensions and add more
bands. The extra dimensions are placed down the vertical axis. Use
vips_grid() to change the layout.

See also: vips_grey(), vips_grid(), vips_identity().</doc>
      <source-position filename="libvips/include/vips/create.h" line="62"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/xyz.c"
             line="263">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/xyz.c"
               line="239">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/xyz.c"
               line="240">horizontal size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/xyz.c"
               line="241">vertical size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/xyz.c"
               line="242">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
    <function name="zone" c:identifier="vips_zone" introspectable="0">
      <doc xml:space="preserve"
           filename="libvips/create/zone.c"
           line="100">Optional arguments:

* @uchar: output a uchar image

Create a one-band image of a zone plate.

Pixels are normally in [-1, +1], set @uchar to output [0, 255].

See also: vips_eye(), vips_xyz().</doc>
      <source-position filename="libvips/include/vips/create.h" line="88"/>
      <return-value transfer-ownership="none">
        <doc xml:space="preserve"
             filename="libvips/create/zone.c"
             line="117">0 on success, -1 on error</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="out"
                   direction="out"
                   caller-allocates="0"
                   transfer-ownership="full">
          <doc xml:space="preserve"
               filename="libvips/create/zone.c"
               line="102">output image</doc>
          <type name="Image" c:type="VipsImage**"/>
        </parameter>
        <parameter name="width" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/zone.c"
               line="103">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="height" transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/zone.c"
               line="104">image size</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="..." transfer-ownership="none">
          <doc xml:space="preserve"
               filename="libvips/create/zone.c"
               line="105">%NULL-terminated list of optional named arguments</doc>
          <varargs/>
        </parameter>
      </parameters>
    </function>
  </namespace>
</repository>
