[cairo] Howto: insert anchors into cairo-generated PDF or SVG graphics ?
John Ellson
ellson at research.att.com
Wed Feb 6 10:09:03 PST 2008
Carl Worth wrote:
> On Tue, 05 Feb 2008 12:49:38 -0500, John Ellson wrote:
>
>> Is there a cairo-api that can be used to place anchor annotations around
>> blocks of cairo graphic objects in output formats that support them,
>> such as SVG or PDF ?
>>
>
> There's not any API for this yet. But we've had an item on our TODO
> list for just about forever saying that it would definitely be a nice
> thing to have.
>
> I think we're just waiting for someone to take it from the "it would
> be nice" stage to something more concrete by starting an
> implementation.
>
>
>> Or can anyone suggest any hacks or kludges that would let me do
>> this?
>>
>
> I hope you'll get some feedback to this question, since hacks and
> kludges might actually help direct the way toward a real solution.
>
> -Carl
>
Carl,
Here are some thoughts to try get a development discussion started:
Goal:
Support for "anchors" in cairo's various output formats. i.e.
regions that are sensitive
to the mouse and which can raise a tooltip or map to a URL.
This proposal is based on experience with generating anchors and maps
in graphviz
(and is pragmatically designed to minimally support the needs of
graphviz).
Examples:
SVG:
[<!ATTLIST svg xmlns:xlink CDATA #FIXED
"http://www.w3.org/1999/xlink">]
...
<a xlink:href="some_url" xlink:title="some_tooltip"
target="some_target">
... graphics ...
</a>
VML:
<a href="some_url" title="some_tooltip" target="some_target">
... graphics ...
</a>
PDF:
[ /Rect [ x1 y1 x2 y2 ]
/Border [ 0 0 0 ]
/Action << /Subtype /URI /URI some_url
/Subtype /Link
/ANN pdfmark
Imagemaps
<area shape="poly" href="some_url" title="some_tooltip" alt=""
coords="x1 y1 ..... " />
Observations:
SVG and VML anchors enclose the graphic primitives, PDF and Imagemaps
describe a separate shape for the sensitive area.
Imagemaps are just a surface with anchors, but no other graphics.
Once anchors
are supported it makes sense for cairo to support imagemaps as an
output surface type.
Proposal for cairo api:
typedef struct {
char *url; /* null permitted for case of tooltip
only */
char *tooltip; /* null permitted */
char *target; /* null permitted */
} cairo_anchor_data_t;
cairo_status_t cairo_begin_anchor(cairo_t, cairo_anchor_data_t);
cairo_status_t cairo_end_anchor(cairo_t);
cairo_begin_anchor() ... cairo_end_anchor() would enclose the set of
graphics
that are to be mouse sensitive in the output format.
Each backend would emit output using the fields in the
cairo_anchor_data_t
in the appropriate syntax for that format. Null property values
will cause
the entire property=value to be omitted from the output.
Backends have access to the contained graphics and so can calculate
bounding shapes
as needed.
John
More information about the cairo
mailing list