]> granicus.if.org Git - graphviz/commitdiff
add docbook version of plugin documentation
authorellson <devnull@localhost>
Thu, 22 Dec 2005 16:32:51 +0000 (16:32 +0000)
committerellson <devnull@localhost>
Thu, 22 Dec 2005 16:32:51 +0000 (16:32 +0000)
doc/docbook/src/book.xml [new file with mode: 0644]
doc/docbook/src/bookinfo.xml [new file with mode: 0644]
doc/docbook/src/graphviz_plugins.xml [new file with mode: 0644]
doc/docbook/src/graphviz_scripting.xml [new file with mode: 0644]
doc/docbook/src/imgs/Txlib.png [new file with mode: 0644]
doc/docbook/src/imgs/framework.png [new file with mode: 0644]
doc/docbook/src/imgs/framework.svg [new file with mode: 0644]
doc/docbook/src/imgs/hello_cairo.png [new file with mode: 0644]
doc/docbook/src/imgs/hello_gd.png [new file with mode: 0644]

diff --git a/doc/docbook/src/book.xml b/doc/docbook/src/book.xml
new file mode 100644 (file)
index 0000000..aa28b1e
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Id: -->
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
+       "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
+[
+<!ENTITY bookinfo SYSTEM "bookinfo.xml">
+<!ENTITY plugins SYSTEM "graphviz_plugins.xml">
+<!ENTITY scripting SYSTEM "graphviz_scripting.xml">
+]>
+
+<book id="graphviz-extensions">
+<title>Graphviz Extensions</title>
+<subtitle>Plugin and Scripting extensions to Graphviz</subtitle>
+<!-- External entity refs -->
+&bookinfo;
+&plugins;
+&scripting;
+</book>
diff --git a/doc/docbook/src/bookinfo.xml b/doc/docbook/src/bookinfo.xml
new file mode 100644 (file)
index 0000000..267c508
--- /dev/null
@@ -0,0 +1,48 @@
+<!-- $Id: -->
+<bookinfo>
+<!-- Embedding of external image, only for pdf -->
+<!--
+<mediaobject>
+<imageobject>
+<imagedata fileref="tba.png" format="PNG"/>
+</imageobject>
+</mediaobject>
+-->
+<authorgroup>
+<!-- Authors listed alphabetically by last name -->
+<author>
+<firstname>John</firstname>
+<surname>Ellson</surname>
+</author>
+</authorgroup>
+<!--
+<othercredit>
+<firstname>tba</firstname>
+<surname>tba</surname>
+<contrib>Logo art</contrib>
+</othercredit>
+-->
+<!-- Revision history, do not forget to update it each time -->
+<revhistory>
+<revision>
+<revnumber>0.1</revnumber>
+<date>09/12/2005</date>
+<revremark>Initial Release</revremark>
+</revision>
+</revhistory>
+<!--
+<editor>
+<firstname>tba</firstname>
+<surname>tba</surname>
+</editor>
+-->
+<copyright>
+<year>2005-2006</year>
+<holder>AT&amp;T</holder>
+</copyright>
+<!-- Page numbers for pdf-a4 and pfs-us -->
+<!-- If same numbers, just nums, otherwise numsa4-numsus -->
+<pagenums>120-126 pages</pagenums>
+<!-- Date of revision -->
+<pubdate>December, 2nd 2005</pubdate>
+</bookinfo>
diff --git a/doc/docbook/src/graphviz_plugins.xml b/doc/docbook/src/graphviz_plugins.xml
new file mode 100644 (file)
index 0000000..b508b48
--- /dev/null
@@ -0,0 +1,444 @@
+<!-- $Id: -->
+<chapter id="ch-plugins">
+<title>Graphviz Plugins</title>
+<sect1 id="s1-plugins-introduction">
+<title>Introduction</title>
+<para>
+Graphviz plugins are a means of extending the capabilities of the
+graphviz tools:
+<command>dot</command>,
+<command>neato</command>,
+<command>fdp</command>,
+<command>twopi</command>, and
+<command>circo</command>,
+</para>
+<para>
+The initial motivation for the development of plugins was to support
+alternative renders based on
+<ulink url="http://cairo.freedesktop.org/Home">
+<command>cairo</command>
+</ulink>,
+while keeping
+the stable renderer based on
+<ulink url="http://www.boutell.com/gd">
+<command>gd</command>
+</ulink>
+available.
+The <command>gd</command> renderer does not support anti-aliased lines
+(first image).
+Simply by installing the graphviz-cairo package the -Tpng renderer is
+substituted with one based on cairo (second image).
+</para>
+<para>
+Use of the newly installed plugin requires no change in the user's command.
+These images were generated before and after installing 
+<command>graphviz-cairo</command>with the command:
+<programlisting>
+echo "digraph G {hello->world}" | dot -Tpng > hello.png
+</programlisting>
+</para>
+<para>
+<inlinemediaobject>
+  <imageobject  role="html">
+    <imagedata  format="PNG"  fileref="imgs/hello_gd.png"/>
+  </imageobject>
+  <imageobject  role="fo">
+    <imagedata  format="PNG"  fileref="imgs/hello_gd.png" scale="72" />
+  </imageobject>
+</inlinemediaobject>
+<inlinemediaobject>
+  <imageobject  role="html">
+    <imagedata  format="PNG"  fileref="imgs/hello_cairo.png"/>
+  </imageobject>
+  <imageobject  role="fo">
+    <imagedata  format="PNG"  fileref="imgs/hello_cairo.png" scale="72" />
+  </imageobject>
+</inlinemediaobject>
+</para>
+<para>
+A second motivation was to support GUI interfaces to graphs, but
+without bloating the basic version of
+<command>dot</command> with dependencies on
+<command>gtk</command> or <command>xlib</command>.
+The command:
+<programlisting>
+echo "digraph G {hello->world}" | dot -Txlib
+</programlisting>
+demand loads the xlib renderer from the graphviz-cairo plugins
+and produces a zoomable display of the graph in a window:
+</para>
+<mediaobject>
+  <imageobject  role="html">
+    <imagedata  format="PNG"  fileref="imgs/Txlib.png"/>
+  </imageobject>
+  <imageobject  role="fo">
+    <imagedata  format="PNG"  fileref="imgs/Txlib.png" scale="72" />
+  </imageobject>
+</mediaobject>
+</sect1>
+<sect1 id="s1-objectives">
+<title>Objectives and Constraints</title>
+<itemizedlist>
+<listitem>
+Support independent compilation so that plugins can be provided by
+others separate from the base graphviz package.
+</listitem>
+<listitem>
+Support independent packaging so that plugins can be installed
+at the user's discretion, separate from the base graphviz package.
+</listitem>
+<listitem>
+Support optional platform-specific functionality without adding
+complexity to the base package.
+</listitem>
+<listitem>
+Support on-demand loading of plugins so that extra capabilities
+do not degrade performance for basic usage of the tools.
+</listitem>
+<listitem>
+Unbundle some existing functionality into plugins so that the base
+version of dot can be faster when that functionality is not needed.
+</listitem>
+<listitem>
+Minimize performance cost of plugin support, particularly if no plugins
+are demanded.
+</listitem>
+<listitem>
+Must be able to configure dot with a fixed set of plugins as
+<emphasis>builtins</emphasis> that are unconditionally loaded at program
+invocation (linked at load time).
+</listitem>
+<listitem>
+Must be able to configure dot as a static binary (linked at compile time),
+including <emphasis>builtins</emphasis> if specified.
+</listitem>
+<listitem>
+Must support old-style <emphasis>codegens</emphasis>
+at least until completely replaced
+by plugins that are equal or better in quality.
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 id="s1-structure">
+<title>Structure and terminology</title>
+<para>
+A <emphasis>plugin-package</emphasis>,
+such as <command>graphviz-cairo-2.6-1.i386.rpm</command>, provides one or more
+<emphasis>plugin-libraries</emphasis>.
+</para>
+<para>
+A <emphasis>plugin-library</emphasis> provides plugins that implement various
+<emphasis>plugin-apis</emphasis>.
+The <emphasis>plugin-library</emphasis> is the unit that is dynamically loaded.
+</para>
+<para>
+There are currently five <emphasis>plugin-apis</emphasis>:
+layout, textlayout, usershape, render, device.
+</para>
+<para>
+A <emphasis>plugin-library</emphasis> provides
+<emphasis>plugin-types</emphasis>
+which implement <emphasis>plugin-api</emphasis>.
+e.g. png ps pdf <emphasis>plugin-types</emphasis> implementing the renderer api.
+</para>
+<para>
+Each <emphasis>plugin-type</emphasis> implementation provides a
+<emphasis>quality</emphasis> indicator to control
+the default selection when there are multiple implementations
+of the same plugin-type.
+The builtin implementations (if any) have a <emphasis>quality</emphasis>
+of 0.
+A positive <emphasis>quality</emphasis>
+will choose the plugin in preference to the builtin.
+A negative <emphasis>quality</emphasis>
+will leave the builtin as the default.
+</para>
+<para>
+The plugins are self-describing.
+At installation time, <command>dot -c</command> is run to generate
+<filename>/usr/lib/graphviz/config</filename> which describes the capabilities
+of the available plugin-libraries so that they don't have
+to be loaded at startup and can be loaded later on demand.
+</para>
+</sect1>
+<sect1 id="s1-package">
+<title>The graphviz-cairo package.</title>
+<para>
+The graphviz-cairo package provides multiple plugin-libraries,
+all with some dependence on libcairo.so.
+In general, a plugin-package can be used to localize all
+knowledge and dependencies on some facility like cairo or
+gtk or quartz.
+The graphviz-cairo package alongside the graphviz base package
+is illustrated diagrammatically here:
+</para>
+<mediaobject>
+  <imageobject  role="html">
+    <imagedata  format="PNG"  fileref="imgs/framework.png"/>
+  </imageobject>
+  <imageobject  role="fo">
+    <imagedata  format="PNG"  fileref="imgs/framework.png" scale="72" />
+  </imageobject>
+</mediaobject>
+<para>
+       Once graphviz-cairo is installed, and <command>dot -c</command> has
+been run as part of the installation process,
+the file: <filename>/usr/lib/graphviz/config</filename> contains:
+</para>
+<programlisting>
+libgvplugin_gtk.so.2 gtk {
+        device {
+                gtk 0
+        }
+}
+libgvplugin_xlib.so.2 xlib {
+        device {
+                xlib 0
+        }
+}
+libgvplugin_cairo.so.2 cairo {
+        render {
+                png 10
+                ps -10
+                pdf 0
+                gtk 0
+                xlib 0
+        }
+        textlayout {
+                cairo 10
+        }
+}
+libgvplugin_dot_layout.so.2 dot_layout {
+        layout {
+                dot 0
+        }
+}
+libgvplugin_neato_layout.so.2 neato_layout {
+        layout {
+                neato 0
+                fdp 0
+                twopi 0
+                circo 0
+        }
+}
+</programlisting>
+</sect1>
+<sect1 id="s1-running">
+<title>Running dot with plugins</title>
+<para>
+Dot attempts to be transparent to the user about its use of plugins.
+By default it will always chose the highest quality plugin of the matching plugin-type.
+Sometimes it is necessary to override the default.
+This can be done by explicitly specifying the package to
+take the plugin from. e.g. <command>dot -Tpng</command>
+takes the highest quality
+plugin currently available.
+<command>dot -Tpng:cg</command>
+takes the png renderer from the codegens.
+</para>
+<para>
+If the package is unrecognized, the dot will return the set of available packages:
+</para>
+<programlisting>
+$ dot -Tpng: hello.dot
+Renderer type: "png:" not recognized. Use one of: png:cairo png:cg
+</programlisting>
+<para>
+Also, <command>dot -v</command> will identify all
+available plugins for all the apis.
+</para>
+<programlisting>
+       The plugin configuration file:
+               /home/ellson/FIX/Linux.i686/lib/graphviz/config
+                       was successfully loaded.
+       render      :  canon cmap cmapx dia dot fig gd gd2 gif gtk
+                       hpgl imap ismap jpeg jpg mif mp pcl pdf pic plain
+                       plain-ext png ps ps2 svg svgz vrml vtx wbmp xdot xlib
+       layout      :  circo dot fdp neato twopi
+       textlayout  :  cairo
+       device      :  gtk xlib
+       usershape   :  png-gd
+</programlisting>
+</sect1>
+<sect1 id="s1-installing">
+<title>Installing plugins</title>
+<para>
+In order for dot to know what plugin capabilities are available
+there is a file called <filename>/usr/lib/graphviz/config</filename> that is created
+by running
+<command>dot -c</command>
+at install time.
+<command>dot -c</command>
+globs the library directory for all
+filenames that look
+like they might be plugins, then it goes through and actually
+loads each of them in turn, positively verifying that they are
+version compatible and loadable, and it then extracts from each
+library the set of apis and types that it supports.
+It saves this information in <filename>/usr/lib/graphviz/config</filename>.
+When dot is run normally by a user, the single <filename>/usr/lib/graphviz/config</filename> file is
+loaded but the plugins themselves are not loaded unless a plugin
+is demanded from that library.
+</para>
+<para>
+<command>dot -c</command> must be run, with enough priviledges to write
+<filename>/usr/lib/graphviz/config</filename>, whenever the set of plugins is changed.
+For rpm systems
+<command>dot -c</command>
+is run automatically in %post and %postun
+scripts in the rpm specfile.
+If building from sources and installing directly,
+<command>dot -c</command> is run
+by the <command>make install</command> target.
+If you are cross-compiling and cross-installing then probably the
+best thing to do is to not use demand loaded plugins at all.
+There is a <command>dot_static</command>
+binary generated which as a basic set of
+plugins already builtin.
+</para>
+</sect1>
+<sect1 id="s1-developing">
+<title>Developing new plugins</title>
+<para>
+One of the key goals of the plugin architecture was to allow others
+to develop new plugins or plugin-libraries.   In this section I 
+describe the structure of the key parts of the graphvz-cairo package
+with a view to reusing or hacking them into a new package.
+</para>
+<sect2>
+<title>A plugin-package</title>
+<para>
+The following files in the source tree for the graphviz-cairo package
+can probably be used without change:
+<programlisting>
+        graphviz-cairo/
+        autogen.sh
+        cpl1.0.txt
+        ltmain.sh.patch
+        mkinstalldirs
+</programlisting>
+</para>
+<para>
+The following files should be changed to suit:
+<programlisting>
+        graphviz-cairo/
+        AUTHORS
+        ChangeLog
+        NEWS README
+        configure.ac
+        Makefile.am
+        graphviz-cairo.spec.in 
+</programlisting>
+</para>
+<para>
+Also in graphviz-cairo are a number of GUI related files
+specific to graphviz-cairo.
+These can be probably not useful for any other plugin based on this code:
+</para>
+<programlisting>
+    graphviz-cairo/
+        dot.dot
+        dot.png
+        dot.xml
+        dotedit-splash.dot
+        dotedit.desktop.in
+        dotedit.indotedit.in
+        po/
+</programlisting>
+</sect2>
+<sect2>
+<title>A plugin library</title>
+<para>
+Each library in the plugin package has its own subdirectory under plugins:
+</para>
+<programlisting>
+    graphviz-cairo/
+        plugin/
+            Makefile.am
+            cairo/
+                Makefile.am
+                gvplugin_cairo.c
+            gtk/
+                Makefile.am
+                gvplugin_gtk.c
+            xlib/
+                Makefile.am
+                gvplugin_xlib.c
+</programlisting>
+<para>
+graphviz-cairo/plugins/Makefile.am builds all the libraries as SUBDIRS.
+</para>
+<para>
+In each library subdir Makefile.am and a gvplugin_xxx.c.
+The gvplugin_cairo.c file is quite short.
+It defines the primary entry symbol to the library
+which is a structure defining the <emphasis>name</emphasis>
+of the library and the address of the table of APIs that it supports.
+</para>
+<para>
+The name: <emphasis>cairo</emphasis>,
+the symbol: <emphasis>gvplugin_cairo_LTX_library</emphasis>,
+and the filename of the library:
+<emphasis>libgvplugin_cairo.so.2.0.0</emphasis>
+must be kept aligned for the plugin mechanism to work.
+</para>
+<programlisting>
+#include "gvplugin.h"
+
+extern gvplugin_installed_t gvrender_cairogen_types;
+extern gvplugin_installed_t gvtextlayout_cairogen_types;
+
+static gvplugin_api_t apis[] = {
+    {API_render, &amp;gvrender_cairogen_types},
+    {API_textlayout, &amp;gvtextlayout_cairogen_types},
+    {(api_t)0, NULL},
+};
+
+gvplugin_library_t gvplugin_cairo_LTX_library = { "cairo", apis };
+</programlisting>
+</sect2>
+<sect2>
+<title>Plugin APIs</title>
+<para>
+The APIs are defined for the plugins by header files:
+</para>
+<programlisting>
+    /usr/include/graphviz/gvplugin_device.h
+    /usr/include/graphviz/gvplugin_layout.h
+    /usr/include/graphviz/gvplugin_render.h
+    /usr/include/graphviz/gvplugin_textlayout.h
+    /usr/include/graphviz/gvplugin_usershape.h
+</programlisting>
+<para>
+Also, the set of APIS is defined in graphviz2/lib/gvc/gvplugin.h in:
+    #define APIS ELEM(render) ELEM(layout) ELEM(textlayout) ELEM(device) ELEM(usershape)
+</para>
+<para>
+In the core of graphviz, each API is wrapped by a set of functions
+that hide the details of the plugin mechanisms from the caller.
+</para>
+<programlisting>
+    graphviz2/lib/gvc/gvdevice.c
+    graphviz2/lib/gvc/gvlayout.c
+    graphviz2/lib/gvc/gvrender.c
+    graphviz2/lib/gvc/gvtextlayout.c
+    graphviz2/lib/gvc/gvusershape.c
+</programlisting>
+<para>
+So, to add a new API, minimally what is required
+is a new header file, extend the #define APIS,
+and a new file of wrapper functions.
+</para>
+</sect2>
+<sect2>
+<title >Plugin types for an API</title>
+<para>
+The cairo library in particular is developing a number of new backends.
+At some point someone will want to use one or more of these new backends.
+</para>
+<para>
+(tbd)
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/doc/docbook/src/graphviz_scripting.xml b/doc/docbook/src/graphviz_scripting.xml
new file mode 100644 (file)
index 0000000..35d7907
--- /dev/null
@@ -0,0 +1,13 @@
+<!-- $Id: -->
+<chapter id="ch-scripting">
+<title>Graphviz Scripting</title>
+<sect1 id="s1-scripting-introduction">
+<title>Introduction</title>
+<para>
+Graphviz supports a C/C++ API suitable for SWIG-generatted wrappers so that the dot libraries can be used form various scripting and other languages.
+The set of languages currently available includes:
+C#, GUILE, JAVA, LUA, OCAML, PERL, PHP, PYTHON, RUBY, TCL.
+in addition to C and C++.
+</para>
+</sect1>
+</chapter>
diff --git a/doc/docbook/src/imgs/Txlib.png b/doc/docbook/src/imgs/Txlib.png
new file mode 100644 (file)
index 0000000..cc298d8
Binary files /dev/null and b/doc/docbook/src/imgs/Txlib.png differ
diff --git a/doc/docbook/src/imgs/framework.png b/doc/docbook/src/imgs/framework.png
new file mode 100644 (file)
index 0000000..ed4ee09
Binary files /dev/null and b/doc/docbook/src/imgs/framework.png differ
diff --git a/doc/docbook/src/imgs/framework.svg b/doc/docbook/src/imgs/framework.svg
new file mode 100644 (file)
index 0000000..3838253
--- /dev/null
@@ -0,0 +1,608 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.42.2"
+   sodipodi:docbase="/home/ellson/graphviz_plugins"
+   sodipodi:docname="framework.svg"
+   inkscape:export-filename="/home/ellson/graphviz_plugins/framework.png"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-ydpi="90.000000">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0000000"
+     inkscape:cx="375.00000"
+     inkscape:cy="564.65832"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="1094"
+     inkscape:window-height="1143"
+     inkscape:window-x="0"
+     inkscape:window-y="27" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#eaf5ff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2203"
+       width="562.46729"
+       height="313.13171"
+       x="56.922123"
+       y="104.20531" />
+    <rect
+       style="fill:#eaf5ff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect1306"
+       width="564.97827"
+       height="379.50195"
+       x="56.796570"
+       y="431.52972" />
+    <rect
+       style="fill:#a5d8ff;fill-opacity:0.85000002;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2035"
+       width="461.39893"
+       height="227.01212"
+       x="107.89571"
+       y="458.11447" />
+    <rect
+       style="fill:#a5d8ff;fill-opacity:0.85000002;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2037"
+       width="461.39893"
+       height="50.650684"
+       x="108.33514"
+       y="693.16827" />
+    <rect
+       style="fill:#a5d8ff;fill-opacity:0.85000002;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2039"
+       width="461.39893"
+       height="50.651146"
+       x="107.45629"
+       y="753.67035" />
+    <rect
+       style="fill:#a5d8ff;fill-opacity:0.85000002;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2041"
+       width="460.68942"
+       height="121.43221"
+       x="107.81103"
+       y="155.58691" />
+    <rect
+       style="fill:#eaf5ff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2043"
+       width="65.950050"
+       height="27.365005"
+       x="138.76579"
+       y="258.20569" />
+    <rect
+       style="fill:#eaf5ff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2047"
+       width="65.950050"
+       height="27.365005"
+       x="222.85213"
+       y="258.20569" />
+    <rect
+       style="fill:#eaf5ff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2049"
+       width="65.950050"
+       height="27.365005"
+       x="306.93842"
+       y="258.20569" />
+    <rect
+       style="fill:#eaf5ff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2051"
+       width="65.950050"
+       height="27.365005"
+       x="391.02475"
+       y="258.20569" />
+    <rect
+       style="fill:#eaf5ff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2053"
+       width="65.950050"
+       height="27.365005"
+       x="475.11108"
+       y="258.20569" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2059"
+       width="65.950050"
+       height="27.365005"
+       x="307.81729"
+       y="474.56027" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2061"
+       width="65.950050"
+       height="27.135048"
+       x="391.30853"
+       y="474.55667" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2093"
+       width="65.950050"
+       height="27.365005"
+       x="476.86880"
+       y="710.58344" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2103"
+       width="65.950050"
+       height="27.365005"
+       x="475.98993"
+       y="772.15472" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2105"
+       width="65.950050"
+       height="27.135048"
+       x="391.30853"
+       y="561.47363" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2107"
+       width="65.950050"
+       height="27.135048"
+       x="391.30853"
+       y="604.93213" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2109"
+       width="65.950050"
+       height="27.135048"
+       x="391.30853"
+       y="648.39056" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2111"
+       width="65.950050"
+       height="27.135048"
+       x="391.30853"
+       y="518.01514" />
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="64.818657"
+       y="123.91798"
+       id="text2113"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2115"
+         x="64.818657"
+         y="123.91798">graphviz  rpm</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403098px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="65.47702"
+       y="452.90894"
+       id="text2117"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2119"
+         x="65.477020"
+         y="452.90894">graphviz-cairo rpm</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="122.0357"
+       y="478.49023"
+       id="text2121"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2123"
+         x="122.03570"
+         y="478.49023">libgvplugin_cairo.so</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="124.63647"
+       y="716.89453"
+       id="text2125"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2127"
+         x="124.63647"
+         y="716.89453">libgvplugin_xlib.so</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="122.0357"
+       y="776.71234"
+       id="text2129"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2131"
+         x="122.03570"
+         y="776.71234">libgvplugin_gtk.so</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="141.10805"
+       y="254.82362"
+       id="text2133"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2135"
+         x="141.10805"
+         y="254.82362">layout</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="225.19975"
+       y="254.82362"
+       id="text2137"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2139"
+         x="225.19975"
+         y="254.82362">usershape</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="305.82376"
+       y="254.82362"
+       id="text2141"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2143"
+         x="305.82376"
+         y="254.82362">textlayout</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="399.09097"
+       y="255.97331"
+       id="text2145"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2147"
+         x="399.09097"
+         y="255.97331">render</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="472.27332"
+       y="256.84024"
+       id="text2149"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2151"
+         x="472.27332"
+         y="256.84024">device</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="489.61182"
+       y="734.23303"
+       id="text2161"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2163"
+         x="489.61182"
+         y="734.23303">xlib</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="491.34564"
+       y="800.11932"
+       id="text2165"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2167"
+         x="491.34564"
+         y="800.11932">gtk</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.359290px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="396.54715"
+       y="497.79703"
+       id="text2169"
+       transform="scale(1.018048,0.982272)"><tspan
+         sodipodi:role="line"
+         id="tspan2171"
+         x="396.54715"
+         y="497.79703">png</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.359290px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="396.54715"
+       y="541.82404"
+       id="text2173"
+       transform="scale(1.018048,0.982272)"><tspan
+         sodipodi:role="line"
+         id="tspan2175"
+         x="396.54715"
+         y="541.82404">ps</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.359290px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="396.54715"
+       y="590.16742"
+       id="text2177"
+       transform="scale(1.018048,0.982272)"><tspan
+         sodipodi:role="line"
+         id="tspan2179"
+         x="396.54715"
+         y="590.16742">pdf</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.359290px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="397.18954"
+       y="631.60449"
+       id="text2181"
+       transform="scale(1.018048,0.982272)"><tspan
+         sodipodi:role="line"
+         id="tspan2183"
+         x="397.18954"
+         y="631.60449">xlib</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.359290px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="396.91638"
+       y="675.63153"
+       id="text2185"
+       transform="scale(1.018048,0.982272)"><tspan
+         sodipodi:role="line"
+         id="tspan2187"
+         x="396.91638"
+         y="675.63153">gtk</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="308.78094"
+       y="496.09793"
+       id="text2197"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2199"
+         x="308.78094"
+         y="496.09793">textlayout</tspan></text>
+    <rect
+       style="fill:#eaf5ff;fill-opacity:1.0000000;stroke:#7affff;stroke-opacity:1.0000000"
+       id="rect2201"
+       width="460.69360"
+       height="8.2114983"
+       x="106.93009"
+       y="278.47189" />
+    <rect
+       style="fill:#afddff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2229"
+       width="461.39893"
+       height="53.173557"
+       x="107.01686"
+       y="292.44180" />
+    <rect
+       style="fill:#afddff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2231"
+       width="461.39893"
+       height="50.651146"
+       x="106.13801"
+       y="355.48804" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2233"
+       width="65.950050"
+       height="27.365005"
+       x="138.94901"
+       y="313.25629" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-opacity:1.0000000"
+       id="rect2235"
+       width="65.950050"
+       height="27.365005"
+       x="138.07016"
+       y="374.82755" />
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="122.46916"
+       y="310.63181"
+       id="text2237"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2239"
+         x="122.46916"
+         y="310.63181">libgvplugin_dot_layout.so</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="120.73531"
+       y="373.05038"
+       id="text2241"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2243"
+         x="120.73531"
+         y="373.05038">libgvplugin_neato_layout.so</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="156.27922"
+       y="331.43799"
+       id="text2245"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2247"
+         x="156.27922"
+         y="331.43799">dot</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="158.01308"
+       y="397.32428"
+       id="text2249"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2251"
+         x="158.01308"
+         y="397.32428">neato</tspan></text>
+    <rect
+       style="fill:#9dbcff;fill-opacity:1.0000000;stroke:#8f71ff;stroke-width:0.95621806;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+       id="rect2265"
+       width="341.87463"
+       height="61.385979"
+       x="210.72177"
+       y="168.50691" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.86692476;stroke-miterlimit:4.0000000;stroke-dasharray:1.7338496 0.86692479 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+       id="rect2255"
+       width="65.950050"
+       height="27.365005"
+       x="221.97327"
+       y="191.80229" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.86692476;stroke-miterlimit:4.0000000;stroke-dasharray:1.7338496 0.86692479 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+       id="rect2257"
+       width="65.950050"
+       height="27.365005"
+       x="306.05957"
+       y="191.80229" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.86692476;stroke-miterlimit:4.0000000;stroke-dasharray:1.7338496 0.86692479 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+       id="rect2259"
+       width="65.950050"
+       height="27.365005"
+       x="390.14590"
+       y="191.80229" />
+    <rect
+       style="fill:#a5ffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.86692476;stroke-miterlimit:4.0000000;stroke-dasharray:1.7338496 0.86692479 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+       id="rect2261"
+       width="65.950050"
+       height="27.365005"
+       x="474.23224"
+       y="191.80229" />
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="220.86513"
+       y="182.86887"
+       id="text2267"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2269"
+         x="220.86513"
+         y="182.86887">builtins</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="122.90262"
+       y="173.33269"
+       id="text2271"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2273"
+         x="122.90262"
+         y="173.33269">libgvc</tspan><tspan
+         sodipodi:role="line"
+         x="122.90262"
+         y="186.33656"
+         id="tspan2275">libcommon</tspan><tspan
+         sodipodi:role="line"
+         x="122.90262"
+         y="199.34043"
+         id="tspan2277">libgraph</tspan><tspan
+         sodipodi:role="line"
+         x="122.90262"
+         y="212.34430"
+         id="tspan2279">libcdt</tspan><tspan
+         sodipodi:role="line"
+         x="122.90262"
+         y="225.34817"
+         id="tspan2281">libgd</tspan></text>
+    <rect
+       style="fill:#a5d8ff;fill-opacity:0.85000002;stroke:#000071;stroke-width:0.95621806;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+       id="rect2283"
+       width="103.70490"
+       height="33.351101"
+       x="283.66675"
+       y="122.23582" />
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="286.7514"
+       y="136.05493"
+       id="text2285"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2287"
+         x="286.75140"
+         y="136.05493">dot</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="313.62607"
+       y="152.5265"
+       id="text2289"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2291"
+         x="313.62607"
+         y="152.52650">main() </tspan></text>
+    <rect
+       style="fill:#ffffff;fill-opacity:0.23668636;stroke:#000000;stroke-width:0.95621806;stroke-miterlimit:4.0000000;stroke-dasharray:7.6497447 7.6497447 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+       id="rect2123"
+       width="84.370094"
+       height="719.18652"
+       x="382.97736"
+       y="175.25551" />
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="389.91547"
+       y="211.47739"
+       id="text2126"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2128"
+         x="389.91547"
+         y="211.47739">(codegens)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.403097px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+       x="384.7139"
+       y="840.86481"
+       id="text2138"
+       transform="scale(1.013762,0.986425)"><tspan
+         sodipodi:role="line"
+         id="tspan2140"
+         x="384.71390"
+         y="840.86481">Render api</tspan><tspan
+         sodipodi:role="line"
+         x="384.71390"
+         y="853.86868"
+         id="tspan2142">and its</tspan><tspan
+         sodipodi:role="line"
+         x="384.71390"
+         y="866.87255"
+         id="tspan2152">alternative</tspan><tspan
+         sodipodi:role="line"
+         x="384.71390"
+         y="879.87642"
+         id="tspan2144">plugin-types</tspan></text>
+  </g>
+</svg>
diff --git a/doc/docbook/src/imgs/hello_cairo.png b/doc/docbook/src/imgs/hello_cairo.png
new file mode 100644 (file)
index 0000000..0e08b60
Binary files /dev/null and b/doc/docbook/src/imgs/hello_cairo.png differ
diff --git a/doc/docbook/src/imgs/hello_gd.png b/doc/docbook/src/imgs/hello_gd.png
new file mode 100644 (file)
index 0000000..518b228
Binary files /dev/null and b/doc/docbook/src/imgs/hello_gd.png differ