#  Copyright (c) 1994-1996 Sun Microsystems, Inc.
#  See the file "license.terms" for information on usage and redistribution
#  of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
#

=head1 NAME

Tk_CanvasTkwin, Tk_CanvasGetCoord, Tk_CanvasDrawableCoords, Tk_CanvasSetStippleOrigin, Tk_CanvasWindowCoords, Tk_CanvasEventuallyRedraw, Tk_CanvasTagsOption - utility procedures for canvas type managers

=for category C Programming

=head1 SYNOPSIS

B<#include E<lt>tk.hE<gt>>

Tk_Window
B<Tk_CanvasTkwin>(I<canvas>)

int
B<Tk_CanvasGetCoord>(I<interp, canvas, string, doublePtr>)

B<Tk_CanvasDrawableCoords>(I<canvas, x, y, drawableXPtr, drawableYPtr>)

B<Tk_CanvasSetStippleOrigin>(I<canvas, gc>)

B<Tk_CanvasWindowCoords>(I<canvas, x, y, screenXPtr, screenYPtr>)

B<Tk_CanvasEventuallyRedraw>(I<canvas, x1, y1, x2, y2>)

Tk_OptionParseProc *B<Tk_CanvasTagsParseProc>;

Tk_OptionPrintProc *B<Tk_CanvasTagsPrintProc>;

=head1 ARGUMENTS

=over 4

=item Tk_Canvas canvas (in)

A token that identifies a canvas widget.

=item Tcl_Interp *interp (in/out)

Interpreter to use for error reporting.

=item char *string (in)

Textual description of a canvas coordinate.

=item double *doublePtr (out)

Points to place to store a converted coordinate.

=item double x (in)

An x coordinate in the space of the canvas.

=item double y (in)

A y coordinate in the space of the canvas.

=item short *drawableXPtr (out)

Pointer to a location in which to store an x coordinate in the space
of the drawable currently being used to redisplay the canvas.

=item short *drawableYPtr (out)

Pointer to a location in which to store a y coordinate in the space
of the drawable currently being used to redisplay the canvas.

=item GC gc (out)

Graphics context to modify.

=item short *screenXPtr (out)

Points to a location in which to store the screen coordinate in the
canvas window that corresponds to I<x>.

=item short *screenYPtr (out)

Points to a location in which to store the screen coordinate in the
canvas window that corresponds to I<y>.

=item int x1 (in)

Left edge of the region that needs redisplay.  Only pixels at or to
the right of this coordinate need to be redisplayed.

=item int y1 (in)

Top edge of the region that needs redisplay.  Only pixels at or below
this coordinate need to be redisplayed.

=item int x2 (in)

Right edge of the region that needs redisplay.  Only pixels to
the left of this coordinate need to be redisplayed.

=item int y2 (in)

Bottom edge of the region that needs redisplay.  Only pixels above
this coordinate need to be redisplayed.

=back

=head1 DESCRIPTION

These procedures are called by canvas type managers to perform various
utility functions.

B<Tk_CanvasTkwin> returns the Tk_Window associated with a particular
canvas.

B<Tk_CanvasGetCoord> translates a string specification of a
coordinate (such as B<2p> or B<1.6c>) into a double-precision
canvas coordinate.
If I<string> is a valid coordinate description then B<Tk_CanvasGetCoord>
stores the corresponding canvas coordinate at *I<doublePtr>
and returns TCL_OK.
Otherwise it stores an error message in I<interp-E<gt>result> and
returns TCL_ERROR.

B<Tk_CanvasDrawableCoords> is called by type managers during
redisplay to compute where to draw things.
Given I<x> and I<y> coordinates in the space of the
canvas, B<Tk_CanvasDrawableCoords> computes the corresponding
pixel in the drawable that is currently being used for redisplay;
it returns those coordinates in *I<drawableXPtr> and *I<drawableYPtr>.
This procedure should not be invoked except during redisplay.

B<Tk_CanvasSetStippleOrigin> is also used during redisplay.
It sets the stipple origin in I<gc> so that stipples drawn
with I<gc> in the current offscreen pixmap will line up
with stipples drawn with origin (0,0) in the canvas's actual
window.
B<Tk_CanvasSetStippleOrigin> is needed in order to guarantee
that stipple patterns line up properly when the canvas is
redisplayed in small pieces.
Redisplays are carried out in double-buffered fashion where a
piece of the canvas is redrawn in an offscreen pixmap and then
copied back onto the screen.
In this approach the stipple origins in graphics contexts need to
be adjusted during each redisplay to compensate for the position
of the off-screen pixmap relative to the window.
If an item is being drawn with stipples, its type manager typically
calls B<Tk_CanvasSetStippleOrigin> just before using I<gc>
to draw something;  after it is finished drawing, the type manager
calls B<XSetTSOrigin> to restore the origin in I<gc> back to (0,0)
(the restore is needed because graphics contexts are shared, so
they cannot be modified permanently).

B<Tk_CanvasWindowCoords> is similar to B<Tk_CanvasDrawableCoords>
except that it returns coordinates in the canvas's window on the
screen, instead of coordinates in an off-screen pixmap.

B<Tk_CanvasEventuallyRedraw> may be invoked by a type manager
to inform Tk that a portion of a canvas needs to be redrawn.
The I<x1>, I<y1>, I<x2>, and I<y2> arguments
specify the region that needs to be redrawn, in canvas coordinates.
Type managers rarely need to invoke B<Tk_CanvasEventuallyRedraw>,
since Tk can normally figure out when an item has changed and make
the redisplay request on its behalf (this happens, for example
whenever Tk calls a I<configureProc> or I<scaleProc>).
The only time that a type manager needs to call
B<Tk_CanvasEventuallyRedraw> is if an item has changed on its own
without being invoked through one of the procedures in its Tk_ItemType;
this could happen, for example, in an image item if the image is
modified using image commands.

B<Tk_CanvasTagsParseProc> and B<Tk_CanvasTagsPrintProc> are
procedures that handle the B<-tags> option for canvas items.
The code of a canvas type manager won't call these procedures
directly, but will use their addresses to create a B<Tk_CustomOption>
structure for the B<-tags> option.   The code typically looks
like this:

 static Tk_CustomOption tagsOption = {Tk_CanvasTagsParseProc,
 	Tk_CanvasTagsPrintProc, (ClientData) NULL
 };

 static Tk_ConfigSpec configSpecs[] = {
 	...
 	{TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
 		(char *) NULL, 0, TK_CONFIG_NULL_OK, &tagsOption},
 	...
 };

=head1 KEYWORDS

canvas, focus, item type, redisplay, selection, type manager