diff options
| author | Michael R Sweet <michael.r.sweet@gmail.com> | 1999-01-07 16:36:11 +0000 |
|---|---|---|
| committer | Michael R Sweet <michael.r.sweet@gmail.com> | 1999-01-07 16:36:11 +0000 |
| commit | 367f908d8ed5a3464b9676223a26ddf4e11bdb5b (patch) | |
| tree | 2b0ec583852973ccf7b9804957e78d474e0e7e5d /documentation/drawing.html | |
| parent | 85e6f449590eeb6e09f7547733adf4c7137470d0 (diff) | |
"Final" changes for first draft of 1.0 documentation.
git-svn-id: file:///fltk/svn/fltk/trunk@187 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'documentation/drawing.html')
| -rw-r--r-- | documentation/drawing.html | 1464 |
1 files changed, 425 insertions, 1039 deletions
diff --git a/documentation/drawing.html b/documentation/drawing.html index 2e78a7086..2d195d3de 100644 --- a/documentation/drawing.html +++ b/documentation/drawing.html @@ -1,9 +1,11 @@ <HTML> <BODY> -<H1>Chapter XXX - Drawing Things in FLTK</H1> +<H1>5 - Drawing Things in FLTK</H1> -<h2>When can you draw things in FLTK?</h2> +This chapter covers the drawing functions that are provided with FLTK. + +<h2>When Can You Draw Things in FLTK?</h2> There are only certain places you can execute drawing code in FLTK. Calling these functions at other places will result in undefined @@ -11,1285 +13,669 @@ behavior! <ul> -<li>The most common is inside the virtual method <a -href=subclass.html#draw>Fl_Widget::draw()</a>. To write code here, -you must subclass one of the existing Fl_Widget classes and implement -your own version of draw(). - -<p> - -<li>You can also write <a href=Boxtypes.html>boxtypes</a> and <a href -= Labeltypes.html>labeltypes</a>. These are small procedures that can be -called by existing Fl_Widget draw() methods. These "types" are -identified by an 8-bit index that is stored in the widget's box(), -labeltype(), and possibly other properties. - -<p> - -<li>You can call <a -href=Fl_Window.html#make_current>Fl_Window::make_current()</a> to do -incremental update of a widget (use <a -href=Fl_Widget.html#window>Fl_Widget::window()</a> to find the -window). <i>Under X this only works for the base Fl_Window class, not -for double buffered, overlay, or OpenGL windows!</i> + <li>The most common is inside the virtual method <a + href="#draw"><tt>Fl_Widget::draw()</tt></a>. To write code + here, you must subclass one of the existing <tt>Fl_Widget</tt> + classes and implement your own version of <tt>draw()</tt>. + + <li>You can also write <a href="#boxtypes">boxtypes</a> and <a + href="#labeltypes">labeltypes</a>. These are small procedures + that can be called by existing <tt>Fl_Widget</tt> + <tt>draw()</tt> methods. These "types" are identified by an + 8-bit index that is stored in the widget's <tt>box()</tt>, + <tt>labeltype()</tt>, and possibly other properties. + + <li>You can call <a + href="#Fl_Window.make_current"><tt>Fl_Window::make_current()</tt></a> + to do incremental update of a widget. Use <a + href="#Fl_Widget.window"><tt>Fl_Widget::window()</tt></a> to + find the window. <i>Under X this only works for the base + <tt>Fl_Window</tt> class, not for double buffered, overlay, or + OpenGL windows!</i> </ul> -</ul><h2>FLTK Drawing functions<br>#include <FL/fl_draw.H></h2> +<h2>FLTK Drawing Functions</h2> + +To use the drawing functions you must first include the +<tt><FL/fl_draw.H></tt> header file. FLTK provides the following types +of drawing functions: <ul> -<li><a href=#clipping>Clipping</a> -<li><a href=#color>Colors</a> -<li><a href=#fast>Fast Shapes</a> -<li><a href=#vertex>Complex Shapes</a> -<li><a href=#text>Text</a> -<li><a href=images.html>Images</a> -<li><a href=#cursor>Cursor</a> -<li><a href=#overlay>Overlay</a> -<li><a href=Fl_Gl_Window.html#gl_start>Using OpenGL</a> + <li><a href="#clipping">Clipping</a> + <li><a href="#color">Colors</a> + <li><a href="#fast">Fast Shapes</a> + <li><a href="#vertex">Complex Shapes</a> + <li><a href="#text">Text</a> + <li><a href="#images">Images</a> + <li><a href="#cursor">Cursor</a> + <li><a href="#overlay">Overlay</a> </ul> -</ul><hr><h3>Clipping</h3> +<h3><a name="clipping">Clipping</a></h3> -<p>You can limit all your drawing to a rectangular region by calling -fl_clip, and put the drawings back by using fl_pop_clip. This -rectangle is measured in pixels (it is unaffected by the current -transformation matrix). +You can limit all your drawing to a rectangular region by calling +<tt>fl_clip</tt>, and put the drawings back by using +<tt>fl_pop_clip</tt>. This rectangle is measured in pixels (it is +unaffected by the current transformation matrix). <p>In addition, the system may provide clipping when updating windows, this clip region may be more complex than a simple rectangle. -</ul><h4><code>void fl_clip(int x, int y, int w, int h);</code></h4><ul> +<h4>void fl_clip(int x, int y, int w, int h)</h4> -Intesect the current clip region with a rectangle and push this new +Intersect the current clip region with a rectangle and push this new region onto the stack. -</ul><h4><code>void fl_pop_clip();</code></h4><ul> +<h4>void fl_pop_clip()</h4> -Restore the previous clip region. <i>You must call fl_pop_clip() once -for every time you call fl_clip(). If you return to FLTK with the -clip stack not empty unpredictable results occur.</i> +Restore the previous clip region. <i>You must call +<tt>fl_pop_clip()</tt> once for every time you call +<tt>fl_clip()</tt>. If you return to FLTK with the clip stack not +empty unpredictable results occur.</i> -</ul><h4><code>int fl_not_clipped(int x, int y, int w, int h);</code></h4><ul> +<h4>int fl_not_clipped(int x, int y, int w, int h)</h4> Returns true if any of the rectangle intersects the current clip region. If this returns false you don't have to draw the object. -<i>On X this returns 2 if the rectangle is partially clipped, and 1 if -it is entirely inside the clip region</i>. +<i>Under X this returns 2 if the rectangle is partially clipped, and 1 +if it is entirely inside the clip region</i>. -</ul><h4><code>int fl_clip_box(int x, int y, int w, int h,<br> -    int& X, int& Y, int& W, int& H);</code></h4><ul> +<h4>int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H)</h4> -Intersect the rectangle x,y,w,h with the current clip region and -returns the bounding box of the result in X,Y,W,H. Returns non-zero -if the resulting rectangle is different than the original. This can -be used to limit the necessary drawing to a rectangle. W and H are set to -zero if the rectangle is completely outside the region. +Intersect the rectangle <tt>x,y,w,h</tt> with the current clip region +and returns the bounding box of the result in <tt>X,Y,W,H</tt>. +Returns non-zero if the resulting rectangle is different than the +original. This can be used to limit the necessary drawing to a +rectangle. <tt>W</tt> and <tt>H</tt> are set to zero if the rectangle +is completely outside the region. -</ul><hr><h3>Colors</h3> +<h3><a name="colors">Colors</a></h3> -</ul><h4><code>void fl_color(Fl_Color);</code></h4><ul> +<h4>void fl_color(Fl_Color)</h4> -<p>Set the color for all subsequent drawing operations. Fl_Color is -an enumeration type, all values are in the range 0-255. This is -<i>not</i> the X pixel, it is an internal table! The table provides -several general colors, a 24-entry gray ramp, and a 5x8x5 color cube. -All of these are named with poorly-documented symbols in <a -href=Enumerations.html><FL/Enumerations.H></a>. +Set the color for all subsequent drawing operations. <tt>Fl_Color</tt> +is an enumeration type, and all values are in the range 0-255. This is +<i>not</i> the X or WIN32 pixel, it is an index into an internal +table! The table provides several general colors, a 24-entry gray +ramp, and a 5x8x5 color cube. All of these are named with +poorly-documented symbols in <a +href=#enumerations><tt><FL/Enumerations.H></tt></a>. -<p><i>Under X, a color cell will be allocated out of fl_colormap each -time you request an fl_color the first time. If the colormap fills up -then a least-squares algorithim is used to find the closest color.</i> +<p>For colormapped displays, a color cell will be allocated out of +<tt>fl_colormap</tt> the first time you use a color. If the colormap +fills up then a least-squares algorithm is used to find the closest +color.</i> -</ul><h4><code>Fl_Color fl_color();</code></h4><ul> +<h4>Fl_Color fl_color()</h4> -Returns the last fl_color() that was set. This can be used for state +Returns the last <tt>fl_color()</tt> that was set. This can be used for state save/restore. -</ul><h4><code>void Fl::set_color(Fl_Color, uchar r, uchar g, uchar b); -<br>void Fl::get_color(Fl_Color, uchar &, uchar &, uchar &);</code></h4><ul> - -Set or get an entry in the fl_color index table. You can set it to -any 8-bit rgb color. <i>On X, if the index has been requested before, -the pixel is free'd. No pixel is allocated until fl_color(i) is used -again, and there is no guarantee that the same pixel will be used next -time.</i> - -</ul><h4><code>void fl_color(uchar r, uchar g, uchar -b);</code></h4><ul> +<h4>void fl_color(uchar r, uchar g, uchar b)</h4> -<p>Set the color for all subsequent drawing operations. The closest -possible match to the rgb color is used. <i>Under X this works -perfectly for TrueColor visuals. For colormap visuals the nearest index -in the gray ramp or color cube is figured out, and fl_color(i) is done -with that, this can result in two approximations of the color and is -very inaccurate!</i> +Set the color for all subsequent drawing operations. The closest +possible match to the RGB color is used. The RGB color is used +directly on TrueColor displays. For colormap visuals the nearest index +in the gray ramp or color cube is used. -</ul><hr><h3>Fast Shapes</h3> +<h3><a name="fast_shapes">Fast Shapes</a></h3> -These are used to draw almost all the FLTK widgets. They draw on -exact pixel boundaries and are as fast as possible, and their behavior -will be duplicated exactly on any platform FLTK is ported to. It is +These are used to draw almost all the FLTK widgets. They draw on exact +pixel boundaries and are as fast as possible, and their behavior will +be duplicated exactly on any platform FLTK is ported to. It is undefined whether these are affected by the <a -href=#vertex>transformation matrix</a>, so you should only call these +href="#complex_shapes">transformation matrix</a>, so you should only call these while it is the identity. -<p><i>All arguments are integers.</i> - -</ul><h4><code>void fl_rectf(x, y, w, h);</code></h4><ul> +<h4>void fl_rectf(int x, int y, int w, int h)</h4> Color a rectangle that exactly fills the given bounding box. -</ul><h4><code>void fl_rectf(x, y, w, h, uchar r, uchar g, uchar b);</code></h4><ul> +<h4>void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b)</h4> -Color a rectangle with "exactly" the passed r,g,b color. On screens -with less than 24 bits of color this is done by drawing a +Color a rectangle with "exactly" the passed <tt>r,g,b</tt> color. On +screens with less than 24 bits of color this is done by drawing a solid-colored block using <a -href=images.html#fl_draw_image>fl_draw_image()</a> so that dithering -is produced. If you have 24 bit color, this fills the rectangle with a -single pixel value and is about 1 zillion times faster. +href="#fl_draw_image"><tt>fl_draw_image()</tt></a> so that dithering is +produced. -</ul><h4><code>void fl_rect(x, y, w, h);</code></h4><ul> +<h4>void fl_rect(int x, int y, int w, int h)</h4> Draw a 1-pixel border <i>inside</i> this bounding box. -</ul><h4><code>void fl_line(x, y, x1, y1); -<br>void fl_line(x, y, x1, y1, x2, y2);</code></h4><ul> +<h4>void fl_line(int x, int y, int x1, int y1)<br> +void fl_line(int x, int y, int x1, int y1, int x2, int y2)</h4> Draw one or two 1-pixel thick lines between the given points. -</ul><h4><code>void fl_loop(x, y, x1, y1, x2, y2); -<br>void fl_loop(x, y, x1, y1, x2, y2, x3, y3); -</code></h4><ul> +<h4>void fl_loop(int x, int y, int x1, int y1, int x2, int y2)<br> +void fl_loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3)</h4> Outline a 3 or 4-sided polygon with 1-pixel thick lines. -</ul><h4><code>void fl_polygon(x, y, x1, y1, x2, y2); -<br>void fl_polygon(x, y, x1, y1, x2, y2, x3, y3); -</code></h4><ul> +<h4>void fl_polygon(int x, int y, int x1, int y1, int x2, int y2)<br> +void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3)</h4> Fill a 3 or 4-sided polygon. The polygon must be convex. -</ul><h4><code>void fl_xyline(x, y, x1, y1); -<br>void fl_xyline(x, y, x1, y1, x2); -<br>void fl_xyline(x, y, x1, y1, x2, y3); -</code></h4><ul> +<h4>void fl_xyline(int x, int y, int x1, int y1)<br> +void fl_xyline(int x, int y, int x1, int y1, int x2)<br> +void fl_xyline(int x, int y, int x1, int y1, int x2, int y3)</h4> Draw 1-pixel wide horizontal and vertical lines. A horizontal line is drawn first, then a vertical, then a horizontal. -</ul><h4><code>void fl_yxline(x, y, y1); -<br>void fl_yxline(x, y, y1, x2); -<br>void fl_yxline(x, y, y1, x2, y3); -</code></h4><ul> +<h4>void fl_yxline(int x, int y, int y1)<br> +void fl_yxline(int x, int y, int y1, int x2)<br> +void fl_yxline(int x, int y, int y1, int x2, int y3)</h4> Draw 1-pixel wide vertical and horizontal lines. A vertical line is drawn first, then a horizontal, then a vertical. -</ul><h4><code> -void fl_arc(x, y, w, h, double a1, double a2);<br> -void fl_pie(x, y, w, h, double a1, double a2);<br> -void fl_chord(x, y, w, h, double a1, double a2);</code></h4><ul> +<h4>void fl_arc(int x, int y, int w, int h, double a1, double a2)<br> +void fl_pie(int x, int y, int w, int h, double a1, double a2)<br> +void fl_chord(int x, int y, int w, int h, double a1, double a2)</h4> High-speed ellipse sections. These functions match the rather limited -circle drawing code provided by X and MSWindows. The advantage over using <a -href=#fl_arc>fl_arc</a> is that they are faster because they often use -the hardware, and they draw much nicer small circles, since the small -sizes are often hard-coded bitmaps. +circle drawing code provided by X and MSWindows. The advantage over +using <a href="#fl_arc"><tt>fl_arc</tt></a> is that they are faster +because they often use the hardware, and they draw much nicer small +circles, since the small sizes are often hard-coded bitmaps. <p>If a complete circle is drawn it will fit inside the passed bounding box. The two angles are measured in degrees counterclockwise -from 3'oclock and are the starting and ending angle of the arc, a2 -must be greater or equal to a1. +from 3'oclock and are the starting and ending angle of the arc, <tt>a2</tt> +must be greater or equal to <tt>a1</tt>. -<p>fl_arc draws a 1-pixel thick line (notice this has a different -number of arguments than the <a href=#fl_arc>fl_arc</a> described +<p><tt>fl_arc()</tt> draws a 1-pixel thick line (notice this has a different +number of arguments than the <a href="#fl_arc"><tt>fl_arc()</tt></a> described below. -<p>fl_pie draws a filled-in pie slice. This slice may extend outside -the line drawn by fl_arc, to avoid this use w-1 and h-1. +<p><tt>fl_pie()</tt> draws a filled-in pie slice. This slice may extend outside +the line drawn by <tt>fl_arc</tt>, to avoid this use <tt>w - 1</tt> and +<tt>h - 1</tt>. -<p>fl_chord is not yet implemented. +<p><tt>fl_chord()</tt> is not yet implemented. -</ul><hr><h3>Complex Shapes</h3> +<h3><a name="complex_shapes">Complex Shapes</a></h3> These functions let you draw arbitrary shapes with 2-D linear -transformations. The functionality matches PostScript. The exact -pixels filled in is less defined than for the above calls, so that FLTK -can take advantage of drawing hardware. (Both Xlib and MSWindows round -all the transformed verticies to integers before drawing the line -segments. This severely limits the accuracy of these functions for -complex graphics. Try using OpenGL instead) - -<p><i>All arguments are float.</i> +transformations. The functionality matches that found in Adobe® +PostScript<sup>TM</sup>. The exact pixels filled in is less defined +than for the above calls, so that FLTK can take advantage of drawing +hardware. The transformed vertices are rounded to integers before +drawing the line segments. This severely limits the accuracy of these +functions for complex graphics. Use OpenGL when greater accuracy +and/or performance is required. -</ul><h4><code>void fl_push_matrix(); -<br>void fl_pop_matrix();</code></h4><ul> +<h4>void fl_push_matrix()<br> +void fl_pop_matrix()</h4> Save and restore the current transformation. The maximum depth of the stack is 4. -</ul><h4><code>void fl_scale(x, y); -<br>void fl_scale(x); -<br>void fl_translate(x, y); -<br>void fl_rotate(d); -<br>void fl_mult_matrix(a, b, c, d, x, y);</code></h4><ul> +<h4>void fl_scale(float x, float y)<br> +void fl_scale(float x)<br> +void fl_translate(float x, float y)<br> +void fl_rotate(float d)<br> +void fl_mult_matrix(float a, float b, float c, float d, float x, float y)</h4> -Concat another transformation to the current one. The rotation angle -is in degrees (not radians) counter-clockwise. +Concatenate another transformation onto the current one. The rotation angle +is in degrees (not radians) and is counter-clockwise. -</ul><h4><code>void fl_begin_line(); -<br>void fl_end_line();</code></h4><ul> +<h4>void fl_begin_line()<br> +void fl_end_line()</h4> Start and end drawing 1-pixel thick lines. -</ul><h4><code>void fl_begin_loop(); -<br>void fl_end_loop();</code></h4><ul> +<h4>void fl_begin_loop()<br> +void fl_end_loop()</h4> Start and end drawing a closed sequence of 1-pixel thick lines. -</ul><h4><code>void fl_begin_polygon(); -<br>void fl_end_polygon();</code></h4><ul> +<h4>void fl_begin_polygon()<br> +void fl_end_polygon()</h4> Start and end drawing a convex filled polygon. -</ul><h4><code>void fl_begin_complex_polygon(); -<br>void fl_gap(); -<br>void fl_end_complex_polygon();</code></h4><ul> +<h4>void fl_begin_complex_polygon()<br> +void fl_gap()<br> +void fl_end_complex_polygon()</h4> Start and end drawing a complex filled polygon. This polygon may be concave, may have holes in it, or may be several disconnected pieces. -Call fl_gap() to seperate loops of the path (it is unnecessary but -harmless to call fl_gap() before the first vertex, after the last one, -or several times in a row). For portability, you should only draw -polygons that appear the same whether "even/odd" or "non-zero" -"winding rules" are used to fill them. This mostly means that holes -should be drawn in the opposite direction of the outside. +Call <tt>fl_gap()</tt> to seperate loops of the path (it is unnecessary +but harmless to call <tt>fl_gap()</tt> before the first vertex, after +the last one, or several times in a row). For portability, you should +only draw polygons that appear the same whether "even/odd" or +"non-zero" winding rules are used to fill them. This mostly means that +holes should be drawn in the opposite direction of the outside. -<p><i>fl_gap() should only be called between -fl_begin/end_complex_polygon(). To outline the polygon, use -fl_begin_loop() and replace each fl_gap() with -fl_end_loop();fl_begin_loop().</i> +<p><tt>fl_gap()</tt> should only be called between +<tt>fl_begin_complex_polygon()</tt> and +<tt>fl_end_complex_polygon()</tt>. To outline the polygon, use +<tt>fl_begin_loop()</tt> and replace each <tt>fl_gap()</tt> with +<tt>fl_end_loop();fl_begin_loop()<tt>. -</ul><h4><code>void fl_vertex(x, y);</code></h4><ul> +<h4>void fl_vertex(float x, float y)</h4> Add a single vertex to the current path. -</ul><h4><code>void fl_curve(int x,int y,int x1,int y1,int x2,int -y2,int x3,int y3);</code></h4><ul> +<h4>void fl_curve(float x, float y, float x1, float y1, float x2, float y2, float x3, float y3)</h4> Add a series of points on a Bezier curve to the path. The curve ends -(and two of the points) are at x,y and x3,y3. +(and two of the points) are at <tt>x,y</tt> and <tt>x3,y3</tt>. -</ul><h4><code>void fl_arc(x, y, r, start, end);</code></h4><ul> +<h4>void fl_arc(float x, float y, float r, float start, float end)</h4> Add a series of points to the current path on the arc of a circle (you can get elliptical paths by using scale and rotate before calling -this). <i>x,y</i> are the center of the circle, and <i>r</i> is it's -radius. fl_arc() takes <i>start</i> and <i>end</i> angles that are -measured in degrees counter-clockwise from 3 o'clock. If <i>end</i> -is less than <i>start</i> then it draws clockwise. +this). <tt>x,y</tt> are the center of the circle, and <tt>r</tt> is +its radius. <tt>fl_arc()</tt> takes <tt>start</tt> and <tt>end</tt> +angles that are measured in degrees counter-clockwise from 3 o'clock. +If <tt>end</tt> is less than <tt>start</tt> then it draws the arc in a +clockwise direction. -</ul><h4><code>void fl_circle(x, y, r);</code></h4><ul> +<h4>void fl_circle(float x, float y, float r)</h4> -fl_circle() is equivalent to fl_arc(...,0,360) but may be faster. It -must be the <i>only</i> thing in the path: if you want a circle as -part of a complex polygon you must use fl_arc(). <i>Under Xlib and -MSWindows this draws incorrectly if the transformation is both rotated -and non-square scaled.</i> +<tt>fl_circle()</tt> is equivalent to <tt>fl_arc(...,0,360)</tt> but +may be faster. It must be the <i>only</i> thing in the path: if you +want a circle as part of a complex polygon you must use +<tt>fl_arc()</tt>. <i>This draws incorrectly if the transformation is +both rotated and non-square scaled.</i> -</ul><hr><h3>Text</h3> +<h3><a name="text">Text</a></h3> -All text is drawn in the <a href=#fl_font>current font</a>. It is +All text is drawn in the <a href="#fl_font">current font</a>. It is undefined whether this location or the characters are modified by the current transformation. -</ul><h4><code>void fl_draw(const char*, float x, float y); -<br>void fl_draw(const char*, int n, float x, float y);</code></h4><ul> +<h4>void fl_draw(const char *, float x, float y)<br> +void fl_draw(const char *, int n, float x, float y)</h4> -Draw a null terminated string or an array of <i>n</i> characters +Draw a nul-terminated string or an array of <tt>n</tt> characters starting at the given location. -</ul><h4><code>void fl_draw(const char*, int x,int y,int w,int h, Fl_Align);</code></h4><ul> +<h4>void fl_draw(const char *, int x, int y, int w, int h, Fl_Align)</h4> Fancy string drawing function which is used to draw all the labels. The string is formatted and aligned inside the passed box. Handles '\t' and '\n', expands all other control characters to ^X, and aligns inside or against the edges of the box. See <a -href=Fl_Widget.html#align>Fl_Widget::align()</a> for values for -<i>align</i>. The value FL_ALIGN_INSIDE is ignored, this always -prints inside the box. +href="#Fl_Widget.align"><tt>Fl_Widget::align()</tt></a> for values for +<tt>align</tt>. The value <tt>FL_ALIGN_INSIDE</tt> is ignored, as this +function always prints inside the box. -</ul><h4><code>void fl_measure(const char*, int& w, int& h);</code></h4><ul> +<h4>void fl_measure(const char *, int &w, int &h)</h4> Measure how wide and tall the string will be when printed by the -fl_draw(...align) function. If the incoming w is non-zero it will -wrap to that width. +<tt>fl_draw(...align)</tt> function. If the incoming <tt>w</tt> is +non-zero it will wrap to that width. -</ul><h4><code>int fl_height();</code></h4><ul> +<h4>int fl_height()</h4> Recommended minimum line spacing for the current font. You can also -just use the value of <i>size</i> passed to <a -href=#fl_font>fl_font()</a>. +just use the value of <tt>size</tt> passed to <a href="#fl_font"> +<tt>fl_font()</tt></a>. -</ul><h4><code>int fl_descent();</code></h4><ul> +<h4>int fl_descent()</h4> -Recommended distance above the bottom of a fl_height() tall box to -draw the text at so it looks centered vertically in that box. +Recommended distance above the bottom of a <tt>fl_height()</tt> tall +box to draw the text at so it looks centered vertically in that box. -</ul><h4><code>float fl_width(const char*); -<br>float fl_width(const char*, int n); -<br>float fl_width(uchar);</code></h4><ul> +<h4>float fl_width(const char*)<br> +float fl_width(const char*, int n)<br> +float fl_width(uchar)</h4> -Return the width of a null-terminated string, a sequence of n -characters, and a single character. +Return the width of a nul-terminated string, a sequence of <tt>n</tt> +characters, or a single character. -</ul><h4><code>const char* fl_shortcut_label(ulong);</code></h4><ul> +<h4>const char *fl_shortcut_label(ulong)</h4> Unparse a shortcut value as used by <a -href=Fl_Button.html#shortcut>Fl_Button</a> or <a -href=Fl_Menu.html>Fl_Menu_Item</a> into a human-readable string like -"Alt+N". This only works if the shortcut is a character key or a -numbered Function key. If the shortcut is zero an empty string is -returned. The return value points at a static buffer that is +href="#Fl_Button.shortcut"><tt>Fl_Button</tt></a> or <a +href="#Fl_Menu_Item"><tt>Fl_Menu_Item</tt></a> into a human-readable +string like "Alt+N". This only works if the shortcut is a character +key or a numbered function key. If the shortcut is zero an empty +string is returned. The return value points at a static buffer that is overwritten with each call. -</ul><hr><h3>Fonts</h3> +<h3><a name="fonts">Fonts</a></h3> -</ul><h4><code>void fl_font(int face, int size);</code></h4><ul> +<h4><a name="fl_font">void fl_font(int face, int size)</a></h4> Set the current font, which is then used by the routines described above. You may call this outside a draw context if necessary to call -fl_width(), but on X this will open the display. +<tt>fl_width()</tt>, but on X this will open the display. -<p>The font is identified by a <i>face</i> and a <i>size</i>. The -size of the font is measured in <i>pixels</i> (ie. it is not -"resolution [in]dependent"). Lines should be spaced <i>size</i> +<p>The font is identified by a <tt>face</tt> and a <tt>size</tt>. The +size of the font is measured in <tt>pixels</tt> (i.e. it is not +"resolution [in]dependent"). Lines should be spaced <tt>size</tt> pixels apart (or more). -<p>The <i>face</i> is an index into an internal table. Initially only -the first 16 faces are filled in. There are symbolic names for them: -FL_HELVETICA, FL_TIMES, FL_COURIER, and modifier values FL_BOLD and -FL_ITALIC which can be added to these, and FL_SYMBOL and -FL_ZAPF_DINGBATS. Faces greater than 255 cannot be used in Fl_Widget -labels, since it stores the index as a byte. - -</ul><h4><code>int fl_font();<br> -int fl_size();</code></h4><ul> - -Returns the face and size set by the most recent fl_font(a,b). This -can be used to save/restore the font. - -</ul><h4><code>const char* Fl::get_font(int face);</code></h4><ul> - -Get the string for this face. This string is different for each face. -Under X this value is passed to XListFonts to get all the sizes of -this face. - -</ul><h4><code>const char* Fl::get_font_name(int face, int* attributes=0);</code></h4><ul> +<p>The <tt>face</tt> is an index into an internal table. Initially +only the first 16 faces are filled in. There are symbolic names for +them: <tt>FL_HELVETICA</tt>, <tt>FL_TIMES</tt>, <tt>FL_COURIER</tt>, +and modifier values <tt>FL_BOLD</tt> and <tt>FL_ITALIC</tt> which can +be added to these, and <tt>FL_SYMBOL</tt> and +<tt>FL_ZAPF_DINGBATS</tt>. Faces greater than 255 cannot be used in +<tt>Fl_Widget</tt> labels, since it stores the index as a byte. -Get a human-readable string describing the family of this face. This -is useful if you are presenting a choice to the user. There is no -guarantee that each face has a different name. The return value -points to a static buffer that is overwritten each call. +<h4>int fl_font()<br> +int fl_size()</h4> -<p>The integer pointed to by <i>attributes</i> (if the pointer is not -zero) is set to zero, <code>FL_BOLD</code>(1) or -<code>FL_ITALIC</code>(2) or <code>FL_BOLD|FL_ITALIC</code> (maybe -more attributes will be defined in the future). To locate a "family" -of fonts, search forward and back for a set with non-zero attributes, -these faces along with the face with a zero attribute before them -constitute a family. +Returns the face and size set by the most recent call to +<tt>fl_font(a,b)</tt>. This can be used to save/restore the font. -</ul><h4><code>int get_font_sizes(int face, int*& sizep);</code></h4><ul> +<h3><a name="cursor">Cursor</a></h3> -Return an array of sizes in <i>sizep</i>. The return value is the -length of this array. The sizes are sorted from smallest to largest -and indicate what sizes can be given to fl_font() that will be matched -exactly (fl_font() will pick the closest size for other sizes). A -zero in the first location of the array indicates a scalable font, -where any size works, although the array may list sizes that work -"better" than others. Warning: the returned array points at a static -buffer that is overwritten each call. Under X this will open the -display. - -</ul><h4><code>int Fl::set_font(int face, const char*);</code></h4><ul> - -Change a face. The string pointer is simply stored, the string is not -copied, so the string must be in static memory. - -</ul><h4><code>int Fl::set_font(int face, int from);</code></h4><ul> - -Copy one face to another. - -</ul><h4><code>int Fl::set_fonts(const char* = 0);</code></h4><ul> - -FLTK will open the display, and add every font on the server to the -face table. It will attempt to put "families" of faces together, so -that the normal one is first, followed by bold, italic, and bold -italic. - -<p>The optional argument is a string to describe the set of fonts to -add. Passing NULL will select only fonts that have the ISO8859-1 -character set (and are thus usable by normal text). Passing "-*" will -select all fonts with any encoding as long as they have normal X font -names with dashes in them. Passing "*" will list every font that -exists (on X this may produce some strange output). Other values may -be useful but are system dependent. On MSWindows NULL selects fonts -with ISO8859-1 encoding and non-NULL selects all fonts. - -<p>Return value is how many faces are in the table after this is done. - -</ul><hr><h2>Bitmaps, Pixmaps and Images</h2> - -<a href=images.html#direct>Click here for information on drawing images</a> - -</ul><hr><h3>Cursor</h3> - -</ul><h4><code>void fl_cursor(Fl_Cursor, Fl_Color=FL_WHITE, Fl_Color=FL_BLACK);</code></h4><ul> +<h4>void fl_cursor(Fl_Cursor, Fl_Color = FL_WHITE, Fl_Color = FL_BLACK)</h4> Change the cursor. Depending on the system this may affect the cursor everywhere, or only when it is pointing at the window that is current when you call this. For portability you should change the cursor back -to the default in response to FL_LEAVE events. +to the default in response to <tt>FL_LEAVE</tt> events. -<p>The type Fl_Cursor is an enumeration defined in <a -href=Enumerations.html><Enumerations.H></a>. The +<p>The type <tt>Fl_Cursor</tt> is an enumeration defined in <a +href="#enumerations"><tt><Enumerations.H></tt></a>. The double-headed arrows are bitmaps provided by FLTK on X, the others are provided by system-defined cursors. Under X you can get any XC_cursor -value by passing <code>Fl_Cursor((XC_foo/2)+1)</code>. - -<p><ul> -<li><code>FL_CURSOR_DEFAULT</code> (0) usually an arrow -<li><code>FL_CURSOR_ARROW</code> -<li><code>FL_CURSOR_CROSS</code> - crosshair -<li><code>FL_CURSOR_WAIT</code> - watch or hourglass -<li><code>FL_CURSOR_INSERT</code> - I-beam -<li><code>FL_CURSOR_HAND</code> - hand (uparrow on MSWindows) -<li><code>FL_CURSOR_HELP</code> - question mark -<li><code>FL_CURSOR_MOVE</code> - 4-pointed arrow -<li><code>FL_CURSOR_NS</code> - up/down arrow -<li><code>FL_CURSOR_WE</code> - left/right arrow -<li><code>FL_CURSOR_NWSE</code> - diagonal arrow -<li><code>FL_CURSOR_NESW</code> - diagonal arrow -<li><code>FL_CURSOR_NONE</code> - invisible -</ul> - -</ul><hr><h3>Overlay rectangle</h3> +value by passing <tt>Fl_Cursor((XC_foo/2)+1)</tt>. -</ul><h4><code>void fl_overlay_rect(int x, int y, int w, int h);<br> -void fl_overlay_clear();</code></h4><ul> +<p>The following standard cursors are available: -<p>Big kludge to draw interactive selection rectangles without using -the overlay. FLTK will xor a single rectangle outline over a window. -Calling this will erase any previous rectangle (by xor'ing it), and -then draw the new one. Calling fl_overlay_clear() will erase the -rectangle without drawing a new one. Using this is tricky. You -should make a widget with both a handle() and draw() method. draw() -should call fl_overlay_clear() before doing anything else. Your -handle() method should call window()->make_current() and then -fl_overlay_rect() after FL_DRAG events, and should call -fl_overlay_clear() after a FL_RELEASE event. +<ul> + <li><tt>FL_CURSOR_DEFAULT</tt> - the default cursor, usually an arrow + <li><tt>FL_CURSOR_ARROW</tt> - an arrow pointer + <li><tt>FL_CURSOR_CROSS</tt> - crosshair + <li><tt>FL_CURSOR_WAIT</tt> - watch or hourglass + <li><tt>FL_CURSOR_INSERT</tt> - I-beam + <li><tt>FL_CURSOR_HAND</tt> - hand (uparrow on MSWindows) + <li><tt>FL_CURSOR_HELP</tt> - question mark + <li><tt>FL_CURSOR_MOVE</tt> - 4-pointed arrow + <li><tt>FL_CURSOR_NS</tt> - up/down arrow + <li><tt>FL_CURSOR_WE</tt> - left/right arrow + <li><tt>FL_CURSOR_NWSE</tt> - diagonal arrow + <li><tt>FL_CURSOR_NESW</tt> - diagonal arrow + <li><tt>FL_CURSOR_NONE</tt> - invisible +</ul> -</ul><p><a href = index.html>(back to contents)</a> -</BODY> -</HTML> -<title>Drawing Images in FLTK</title> -<h2>Drawing Images in FLTK</h2> - -To draw images, you can either do it directly from data in your -memory, or you can create <a href=#Fl_Bitmap>Fl_Bitmap</a> or <a -href=#Fl_Image>Fl_Image</a> or <a href=#Fl_Pixmap>Fl_Pixmap</a> -objects. The advantage of drawing directly is that it is more -intuitive, and it is faster if the image data changes more often than -it is redrawn. The advantage of using the object is that FLTK will -cache translated forms of the image (on X it uses a server pixmap) and -thus redrawing it is <i>much</i> faster. - -<a name=direct> -<h2><hr>Direct Image Drawing<br> -#include <FL/fl_draw.H></h2> - -<p>It is undefined whether the location or drawing of the image is +<h3><a name="overlay">Overlays</a></h3> + +<h4>void fl_overlay_rect(int x, int y, int w, int h)<br> +void fl_overlay_clear()</h4> + +These functions allow you to draw interactive selection rectangles +without using the overlay hardware. FLTK will XOR a single rectangle +outline over a window. Calling this will erase any previous rectangle +(by XOR'ing it), and then draw the new one. Calling +<tt>fl_overlay_clear()</tt> will erase the rectangle without drawing a +new one. + +<p>Using this is tricky. You should make a widget with both a +<tt>handle()</tt> and <tt>draw()</tt> method. <tt>draw()</tt> should +call <tt>fl_overlay_clear()</tt> before doing anything else. Your +<tt>handle()</tt> method should call <tt>window()->make_current()</tt> +and then <tt>fl_overlay_rect()</tt> after <tt>FL_DRAG</tt> events, and +should call <tt>fl_overlay_clear()</tt> after a <tt>FL_RELEASE</tt> +event. + +<h2><a name="images">Images</a></h2> + +To draw images, you can either do it directly from data in your memory, +or you can create <a href="#Fl_Bitmap"><tt>Fl_Bitmap</tt></a>, <a +href="#Fl_Image"><tt>Fl_Image</tt></a>, or <a +href="#Fl_Pixmap"><tt>Fl_Pixmap</tt></a> objects. The advantage of +drawing directly is that it is more intuitive, and it is faster if the +image data changes more often than it is redrawn. The advantage of +using the object is that FLTK will cache translated forms of the image +(on X it uses a server pixmap) and thus redrawing is <i>much</i> +faster. + +<h3>Direct Image Drawing</h3> + +It is undefined whether the location or drawing of the image is affected by the current transformation, so you should only call these when it is the identity. -<p><i>All untyped arguments are integers.</i> - -</ul><h4><code> -void fl_draw_bitmap(const uchar*, X, Y, W, H, LD = 0);</code></h4><ul> +<h4>void fl_draw_bitmap(const uchar *, int X, int Y, int W, int H, int LD = 0)</h4> This function is planned but not yet implemented (it may be impossible under X without allocating a pixmap). -<a name=fl_draw_image> -</ul><h4><code> -void fl_draw_image(const uchar*, X, Y, W, H, D = 3, LD = 0);<br> -void fl_draw_image_mono(const uchar*, X, Y, W, H, D = 1, LD = 0); -</code></h4><ul> - -Draw an 8-bit per color rgb image. The pointer points at the "r" data -of the top-left pixel. Data must be in r,g,b order. X, Y are where -to put the top-left corner. W and H define the size of the image. D -is the delta to add to the pointer between pixels, it may be any value -greater or equal to 3, or it can be negative to flip the image -horizontally. LD is the delta to add to the pointer between lines (if -0 is passed it uses W*D), and may be larger than W*D to crop data, or -negative to flip the image vertically. +<h4>void fl_draw_image(const uchar *, int X, int Y, int W, int H, int D = 3, int LD = 0)<br> +void fl_draw_image_mono(const uchar *, int X, int Y, int W, int H, int D = 1, int LD = 0)</h4> + +Draw an 8-bit per color RGB or luminance image. The pointer points at +the "r" data of the top-left pixel. Data must be in <tt>r,g,b</tt> +order. <tt>X,Y</tt> are where to put the top-left corner. <tt>W</tt> +and <tt>H</tt> define the size of the image. <tt>D</tt> is the delta +to add to the pointer between pixels, it may be any value greater or +equal to <tt>3</tt>, or it can be negative to flip the image +horizontally. <tt>LD</tt> is the delta to add to the pointer between +lines (if 0 is passed it uses <tt>W * D</tt>), and may be larger than +<tt>W * D</tt> to crop data, or negative to flip the image vertically. <p>It is highly recommended that you put the following code before the -first show() of <i>any</i> window in your program to get rid of the -dithering if possible: +first <tt>show()</tt> of <i>any</i> window in your program to get rid +of the dithering if possible: -<ul><p><code>Fl::visual(FL_RGB)</code></ul> +<ul><pre> +Fl::visual(FL_RGB); +</pre></ul> -<p>Gray scale (1-channel) images may be drawn. This is done if abs(D) -is less than 3, or by calling <code>fl_draw_image_mono</code>. Only -one 8-bit sample is used for each pixel, and (on screens with -different numbers of bits for red, green, and blue) only gray colors -are used. Setting D greater than 1 will let you display one channel -of a color image. +Gray scale (1-channel) images may be drawn. This is done if +<tt>abs(D)</tt> is less than 3, or by calling +<tt>fl_draw_image_mono()</tt>. Only one 8-bit sample is used for each +pixel, and on screens with different numbers of bits for red, green, +and blue only gray colors are used. Setting <tt>D</tt> greater than 1 +will let you display one channel of a color image. <p><i>The X version does not support all possible visuals.</i> If FLTK cannot draw the image in the current visual it will abort. FLTK supports any visual of 8 bits or less, and all common TrueColor visuals up to 32 bits. -</ul><h4><code> -typedef void (*fl_draw_image_cb)(void*, x, y, w, uchar*);<br> -void fl_draw_image(fl_draw_image_cb, void*, X, Y, W, H, D = 3);<br> -void fl_draw_image_mono(fl_draw_image_cb, void*, X, Y, W, H, D = 1); -</code></h4><ul> +<h4>typedef void (*fl_draw_image_cb)(void *, int x, int y, int w, uchar *)<br> +void fl_draw_image(fl_draw_image_cb, void *, int X, int Y, int W, int H, int D = 3)<br> +void fl_draw_image_mono(fl_draw_image_cb, void *, int X, int Y, int W, int H, int D = 1)</h4> Call the passed function to provide each scan line of the image. This lets you generate the image as it is being drawn, or do arbitrary decompression of stored data (provided it can be decompressed to individual scan lines easily). -<p>The callback is called with the void* user data pointer (this can -be used to point at a structure of information about the image), and -the x, y, and w of the scan line desired from the image. 0,0 is the -upper-left corner (<i>not X,Y</i>). A pointer to a buffer to put the -data into is passed. You must copy w pixels from scanline y, starting -at pixel x, to this buffer. - -<p>Due to cropping, less than the whole image may be requested. So x -may be greater than zero, the first y may be greater than zero, and w -may be less than W. The buffer is long enough to store the entire W*D -pixels, this is for convienence with some decompression schemes where -you must decompress the entire line at once: decompress it into the -buffer, and then if x is not zero, memcpy the data over so the x'th +<p>The callback is called with the <tt>void *</tt> user data pointer +(this can be used to point at a structure of information about the +image), and the <tt>x</tt>, <tt>y</tt>, and <tt>w</tt> of the scan line +desired from the image. 0,0 is the upper-left corner (<i>not +<tt>X,Y</tt></i>). A pointer to a buffer to put the data into is +passed. You must copy <tt>w</tt> pixels from scanline <tt>y</tt>, +starting at pixel <tt>x</tt>, to this buffer. + +<p>Due to cropping, less than the whole image may be requested. So +<tt>x</tt> may be greater than zero, the first <tt>y</tt> may be +greater than zero, and <tt>w</tt> may be less than <tt>W</tt>. The +buffer is long enough to store the entire <tt>W * D</tt> pixels, this +is for convienence with some decompression schemes where you must +decompress the entire line at once: decompress it into the buffer, and +then if <tt>x</tt> is not zero, copy the data over so the <tt>x</tt>'th pixel is at the start of the buffer. -<p>You can assumme the y's will be consecutive, except the first one +<p>You can assumme the <tt>y</tt>'s will be consecutive, except the first one may be greater than zero. -<p>If D is 4 or more, you must fill in the unused bytes with zero. +<p>If <tt>D</tt> is 4 or more, you must fill in the unused bytes with zero. -</ul><h4><code> -int fl_draw_pixmap(char** data, X, Y, Fl_Color=FL_GRAY);</code></h4><ul> +<h4>int fl_draw_pixmap(char **data, int X, int Y, Fl_Color = FL_GRAY)</h4> Draw XPM image data, with the top-left corner at the given position. The images is dithered on 8-bit displays so you won't lose color space for programs displaying both images and pixmaps. This function -returns zero if there was any error decoding the xpm data. +returns zero if there was any error decoding the XPM data. -<p>To use an XPM, do "<code>#include "foo.xpm"</code>" and then -"<code>fl_draw_pixmap(foo, X, Y)</code>". +<p>To use an XPM, do: -<p>In the current version the XPM data is converted to 8-bit full -color and passed through fl_draw_image(). This is obviously not the -most efficient way to do it, and has the same visual limitations as -listed above for fl_draw_image(). Transparent colors are replaced by -the optional Fl_Color argument (this may change in the future). +<ul><pre> +#include "foo.xpm" +... +fl_draw_pixmap(foo, X, Y); +</pre></ul> -<p><a href=xpm.html>FLTK supports some (questionable) enhancements to -the XPM format.</a> +In the current version the XPM data is converted to 8-bit full color +and passed through <tt>fl_draw_image()</tt>. This is obviously not the +most efficient way to do it, and has the same visual limitations as +listed above for <tt>fl_draw_image()</tt>. Transparent colors are +replaced by the optional <tt>Fl_Color</tt> argument (this may change in +the future). -</ul><h4><code> -int fl_measure_pixmap(char** data, int &w, int -&h);</code></h4><ul> +<h4>int fl_measure_pixmap(char **data, int &w, int &h)</h4> -An XPM image contains the dimensions in it's data. This function +An XPM image contains the dimensions in its data. This function finds and returns the width and height. The return value is non-zero if it parsed the dimensions ok, and zero if there is any problem. -</ul> - -<a name=Fl_Bitmap> -<h2><hr>class Fl_Bitmap -<br>#include <FL/Fl_Bitmap.H></h2> +<h3><a name="Fl_Bitmap">class Fl_Bitmap</a></h3> -This object encapsulates the width, height, and bits of an Xbitmap -(XBM), and allows you to make an Fl_Widget use a bitmap as a label, or -to just draw the bitmap directly. <i>Under X it will create an +This object encapsulates the width, height, and bits of an X bitmap +(XBM), and allows you to make an <tt>Fl_Widget</tt> use a bitmap as a +label, or to just draw the bitmap directly. Under X it will create an offscreen pixmap the first time it is drawn, and copy this each -subsequent time it is drawn</i>. +subsequent time it is drawn. -<h4><code>Fl_Bitmap(const char *bits, int W, int H); -<br>Fl_Bitmap(const uchar *bits, int W, int H);</code></h4> +<h4>Fl_Bitmap(const char *bits, int W, int H)<br> +Fl_Bitmap(const uchar *bits, int W, int H)</h4> -Construct from an Xbitmap. The bits pointer is simply copied to the -object, so it must point at persistent storage. I provide two -constructors because various X implementations disagree about the type -of bitmap data. To use an XBM file, -<code>#include "foo.xbm"</code>, and then do "<code>new -Fl_Bitmap(foo_bits,foo_width,foo_height)</code>" +Construct using an X bitmap. The bits pointer is simply copied to the +object, so it must point at persistent storage. The two constructors +are provided because various X implementations disagree about the type +of bitmap data. To use an XBM file use: + +<ul><pre> +#include "foo.xbm" +... +Fl_Bitmap bitmap = new Fl_Bitmap(foo_bits, foo_width, foo_height); +</pre></ul> -<h4><code>~Fl_Bitmap()</code></h4> +<h4>~Fl_Bitmap()</h4> The destructor will destroy any X pixmap created. It does not do anything to the bits data. -<h4><code>void draw(int x, int y, int w, int h, int ox=0, int oy=0);</code></h4> +<h4>void draw(int x, int y, int w, int h, int ox = 0, int oy = 0)</h4> -<i>x,y,w,h</i> indicates a destination rectangle. <i>ox,oy,w,h</i> is -a source rectangle. This source rectangle from the bitmap is drawn in -the destination. 1 bits are drawn with the current color, 0 bits are -unchanged. The source rectangle may extend outside the bitmap (i.e. ox -and oy may be negative and w and h may be bigger than the bitmap) and -this area is left unchanged. +<tt>x,y,w,h</tt> indicates a destination rectangle. <tt>ox,oy,w,h</tt> +is a source rectangle. This source rectangle from the bitmap is drawn +in the destination. 1 bits are drawn with the current color, 0 bits +are unchanged. The source rectangle may extend outside the bitmap +(i.e. <tt>ox</tt> and <tt>oy</tt> may be negative and <tt>w</tt> and +<tt>h</tt> may be bigger than the bitmap) and this area is left +unchanged. -<h4><code>void draw(int x, int y);</code></h4> +<h4>void draw(int x, int y)</h4> -Draws the bitmap with the upper-left corner at <i>x,y</i>. This is -the same as doing <code>draw(x,y,this->w,this->h,0,0)</code>. +Draws the bitmap with the upper-left corner at <tt>x,y</tt>. This is +the same as doing <tt>draw(x,y,this->w,this->h,0,0)</tt>. -<h4><code>void label(Fl_Widget *);</code></h4> +<h4>void label(Fl_Widget *)</h4> -Change the label() and the labeltype() of the widget to draw the -bitmap. 1 bits will be drawn with the labelcolor(), zero bits will be -unchanged. You can use the same bitmap for many widgets. +Change the <tt>label()</tt> and the <tt>labeltype()</tt> of the widget +to draw the bitmap. 1 bits will be drawn with the +<tt>labelcolor()</tt>, zero bits will be unchanged. You can use the +same bitmap for many widgets. -<a name=Fl_Pixmap> -<h2><hr>class Fl_Pixmap -<br>#include <FL/Fl_Pixmap.H></h2> + +<h2><a name="Fl_Pixmap">class Fl_Pixmap</h2> This object encapsulates the data from an XPM image, and allows you to -make an Fl_Widget use a pixmap as a label, or to just draw the pixmap -directly. <i>Under X it will create an offscreen pixmap the first -time it is drawn, and copy this each subsequent time it is drawn</i>. +make an <tt>Fl_Widget</tt> use a pixmap as a label, or to just draw the +pixmap directly. <i>Under X it will create an offscreen pixmap the +first time it is drawn, and copy this each subsequent time it is +drawn</i>. <p>The current implementation converts the pixmap to 8 bit color data -and uses <a href=#fl_draw_image>fl_draw_image()</a> to draw +and uses <a href="#fl_draw_image"><tt>fl_draw_image()</tt></a> to draw it. Thus you will get dithered colors on an 8 bit screen. -<h4><code>Fl_Pixmap(char * const * data);</code></h4> +<h4>Fl_Pixmap(char *const* data)</h4> + +Construct using XPM data. The data pointer is simply copied to the +object, so it must point at persistent storage. To use an XPM file do: -Construct from XPM data. The data pointer is simply copied to the -object, so it must point at persistent storage. To use an XPM file, -<code>#include "foo.xpm"</code>, and then do "<code>new -Fl_Pixmap(foo)</code>" +<ul><pre> +#include <FL/Fl_Pixmap.H> +#include "foo.xpm" +... +Fl_Pixmap pixmap = new Fl_Pixmap(foo); +</ul></pre> -<h4><code>~Fl_Pixmap()</code></h4> +<h4>~Fl_Pixmap()</h4> The destructor will destroy any X pixmap created. It does not do anything to the data. -<h4><code>void draw(int x, int y, int w, int h, int ox=0, int oy=0);</code></h4> +<h4>void draw(int x, int y, int w, int h, int ox = 0, int oy = 0)</h4> -<i>x,y,w,h</i> indicates a destination rectangle. <i>ox,oy,w,h</i> is -a source rectangle. This source rectangle is copied to the -destination. The source rectangle may extend outside the pixmap -(i.e. ox and oy may be negative and w and h may be bigger than the -pixmap) and this area is left unchanged. +<tt>x,y,w,h</tt> indicates a destination rectangle. <tt>ox,oy,w,h</tt> +is a source rectangle. This source rectangle is copied to the +destination. The source rectangle may extend outside the pixmap (i.e. +<tt>ox</tt> and <tt>oy</tt> may be negative and <tt>w</tt> and +<tt>h</tt> may be bigger than the pixmap) and this area is left +unchanged. -<h4><code>void draw(int x, int y);</code></h4> +<h4>void draw(int x, int y)</h4> -Draws the image with the upper-left corner at <i>x,y</i>. This is -the same as doing <code>draw(x,y,this->w,this->h,0,0)</code>. +Draws the image with the upper-left corner at <tt>x,y</tt>. This is +the same as doing <tt>draw(x,y,this->w,this->h,0,0)</tt>. -<h4><code>void label(Fl_Widget *);</code></h4> +<h4>void label(Fl_Widget *)</h4> -Change the label() and the labeltype() of the widget to draw the -pixmap. You can use the same pixmap for many widgets. +Change the <tt>label()</tt> and the <tt>labeltype()</tt> of the widget +to draw the pixmap. You can use the same pixmap for many widgets. -<a name=Fl_Image> -<h2><hr>class Fl_Image -<br>#include <FL/Fl_Image.H></h2> -This object encapsulates a full-color RGB image, and allows you to -make an Fl_Widget use a Image as a label, or to just draw the Image -directly. <i>Under X it will create an offscreen pixmap the first -time it is drawn, and copy this each subsequent time it is drawn</i>. +<H3><a name="Fl_Image">class Fl_Image</a></H3> -<p>See <a href=#fl_draw_image>fl_draw_image()</a> for what -happens. On 8 bit screens dithering is used. +This object encapsulates a full-color RGB image, and allows you to make +an <tt>Fl_Widget</tt> use an image as a label, or to just draw the +image directly. <i>Under X it will create an offscreen pixmap the +first time it is drawn, and copy this each subsequent time it is +drawn</i>. -<h4><code>Fl_Image(char uchar *data, int W, int H, int D=3, int LD=0);</code></h4> +<h4>Fl_Image(char uchar *data, int W, int H, int D = 3, int LD = 0)</h4> -Construct from a pointer to RGB data. W and H are the size of the -image in pixels. D is the delta between pixels (it may be more than 3 -to skip alpha or other data, or negative to flip the image -left/right). LD is the delta between lines (it may be more than D*W -to crop images, or negative to flip the image vertically). The data -pointer is simply copied to the object, so it must point at persistent -storage. +Construct using a pointer to RGB data. <tt>W</tt> and <tt>H</tt> are +the size of the image in pixels. <tt>D</tt> is the delta between +pixels (it may be more than 3 to skip alpha or other data, or negative +to flip the image left/right). <tt>LD</tt> is the delta between lines +(it may be more than <tt>D * W</tt> to crop images, or negative to flip +the image vertically). The data pointer is simply copied to the +object, so it must point at persistent storage. -<h4><code>~Fl_Image()</code></h4> +<h4>~Fl_Image()</h4> The destructor will destroy any X pixmap created. It does not do anything to the data. -<h4><code>void draw(int x, int y, int w, int h, int ox=0, int oy=0);</code></h4> - -<i>x,y,w,h</i> indicates a destination rectangle. <i>ox,oy,w,h</i> is -a source rectangle. This source rectangle is copied to the -destination. The source rectangle may extend outside the image -(i.e. ox and oy may be negative and w and h may be bigger than the -image) and this area is left unchanged. - -<h4><code>void draw(int x, int y);</code></h4> - -Draws the image with the upper-left corner at <i>x,y</i>. This is -the same as doing <code>draw(x,y,this->w,this->h,0,0)</code>. - -<h4><code>void label(Fl_Widget *);</code></h4> - -Change the label() and the labeltype() of the widget to draw the -Image. You can use the same Image for many widgets. - -<p><a href = index.html>(back to contents)</a> -<title>FLTK enhancements to the XPM format</title> -<h2>FLTK enhancements to the XPM format</h2> - -<p>I made some additions to XPM that may be good, or intensely -disliked by X purists. I do not know if the changes are compatable -with current XPM. - -<p>The change was to make a "compressed colormap" that avoids -XParseColor(), and gives the actual color values (which is really what -everybody wants!). Only colormaps of this form, and ones where the -colors are named as "#rrggbb", will be portable to non-X platforms. - -<p>A compressed colormap is indicated by the number of colors being -negative. The colormap is then given as an array of 4*numcolors -characters. Each color is described by 4 characters: the index -character, and the red, green, and blue value (for 2-character indexes -each color needs 5 characters). - -<p>XPM files support a single transparent index. I require this index -to be ' ' (space). To indicate that ' ' is transparent, it should be -first in the color table. To make ' ' not be transparent, put it -somewhere other than first in the table. - -<p>To make the XPM files easily parseable, but still portable to most -C compilers, I suggest the following format: - -<pre> -/* XPM */ -static char * name[] = { -/* width height ncolors chars_per_pixel */ -"64 64 -4 1 ", -/* colormap */ -"\ - \x50\x50\x80\ -.\xff\xff\x00\ -r\xff\x00\x00\ -b\x00\x00\x00", -/* pixels */ -" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ", -" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ", -" bb............................................bb ", -... -</pre> - -<p>All lines starting with "/*" are optional. Parsers should handle -'\' at the end of the line and \xNN and \NNN characters. This -requires the C compiler to parse \xNN characters. -<HTML> -<BODY> - -<H1>Chapter XXX - Drawing Things in FLTK</H1> - -<h2>When can you draw things in FLTK?</h2> - -There are only certain places you can execute drawing code in FLTK. -Calling these functions at other places will result in undefined -behavior! - -<ul> - -<li>The most common is inside the virtual method <a -href=subclass.html#draw>Fl_Widget::draw()</a>. To write code here, -you must subclass one of the existing Fl_Widget classes and implement -your own version of draw(). - -<p> +<h4>void draw(int x, int y, int w, int h, int ox = 0, int oy = 0)</h4> -<li>You can also write <a href=Boxtypes.html>boxtypes</a> and <a href -= Labeltypes.html>labeltypes</a>. These are small procedures that can be -called by existing Fl_Widget draw() methods. These "types" are -identified by an 8-bit index that is stored in the widget's box(), -labeltype(), and possibly other properties. - -<p> - -<li>You can call <a -href=Fl_Window.html#make_current>Fl_Window::make_current()</a> to do -incremental update of a widget (use <a -href=Fl_Widget.html#window>Fl_Widget::window()</a> to find the -window). <i>Under X this only works for the base Fl_Window class, not -for double buffered, overlay, or OpenGL windows!</i> - -</ul> - -</ul><h2>FLTK Drawing functions<br>#include <FL/fl_draw.H></h2> - -<ul> -<li><a href=#clipping>Clipping</a> -<li><a href=#color>Colors</a> -<li><a href=#fast>Fast Shapes</a> -<li><a href=#vertex>Complex Shapes</a> -<li><a href=#text>Text</a> -<li><a href=images.html>Images</a> -<li><a href=#cursor>Cursor</a> -<li><a href=#overlay>Overlay</a> -<li><a href=Fl_Gl_Window.html#gl_start>Using OpenGL</a> -</ul> - -</ul><hr><h3>Clipping</h3> - -<p>You can limit all your drawing to a rectangular region by calling -fl_clip, and put the drawings back by using fl_pop_clip. This -rectangle is measured in pixels (it is unaffected by the current -transformation matrix). - -<p>In addition, the system may provide clipping when updating windows, -this clip region may be more complex than a simple rectangle. - -</ul><h4><code>void fl_clip(int x, int y, int w, int h);</code></h4><ul> - -Intesect the current clip region with a rectangle and push this new -region onto the stack. - -</ul><h4><code>void fl_pop_clip();</code></h4><ul> - -Restore the previous clip region. <i>You must call fl_pop_clip() once -for every time you call fl_clip(). If you return to FLTK with the -clip stack not empty unpredictable results occur.</i> - -</ul><h4><code>int fl_not_clipped(int x, int y, int w, int h);</code></h4><ul> - -Returns true if any of the rectangle intersects the current clip -region. If this returns false you don't have to draw the object. -<i>On X this returns 2 if the rectangle is partially clipped, and 1 if -it is entirely inside the clip region</i>. - -</ul><h4><code>int fl_clip_box(int x, int y, int w, int h,<br> -    int& X, int& Y, int& W, int& H);</code></h4><ul> - -Intersect the rectangle x,y,w,h with the current clip region and -returns the bounding box of the result in X,Y,W,H. Returns non-zero -if the resulting rectangle is different than the original. This can -be used to limit the necessary drawing to a rectangle. W and H are set to -zero if the rectangle is completely outside the region. - -</ul><hr><h3>Colors</h3> - -</ul><h4><code>void fl_color(Fl_Color);</code></h4><ul> - -<p>Set the color for all subsequent drawing operations. Fl_Color is -an enumeration type, all values are in the range 0-255. This is -<i>not</i> the X pixel, it is an internal table! The table provides -several general colors, a 24-entry gray ramp, and a 5x8x5 color cube. -All of these are named with poorly-documented symbols in <a -href=Enumerations.html><FL/Enumerations.H></a>. - -<p><i>Under X, a color cell will be allocated out of fl_colormap each -time you request an fl_color the first time. If the colormap fills up -then a least-squares algorithim is used to find the closest color.</i> - -</ul><h4><code>Fl_Color fl_color();</code></h4><ul> - -Returns the last fl_color() that was set. This can be used for state -save/restore. - -</ul><h4><code>void Fl::set_color(Fl_Color, uchar r, uchar g, uchar b); -<br>void Fl::get_color(Fl_Color, uchar &, uchar &, uchar &);</code></h4><ul> - -Set or get an entry in the fl_color index table. You can set it to -any 8-bit rgb color. <i>On X, if the index has been requested before, -the pixel is free'd. No pixel is allocated until fl_color(i) is used -again, and there is no guarantee that the same pixel will be used next -time.</i> - -</ul><h4><code>void fl_color(uchar r, uchar g, uchar -b);</code></h4><ul> - -<p>Set the color for all subsequent drawing operations. The closest -possible match to the rgb color is used. <i>Under X this works -perfectly for TrueColor visuals. For colormap visuals the nearest index -in the gray ramp or color cube is figured out, and fl_color(i) is done -with that, this can result in two approximations of the color and is -very inaccurate!</i> - -</ul><hr><h3>Fast Shapes</h3> - -These are used to draw almost all the FLTK widgets. They draw on -exact pixel boundaries and are as fast as possible, and their behavior -will be duplicated exactly on any platform FLTK is ported to. It is -undefined whether these are affected by the <a -href=#vertex>transformation matrix</a>, so you should only call these -while it is the identity. - -<p><i>All arguments are integers.</i> - -</ul><h4><code>void fl_rectf(x, y, w, h);</code></h4><ul> - -Color a rectangle that exactly fills the given bounding box. - -</ul><h4><code>void fl_rectf(x, y, w, h, uchar r, uchar g, uchar b);</code></h4><ul> - -Color a rectangle with "exactly" the passed r,g,b color. On screens -with less than 24 bits of color this is done by drawing a -solid-colored block using <a -href=images.html#fl_draw_image>fl_draw_image()</a> so that dithering -is produced. If you have 24 bit color, this fills the rectangle with a -single pixel value and is about 1 zillion times faster. - -</ul><h4><code>void fl_rect(x, y, w, h);</code></h4><ul> - -Draw a 1-pixel border <i>inside</i> this bounding box. - -</ul><h4><code>void fl_line(x, y, x1, y1); -<br>void fl_line(x, y, x1, y1, x2, y2);</code></h4><ul> - -Draw one or two 1-pixel thick lines between the given points. - -</ul><h4><code>void fl_loop(x, y, x1, y1, x2, y2); -<br>void fl_loop(x, y, x1, y1, x2, y2, x3, y3); -</code></h4><ul> - -Outline a 3 or 4-sided polygon with 1-pixel thick lines. - -</ul><h4><code>void fl_polygon(x, y, x1, y1, x2, y2); -<br>void fl_polygon(x, y, x1, y1, x2, y2, x3, y3); -</code></h4><ul> - -Fill a 3 or 4-sided polygon. The polygon must be convex. +<tt>x,y,w,h</tt> indicates a destination rectangle. <tt>ox,oy,w,h</tt> +is a source rectangle. This source rectangle is copied to the +destination. The source rectangle may extend outside the image (i.e. +<tt>ox</tt> and <tt>oy</tt> may be negative and <tt>w</tt> and +<tt>h</tt> may be bigger than the image) and this area is left +unchanged. -</ul><h4><code>void fl_xyline(x, y, x1, y1); -<br>void fl_xyline(x, y, x1, y1, x2); -<br>void fl_xyline(x, y, x1, y1, x2, y3); -</code></h4><ul> - -Draw 1-pixel wide horizontal and vertical lines. A horizontal line is -drawn first, then a vertical, then a horizontal. - -</ul><h4><code>void fl_yxline(x, y, y1); -<br>void fl_yxline(x, y, y1, x2); -<br>void fl_yxline(x, y, y1, x2, y3); -</code></h4><ul> - -Draw 1-pixel wide vertical and horizontal lines. A vertical line is -drawn first, then a horizontal, then a vertical. - -</ul><h4><code> -void fl_arc(x, y, w, h, double a1, double a2);<br> -void fl_pie(x, y, w, h, double a1, double a2);<br> -void fl_chord(x, y, w, h, double a1, double a2);</code></h4><ul> - -High-speed ellipse sections. These functions match the rather limited -circle drawing code provided by X and MSWindows. The advantage over using <a -href=#fl_arc>fl_arc</a> is that they are faster because they often use -the hardware, and they draw much nicer small circles, since the small -sizes are often hard-coded bitmaps. - -<p>If a complete circle is drawn it will fit inside the passed -bounding box. The two angles are measured in degrees counterclockwise -from 3'oclock and are the starting and ending angle of the arc, a2 -must be greater or equal to a1. - -<p>fl_arc draws a 1-pixel thick line (notice this has a different -number of arguments than the <a href=#fl_arc>fl_arc</a> described -below. - -<p>fl_pie draws a filled-in pie slice. This slice may extend outside -the line drawn by fl_arc, to avoid this use w-1 and h-1. - -<p>fl_chord is not yet implemented. - -</ul><hr><h3>Complex Shapes</h3> - -These functions let you draw arbitrary shapes with 2-D linear -transformations. The functionality matches PostScript. The exact -pixels filled in is less defined than for the above calls, so that FLTK -can take advantage of drawing hardware. (Both Xlib and MSWindows round -all the transformed verticies to integers before drawing the line -segments. This severely limits the accuracy of these functions for -complex graphics. Try using OpenGL instead) - -<p><i>All arguments are float.</i> - -</ul><h4><code>void fl_push_matrix(); -<br>void fl_pop_matrix();</code></h4><ul> - -Save and restore the current transformation. The maximum depth of the -stack is 4. - -</ul><h4><code>void fl_scale(x, y); -<br>void fl_scale(x); -<br>void fl_translate(x, y); -<br>void fl_rotate(d); -<br>void fl_mult_matrix(a, b, c, d, x, y);</code></h4><ul> - -Concat another transformation to the current one. The rotation angle -is in degrees (not radians) counter-clockwise. - -</ul><h4><code>void fl_begin_line(); -<br>void fl_end_line();</code></h4><ul> - -Start and end drawing 1-pixel thick lines. - -</ul><h4><code>void fl_begin_loop(); -<br>void fl_end_loop();</code></h4><ul> - -Start and end drawing a closed sequence of 1-pixel thick lines. - -</ul><h4><code>void fl_begin_polygon(); -<br>void fl_end_polygon();</code></h4><ul> - -Start and end drawing a convex filled polygon. - -</ul><h4><code>void fl_begin_complex_polygon(); -<br>void fl_gap(); -<br>void fl_end_complex_polygon();</code></h4><ul> - -Start and end drawing a complex filled polygon. This polygon may be -concave, may have holes in it, or may be several disconnected pieces. -Call fl_gap() to seperate loops of the path (it is unnecessary but -harmless to call fl_gap() before the first vertex, after the last one, -or several times in a row). For portability, you should only draw -polygons that appear the same whether "even/odd" or "non-zero" -"winding rules" are used to fill them. This mostly means that holes -should be drawn in the opposite direction of the outside. - -<p><i>fl_gap() should only be called between -fl_begin/end_complex_polygon(). To outline the polygon, use -fl_begin_loop() and replace each fl_gap() with -fl_end_loop();fl_begin_loop().</i> - -</ul><h4><code>void fl_vertex(x, y);</code></h4><ul> - -Add a single vertex to the current path. - -</ul><h4><code>void fl_curve(int x,int y,int x1,int y1,int x2,int -y2,int x3,int y3);</code></h4><ul> - -Add a series of points on a Bezier curve to the path. The curve ends -(and two of the points) are at x,y and x3,y3. - -</ul><h4><code>void fl_arc(x, y, r, start, end);</code></h4><ul> - -Add a series of points to the current path on the arc of a circle (you -can get elliptical paths by using scale and rotate before calling -this). <i>x,y</i> are the center of the circle, and <i>r</i> is it's -radius. fl_arc() takes <i>start</i> and <i>end</i> angles that are -measured in degrees counter-clockwise from 3 o'clock. If <i>end</i> -is less than <i>start</i> then it draws clockwise. - -</ul><h4><code>void fl_circle(x, y, r);</code></h4><ul> - -fl_circle() is equivalent to fl_arc(...,0,360) but may be faster. It -must be the <i>only</i> thing in the path: if you want a circle as -part of a complex polygon you must use fl_arc(). <i>Under Xlib and -MSWindows this draws incorrectly if the transformation is both rotated -and non-square scaled.</i> - -</ul><hr><h3>Text</h3> - -All text is drawn in the <a href=#fl_font>current font</a>. It is -undefined whether this location or the characters are modified by the -current transformation. - -</ul><h4><code>void fl_draw(const char*, float x, float y); -<br>void fl_draw(const char*, int n, float x, float y);</code></h4><ul> - -Draw a null terminated string or an array of n characters in the -current font, starting at the given location. - -</ul><h4><code>void fl_draw(const char*, int x,int y,int w,int h, Fl_Align);</code></h4><ul> - -Fancy string drawing function which is used to draw all the labels. -The string is formatted and aligned inside the passed box. Handles -'\t' and '\n', expands all other control characters to ^X, and aligns -inside or against the edges of the box. See <a -href=Fl_Widget.html#align>Fl_Widget::align()</a> for values for -<i>align</i>. The value FL_ALIGN_INSIDE is ignored, this always -prints inside the box. - -</ul><h4><code>void fl_measure(const char*, int& w, int& h);</code></h4><ul> - -Measure how wide and tall the string will be when printed by the -fl_draw(...align) function. If the incoming w is non-zero it will -wrap to that width. - -</ul><h4><code>int fl_height();</code></h4><ul> - -Recommended minimum line spacing for the current font. You can also -just use the value of <i>size</i> passed to <a -href=#fl_font>fl_font()</a>. - -</ul><h4><code>int fl_descent();</code></h4><ul> - -Recommended distance above the bottom of a fl_height() tall box to -draw the text at so it looks centered vertically in that box. - -</ul><h4><code>float fl_width(const char*); -<br>float fl_width(const char*, int n); -<br>float fl_width(uchar);</code></h4><ul> - -Return the width of a null-terminated string, a sequence of n -characters, and a single character. - -</ul><h4><code>const char* fl_shortcut_label(ulong);</code></h4><ul> - -Unparse a shortcut value as used by <a -href=Fl_Button.html#shortcut>Fl_Button</a> or <a -href=Fl_Menu.html>Fl_Menu_Item</a> into a human-readable string like -"Alt+N". This only works if the shortcut is a character key or a -numbered Function key. If the shortcut is zero an empty string is -returned. The return value points at a static buffer that is -overwritten with each call. - -</ul><hr><h3>Fonts</h3> - -</ul><h4><code>void fl_font(int face, int size);</code></h4><ul> - -Set the current font, which is then used by the routines described -above. You may call this outside a draw context if necessary to call -fl_width(), but on X this will open the display. - -<p>The font is identified by a <i>face</i> and a <i>size</i>. The -size of the font is measured in <i>pixels</i> (ie. it is not -"resolution [in]dependent"). Lines should be spaced <i>size</i> -pixels apart (or more). - -<p>The <i>face</i> is an index into an internal table. Initially only -the first 16 faces are filled in. There are symbolic names for them: -FL_HELVETICA, FL_TIMES, FL_COURIER, and modifier values FL_BOLD and -FL_ITALIC which can be added to these, and FL_SYMBOL and -FL_ZAPF_DINGBATS. Faces greater than 255 cannot be used in Fl_Widget -labels, since it stores the index as a byte. - -</ul><h4><code>int fl_font();<br> -int fl_size();</code></h4><ul> - -Returns the face and size set by the most recent fl_font(a,b). This -can be used to save/restore the font. - -</ul><h4><code>const char* Fl::get_font(int face);</code></h4><ul> - -Get the string for this face. This string is different for each face. -Under X this value is passed to XListFonts to get all the sizes of -this face. - -</ul><h4><code>const char* Fl::get_font_name(int face, int* attributes=0);</code></h4><ul> - -Get a human-readable string describing the family of this face. This -is useful if you are presenting a choice to the user. There is no -guarantee that each face has a different name. The return value -points to a static buffer that is overwritten each call. - -<p>The integer pointed to by <i>attributes</i> (if the pointer is not -zero) is set to zero, <code>FL_BOLD</code>(1) or -<code>FL_ITALIC</code>(2) or <code>FL_BOLD|FL_ITALIC</code> (maybe -more attributes will be defined in the future). To locate a "family" -of fonts, search forward and back for a set with non-zero attributes, -these faces along with the face with a zero attribute before them -constitute a family. - -</ul><h4><code>int get_font_sizes(int face, int*& sizep);</code></h4><ul> - -Return an array of sizes in <i>sizep</i>. The return value is the -length of this array. The sizes are sorted from smallest to largest -and indicate what sizes can be given to fl_font() that will be matched -exactly (fl_font() will pick the closest size for other sizes). A -zero in the first location of the array indicates a scalable font, -where any size works, although the array may list sizes that work -"better" than others. Warning: the returned array points at a static -buffer that is overwritten each call. Under X this will open the -display. - -</ul><h4><code>int Fl::set_font(int face, const char*);</code></h4><ul> - -Change a face. The string pointer is simply stored, the string is not -copied, so the string must be in static memory. - -</ul><h4><code>int Fl::set_font(int face, int from);</code></h4><ul> - -Copy one face to another. - -</ul><h4><code>int Fl::set_fonts(const char* = 0);</code></h4><ul> - -FLTK will open the display, and add every font on the server to the -face table. It will attempt to put "families" of faces together, so -that the normal one is first, followed by bold, italic, and bold -italic. - -<p>The optional argument is a string to describe the set of fonts to -add. Passing NULL will select only fonts that have the ISO8859-1 -character set (and are thus usable by normal text). Passing "-*" will -select all fonts with any encoding as long as they have normal X font -names with dashes in them. Passing "*" will list every font that -exists (on X this may produce some strange output). Other values may -be useful but are system dependent. On MSWindows NULL selects fonts -with ISO8859-1 encoding and non-NULL selects all fonts. - -<p>Return value is how many faces are in the table after this is done. - -</ul><hr><h2>Bitmaps, Pixmaps and Images</h2> - -<a href=images.html#direct>Click here for information on drawing images</a> - -</ul><hr><h3>Cursor</h3> - -</ul><h4><code>void fl_cursor(Fl_Cursor, Fl_Color=FL_WHITE, Fl_Color=FL_BLACK);</code></h4><ul> - -Change the cursor. Depending on the system this may affect the cursor -everywhere, or only when it is pointing at the window that is current -when you call this. For portability you should change the cursor back -to the default in response to FL_LEAVE events. - -<p>The type Fl_Cursor is an enumeration defined in <a -href=Enumerations.html><Enumerations.H></a>. The -double-headed arrows are bitmaps provided by FLTK on X, the others are -provided by system-defined cursors. Under X you can get any XC_cursor -value by passing <code>Fl_Cursor((XC_foo/2)+1)</code>. - -<p><ul> -<li><code>FL_CURSOR_DEFAULT</code> (0) usually an arrow -<li><code>FL_CURSOR_ARROW</code> -<li><code>FL_CURSOR_CROSS</code> - crosshair -<li><code>FL_CURSOR_WAIT</code> - watch or hourglass -<li><code>FL_CURSOR_INSERT</code> - I-beam -<li><code>FL_CURSOR_HAND</code> - hand (uparrow on MSWindows) -<li><code>FL_CURSOR_HELP</code> - question mark -<li><code>FL_CURSOR_MOVE</code> - 4-pointed arrow -<li><code>FL_CURSOR_NS</code> - up/down arrow -<li><code>FL_CURSOR_WE</code> - left/right arrow -<li><code>FL_CURSOR_NWSE</code> - diagonal arrow -<li><code>FL_CURSOR_NESW</code> - diagonal arrow -<li><code>FL_CURSOR_NONE</code> - invisible -</ul> +<h4>void draw(int x, int y)</h4> -</ul><hr><h3>Overlay rectangle</h3> +Draws the image with the upper-left corner at <tt>x,y</tt>. This is +the same as doing <tt>draw(x,y,this->w,this->h,0,0)</tt>. -</ul><h4><code>void fl_overlay_rect(int x, int y, int w, int h);<br> -void fl_overlay_clear();</code></h4><ul> +<h4>void label(Fl_Widget *)</h4> -<p>Big kludge to draw interactive selection rectangles without using -the overlay. FLTK will xor a single rectangle outline over a window. -Calling this will erase any previous rectangle (by xor'ing it), and -then draw the new one. Calling fl_overlay_clear() will erase the -rectangle without drawing a new one. Using this is tricky. You -should make a widget with both a handle() and draw() method. draw() -should call fl_overlay_clear() before doing anything else. Your -handle() method should call window()->make_current() and then -fl_overlay_rect() after FL_DRAG events, and should call -fl_overlay_clear() after a FL_RELEASE event. +Change the <tt>label()</tt> and the <tt>labeltype()</tt> of the widget +to draw the image. You can use the same image for many widgets. -</ul><p><a href = index.html>(back to contents)</a> </BODY> </HTML> |
