3 \page drawing Drawing Things in FLTK
5 This chapter covers the drawing functions that are provided with FLTK.
7 \section sect_WhenCanYouDraw When Can You Draw Things in FLTK?
9 There are only certain places you can execute drawing code in FLTK.
10 Calling these functions at other places will result in undefined behavior!
12 \li The most common place is inside the virtual Fl_Widget::draw() method.
13 To write code here, you must subclass one of the existing Fl_Widget
14 classes and implement your own version of draw().
16 \li You can also create custom \ref common_boxtypes "boxtypes" and
17 \ref common_labeltype "labeltypes". These involve writing small
18 procedures that can be called by existing Fl_Widget::draw() methods.
19 These "types" are identified by an 8-bit index that is stored in the
20 widget's \p box(), \p labeltype(), and possibly other properties.
22 \li You can call Fl_Window::make_current() to do incremental update of a
23 widget. Use Fl_Widget::window() to find the window.
26 \section sect_DrawingFunctions Drawing Functions
28 To use the drawing functions you must first include the <FL/fl_draw.H>
29 header file. FLTK provides the following types of drawing functions:
32 \li \ref ssect_Clipping
33 \li \ref drawing_colors
36 \li \ref ssect_Complex
39 \li \ref ssect_CharacterEncoding
40 \li \ref ssect_Overlay
41 \li \ref drawing_images
42 \li \ref ssect_DirectImageDrawing
43 \li \ref ssect_DirectImageReading
44 \li \ref ssect_Fl_Image
45 \li \ref ssect_Offscreen
47 \subsection ssect_Boxes Boxes
49 FLTK provides three functions that can be used to draw boxes for buttons
50 and other UI controls. Each function uses the supplied upper-lefthand corner
51 and width and height to determine where to draw the box.
53 void fl_draw_box(Fl_Boxtype b, int x, int y, int w, int h, Fl_Color c);
56 The \p %fl_draw_box() function draws a standard boxtype \p b
57 in the specified color \p c.
59 \anchor drawing_fl_frame
60 void fl_frame(const char *s, int x, int y, int w, int h) <br>
61 void fl_frame2(const char *s, int x, int y, int w, int h)
64 The \p %fl_frame() and \p %fl_frame2() functions draw a series of
65 line segments around the given box. The string \p s must contain groups
66 of 4 letters which specify one of 24 standard grayscale values,
67 where 'A' is black and 'X' is white.
68 The results of calling these functions with a string that is not a
69 multiple of 4 characters in length are undefined.
72 The only difference between \p %fl_frame() and \p %fl_frame2()
73 is the order of the line segments:
74 - For \p %fl_frame() the order of each set of 4 characters is:
75 top, left, bottom, right.
76 - For \p %fl_frame2() the order of each set of 4 characters is:
77 bottom, right, top, left.
81 \ref common_fl_frame "fl_frame(Fl_Boxtype b)"
82 is described in the \ref common_boxtypes section.
85 \subsection ssect_Clipping Clipping
87 You can limit all your drawing to a rectangular region by calling
88 \p %fl_push_clip(), and put the drawings back by using
90 This rectangle is measured in pixels and is unaffected by the current
91 transformation matrix.
93 In addition, the system may provide clipping when updating windows
94 which may be more complex than a simple rectangle.
96 void fl_push_clip(int x, int y, int w, int h) <br>
97 void fl_clip(int x, int y, int w, int h)
100 Intersect the current clip region with a rectangle and push this new
101 region onto the stack.
104 The \p %fl_clip() version is deprecated and
105 will be removed from future releases.
107 void fl_push_no_clip()
110 Pushes an empty clip region on the stack so nothing will be clipped.
115 Restore the previous clip region.
119 You must call \p %fl_pop_clip() once for every time you call
121 If you return to FLTK with the clip stack not empty unpredictable results
124 int fl_not_clipped(int x, int y, int w, int h)
127 Returns non-zero if any of the rectangle intersects the current clip
128 region. If this returns 0 you don't have to draw the object.
132 Under X this returns 2 if the rectangle is partially clipped,
133 and 1 if it is entirely inside the clip region.
135 int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H)
138 Intersect the rectangle <tt>x,y,w,h</tt> with the current
139 clip region and returns the bounding box of the result in
140 <tt>X,Y,W,H</tt>. Returns non-zero if the resulting rectangle is
141 different than the original. This can be used to limit the
142 necessary drawing to a rectangle. \c W and \c H are
143 set to zero if the rectangle is completely outside the region.
145 void fl_clip_region(Fl_Region r) <br>
146 Fl_Region fl_clip_region()
149 Replace the top of the clip stack with a clipping region of any shape.
150 Fl_Region is an operating system specific type. The second form returns
151 the current clipping region.
154 \section drawing_colors Colors
156 FLTK manages colors as 32-bit unsigned integers, encoded as RGBI.
157 When the RGB bytes are non-zero, the value is treated as RGB.
158 If these bytes are zero, the I byte will be used as an index
161 Values from 0 to 255, i.e. the I index value, represent
162 colors from the FLTK 1.3.x standard colormap
163 and are allocated as needed on screens without TrueColor support.
164 The \b Fl_Color enumeration type defines the
165 standard colors and color cube for the first 256 colors. All of
166 these are named with symbols in
167 \ref enumerations "<FL/Enumerations.H>".
169 Color values greater than 255 are treated as 24-bit RGB
170 values. These are mapped to the closest color supported by the
171 screen, either from one of the 256 colors in the FLTK 1.3.x
172 colormap or a direct RGB value on TrueColor screens.
174 Fl_Color fl_rgb_color(uchar r, uchar g, uchar b) <br>
175 Fl_Color fl_rgb_color(uchar grayscale)
178 Generate Fl_Color out of specified
179 8-bit RGB values or one 8-bit grayscale value.
181 void fl_color(Fl_Color c) <br>
185 Sets the color for all subsequent drawing operations.
186 Please use the first form:
187 the second form is only provided for back compatibility.
190 For colormapped displays, a color cell will be allocated out
191 of \p fl_colormap the first time you use a color. If the
192 colormap fills up then a least-squares algorithm is used to find
198 Returns the last color that was set using \p %fl_color().
199 This can be used for state save/restore.
201 void fl_color(uchar r, uchar g, uchar b)
204 Set the color for all subsequent drawing operations. The
205 closest possible match to the RGB color is used. The RGB color
206 is used directly on TrueColor displays. For colormap visuals the
207 nearest index in the gray ramp or color cube is used.
209 unsigned Fl::get_color(Fl_Color i) <br>
210 void Fl::get_color(Fl_Color i, uchar &red, uchar &green, uchar &blue)
213 Generate RGB values from a colormap index value \p i.
214 The first returns the RGB as a 32-bit unsigned integer,
215 and the second decomposes the RGB into three 8-bit values.
216 \todo work out why Fl::get_color() does not give links!
218 Fl::get_system_colors() <br>
219 Fl::foreground() <br>
220 Fl::background() <br>
224 The first gets color values from the user preferences or the system,
225 and the other routines are used to apply those values.
227 Fl::own_colormap() <br>
228 Fl::free_color(Fl_Color i, int overlay) <br>
229 Fl::set_color(Fl_Color i, unsigned c)
232 \p Fl::own_colormap() is used to install a local colormap [X11 only].
234 \p Fl::free_color() and \p Fl::set_color() are used to remove and replace
235 entries from the colormap.
236 \todo work out why these do not give links!
238 There are two predefined graphical interfaces for choosing colors.
239 The function fl_show_colormap() shows a table of colors and returns an
240 Fl_Color index value.
241 The Fl_Color_Chooser widget provides a standard RGB color chooser.
243 As the Fl_Color encoding maps to a 32-bit unsigned integer representing
244 RGBI, it is also possible to specify a color using a hex constant as a
251 | Color map index (8 bits)
255 button->color(0x000000ff); // colormap index #255 (FL_WHITE)
258 or specify a color using a hex constant for the RGB components:
260 // RGB COLOR ASSIGNMENTS
269 button->color(0xff000000); // RGB: red
270 button->color(0x00ff0000); // RGB: green
271 button->color(0x0000ff00); // RGB: blue
272 button->color(0xffffff00); // RGB: white
276 If TrueColor is not available, any RGB colors will be set to
277 the nearest entry in the colormap.
279 \subsection ssect_Lines Line Dashes and Thickness
281 FLTK supports drawing of lines with different styles and
282 widths. Full functionality is not available under Windows 95, 98,
283 and Me due to the reduced drawing functionality these operating
286 void fl_line_style(int style, int width, char* dashes)
289 Set how to draw lines (the "pen"). If you change this it is your
290 responsibility to set it back to the default with
295 Because of how line styles are implemented on MS Windows systems, you
296 \e must set the line style \e after setting the drawing color.
298 color after the line style you will lose the line style settings!
301 \p style is a bitmask which is a bitwise-OR of the following
302 values. If you don't specify a dash type you will get a solid
303 line. If you don't specify a cap or join type you will get a
304 system-defined default of whatever value is fastest.
307 \li <tt>FL_SOLID -------</tt>
308 \li <tt>FL_DASH - - - -</tt>
309 \li <tt>FL_DOT .......</tt>
310 \li <tt>FL_DASHDOT - . - .</tt>
311 \li <tt>FL_DASHDOTDOT - .. -</tt>
312 \li <tt>FL_CAP_FLAT</tt>
313 \li <tt>FL_CAP_ROUND</tt>
314 \li <tt>FL_CAP_SQUARE</tt> (extends past end point 1/2 line width)
315 \li <tt>FL_JOIN_MITER</tt> (pointed)
316 \li <tt>FL_JOIN_ROUND</tt>
317 \li <tt>FL_JOIN_BEVEL</tt> (flat)
320 \p width is the number of pixels thick to draw the lines.
321 Zero results in the system-defined default, which on both X and
322 Windows is somewhat different and nicer than 1.
325 \p dashes is a pointer to an array of dash lengths, measured in
326 pixels. The first location is how long to draw a solid portion, the
327 next is how long to draw the gap, then the solid, etc. It is
328 terminated with a zero-length entry. A \p NULL pointer or a zero-length
329 array results in a solid line. Odd array sizes are not supported and
330 result in undefined behavior.
334 The dashes array does not work under Windows 95, 98, or Me, since those
335 operating systems do not support complex line styles.
338 \subsection ssect_Fast Drawing Fast Shapes
340 These functions are used to draw almost all the FLTK widgets.
341 They draw on exact pixel boundaries and are as fast as possible.
342 Their behavior is duplicated exactly on all platforms FLTK is
343 ported. It is undefined whether these are affected by the
344 \ref ssect_Complex "transformation matrix",
345 so you should only call these while the matrix is set to the
346 identity matrix (the default).
348 void fl_point(int x, int y)
351 Draw a single pixel at the given coordinates.
353 void fl_rectf(int x, int y, int w, int h) <br>
354 void fl_rectf(int x, int y, int w, int h)
357 Color a rectangle that exactly fills the given bounding box.
359 void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b)
362 Color a rectangle with "exactly" the passed
363 <tt>r,g,b</tt> color. On screens with less than 24 bits of
364 color this is done by drawing a solid-colored block using
365 \ref drawing_fl_draw_image "fl_draw_image()"
366 so that the correct color shade is produced.
368 void fl_rect(int x, int y, int w, int h) <br>
369 void fl_rect(int x, int y, int w, int h, Fl_Color c)
372 Draw a 1-pixel border \e inside this bounding box.
374 void fl_line(int x, int y, int x1, int y1) <br>
375 void fl_line(int x, int y, int x1, int y1, int x2, int y2)
378 Draw one or two lines between the given points.
380 void fl_loop(int x, int y, int x1, int y1, int x2, int y2) <br>
381 void fl_loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3)
384 Outline a 3 or 4-sided polygon with lines.
386 void fl_polygon(int x, int y, int x1, int y1, int x2, int y2) <br>
387 void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3)
390 Fill a 3 or 4-sided polygon. The polygon must be convex.
392 void fl_xyline(int x, int y, int x1) <br>
393 void fl_xyline(int x, int y, int x1, int y2) <br>
394 void fl_xyline(int x, int y, int x1, int y2, int x3)
397 Draw horizontal and vertical lines. A horizontal line is
398 drawn first, then a vertical, then a horizontal.
400 void fl_yxline(int x, int y, int y1) <br>
401 void fl_yxline(int x, int y, int y1, int x2) <br>
402 void fl_yxline(int x, int y, int y1, int x2, int y3)
405 Draw vertical and horizontal lines. A vertical line is drawn
406 first, then a horizontal, then a vertical.
408 void fl_arc(int x, int y, int w, int h, double a1, double a2) <br>
409 void fl_pie(int x, int y, int w, int h, double a1, double a2)
412 Draw ellipse sections using integer coordinates. These
413 functions match the rather limited circle drawing code provided
414 by X and MS Windows. The advantage over using
415 \ref drawing_fl_arc "fl_arc()"
417 coordinates is that they are faster because they often use the
418 hardware, and they draw much nicer small circles, since the
419 small sizes are often hard-coded bitmaps.
422 If a complete circle is drawn it will fit inside the passed bounding
423 box. The two angles are measured in degrees counter-clockwise from
424 3'oclock and are the starting and ending angle of the arc, \p a2
425 must be greater or equal to \p a1.
428 \p %fl_arc() draws a series of lines to approximate the arc.
429 Notice that the integer version of \p %fl_arc() has a different
430 number of arguments to the other
431 \ref drawing_fl_arc "fl_arc()"
432 function described later in this chapter.
435 \p %fl_pie() draws a filled-in pie slice. This slice may
436 extend outside the line drawn by \p %fl_arc(); to avoid this
437 use \p w-1 and \p h-1.
440 add an Fl_Draw_Area_Cb typedef to allow fl_scroll(...) to be doxygenated?
442 void fl_scroll(int X, int Y, int W, int H, int dx, int dy, void (*draw_area)(void*, int,int,int,int), void* data)
445 Scroll a rectangle and draw the newly exposed portions. The contents
446 of the rectangular area is first shifted by \p dx and
447 \p dy pixels. The callback is then called for every newly
448 exposed rectangular area,
451 \subsection ssect_Complex Drawing Complex Shapes
453 The complex drawing functions let you draw arbitrary shapes
454 with 2-D linear transformations. The functionality matches that
455 found in the Adobe® PostScript&tm; language. The
456 exact pixels that are filled are less defined than for the fast
457 drawing functions so that FLTK can take advantage of drawing
458 hardware. On both X and MS Windows the transformed vertices are
459 rounded to integers before drawing the line segments: this
460 severely limits the accuracy of these functions for complex
461 graphics, so use OpenGL when greater accuracy and/or performance
464 void fl_push_matrix() <br>
468 Save and restore the current transformation. The maximum
469 depth of the stack is 32 entries.
471 void fl_scale(double x,double y) <br>
472 void fl_scale(double x) <br>
473 void fl_translate(double x,double y) <br>
474 void fl_rotate(double d) <br>
475 void fl_mult_matrix(double a,double b,double c,double d,double x,double y)
478 Concatenate another transformation onto the current one. The rotation
479 angle is in degrees (not radians) and is counter-clockwise.
481 double fl_transform_x(double x, double y) <br>
482 double fl_transform_y(double x, double y) <br>
483 double fl_transform_dx(double x, double y) <br>
484 double fl_transform_dy(double x, double y) <br>
485 void fl_transformed_vertex(double xf, double yf)
488 Transform a coordinate or a distance using the current transformation matrix.
489 After transforming a coordinate pair, it can be added to the vertex
490 list without any further translations using \p %fl_transformed_vertex().
492 void fl_begin_points() <br>
496 Start and end drawing a list of points. Points are added to
497 the list with \p %fl_vertex().
499 void fl_begin_line() <br>
503 Start and end drawing lines.
505 void fl_begin_loop() <br>
509 Start and end drawing a closed sequence of lines.
511 void fl_begin_polygon() <br>
512 void fl_end_polygon()
515 Start and end drawing a convex filled polygon.
517 void fl_begin_complex_polygon() <br>
519 void fl_end_complex_polygon()
522 Start and end drawing a complex filled polygon. This polygon
523 may be concave, may have holes in it, or may be several
524 disconnected pieces. Call \p %fl_gap() to separate loops of
525 the path. It is unnecessary but harmless to call
526 \p %fl_gap() before the first vertex, after the last one,
527 or several times in a row.
530 \p %fl_gap() should only be called between
531 \p %fl_begin_complex_polygon() and
532 \p %fl_end_complex_polygon().
533 To outline the polygon, use
534 \p %fl_begin_loop() and replace each
536 \p %fl_end_loop();%fl_begin_loop() pair.
540 For portability, you should only draw polygons that appear the same whether
541 "even/odd" or "non-zero" winding rules are used to fill them. Holes should
542 be drawn in the opposite direction of the outside loop.
544 void fl_vertex(double x,double y)
547 Add a single vertex to the current path.
549 void fl_curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3)
552 Add a series of points on a Bezier curve to the path. The curve ends
553 (and two of the points) are at <tt>X0,Y0</tt> and <tt>X3,Y3</tt>.
555 \anchor drawing_fl_arc
556 void fl_arc(double x, double y, double r, double start, double end)
559 Add a series of points to the current path on the arc of a
560 circle; you can get elliptical paths by using scale and rotate
561 before calling \p %fl_arc().
562 The center of the circle is given by \p x and \p y,
563 and \p r is its radius.
565 takes \p start and \p end angles that are measured
566 in degrees counter-clockwise from 3 o'clock.
567 If \p end is less than \p start then it draws the arc in a clockwise
570 void fl_circle(double x, double y, double r)
573 \p fl_circle(...) is equivalent to \p fl_arc(...,0,360) but may
574 be faster. It must be the \e only thing in the path: if you want
575 a circle as part of a complex polygon you must use \p %fl_arc().
579 \p %fl_circle() draws incorrectly if the transformation is both rotated and
582 \subsection ssect_Text Drawing Text
584 All text is drawn in the
585 \ref drawing_fl_font "current font".
586 It is undefined whether this location or the characters are
587 modified by the current transformation.
589 void fl_draw(const char *, int x, int y) <br>
590 void fl_draw(const char *, int n, int x, int y)
593 Draw a nul-terminated string or an array of \p n characters
594 starting at the given location. Text is aligned to the left and to
595 the baseline of the font. To align to the bottom, subtract
596 \p %fl_descent() from \p y.
597 To align to the top, subtract \p %fl_descent() and add \p %fl_height().
598 This version of \p %fl_draw() provides direct access to
599 the text drawing function of the underlying OS. It does not apply any
600 special handling to control characters.
602 void fl_draw(const char* str, int x, int y, int w, int h, Fl_Align align, Fl_Image* img, int draw_symbols)
605 Fancy string drawing function which is used to draw all the
606 labels. The string is formatted and aligned inside the passed
607 box. Handles '\\t' and '\\n', expands all other control
608 characters to ^X, and aligns inside or against the edges of the
609 box described by \p x, \p y, \p w and \p h.
610 See Fl_Widget::align() for values for \p align.
611 The value \p FL_ALIGN_INSIDE is ignored, as this function always
612 prints inside the box.
615 If \p img is provided and is not \p NULL, the
616 image is drawn above or below the text as specified by the
620 The \p draw_symbols argument specifies whether or not
621 to look for symbol names starting with the "@" character.
624 The text length is limited to 1024 characters per line.
626 void fl_measure(const char *str, int& w, int& h, int draw_symbols)
629 Measure how wide and tall the string will be when printed by
630 the \p fl_draw(...align) function.
631 If the incoming \p w is non-zero it will wrap to that width.
636 Recommended minimum line spacing for the current font. You
637 can also just use the value of \p size passed to
638 \ref drawing_fl_font "fl_font()".
643 Recommended distance above the bottom of a \p %fl_height() tall box to draw
644 the text at so it looks centered vertically in that box.
646 double fl_width(const char* txt) <br>
647 double fl_width(const char* txt, int n) <br>
648 double fl_width(unsigned int unicode_char)
651 Return the pixel width of a nul-terminated string, a sequence of \p n
652 characters, or a single character in the current font.
654 const char* fl_shortcut_label(int shortcut)
657 Unparse a shortcut value as used by Fl_Button or Fl_Menu_Item
658 into a human-readable string like "Alt+N". This only
659 works if the shortcut is a character key or a numbered function
660 key. If the shortcut is zero an empty string is returned. The
661 return value points at a static buffer that is overwritten with
664 \subsection ssect_Fonts Fonts
666 FLTK supports a set of standard fonts based on the Times,
667 Helvetica/Arial, Courier, and Symbol typefaces, as well as
668 custom fonts that your application may load. Each font is
669 accessed by an index into a font table.
671 Initially only the first 16 faces are filled in. There are
672 symbolic names for them: FL_HELVETICA,
673 FL_TIMES, FL_COURIER, and modifier values
674 FL_BOLD and FL_ITALIC which can be added to
675 these, and FL_SYMBOL and FL_ZAPF_DINGBATS.
676 Faces greater than 255 cannot be used in Fl_Widget
677 labels, since Fl_Widget stores the index as a byte.
679 \anchor drawing_fl_font
680 void fl_font(int face, int size)
683 Set the current font, which is then used by the routines
684 described above. You may call this outside a draw context if
685 necessary to call fl_width(), but on X this will open
689 The font is identified by a \p face and a \p size.
690 The size of the font is measured in \p pixels and not "points".
691 Lines should be spaced \p size pixels apart or more.
697 Returns the face and size set by the most recent call to
698 \p fl_font(a,b). This can be used to save/restore the font.
700 \subsection ssect_CharacterEncoding Character Encoding
702 FLTK 1.3 expects all text in Unicode UTF-8 encoding. UTF-8 is
703 ASCII compatible for the first 128 characters. International
704 characters are encoded in multibyte sequences.
706 FLTK expects individual characters, characters that are not part of
707 a string, in UCS-4 encoding, which is also ASCII compatible, but
708 requires 4 bytes to store a Unicode character.
710 For more information about character encodings, see the chapter on
713 \subsection ssect_Overlay Drawing Overlays
715 These functions allow you to draw interactive selection rectangles
716 without using the overlay hardware. FLTK will XOR a single rectangle
717 outline over a window.
719 void fl_overlay_rect(int x, int y, int w, int h); <br>
720 void fl_overlay_clear();
723 \p %fl_overlay_rect() draws a selection rectangle, erasing any
724 previous rectangle by XOR'ing it first. \p %fl_overlay_clear()
725 will erase the rectangle without drawing a new one.
728 Using these functions is tricky. You should make a widget
729 with both a \p handle() and \p draw() method.
730 \p draw() should call \p %fl_overlay_clear() before
731 doing anything else. Your \p handle() method should call
732 <tt>window()->make_current()</tt> and then
733 \p %fl_overlay_rect() after FL_DRAG events, and
734 should call \p %fl_overlay_clear() after a
738 \section drawing_images Drawing Images
740 To draw images, you can either do it directly from data in
741 your memory, or you can create a Fl_Image object. The advantage of
742 drawing directly is that it is more intuitive, and it is faster
743 if the image data changes more often than it is redrawn. The
744 advantage of using the object is that FLTK will cache translated
745 forms of the image (on X it uses a server pixmap) and thus
746 redrawing is \e much faster.
748 \subsection ssect_DirectImageDrawing Direct Image Drawing
750 The behavior when drawing images when the current
751 transformation matrix is not the identity is not defined, so you
752 should only draw images when the matrix is set to the identity.
754 \anchor drawing_fl_draw_image
755 void fl_draw_image(const uchar *buf,int X,int Y,int W,int H,int D,int L)<br>
756 void fl_draw_image_mono(const uchar *buf,int X,int Y,int W,int H,int D,int L)
759 Draw an 8-bit per color RGB or luminance image. The pointer
760 points at the "r" data of the top-left pixel. Color
761 data must be in <tt>r,g,b</tt> order.
762 The top left corner is given by \p X and \p Y
763 and the size of the image is given by \p W and \p H.
764 \p D is the delta to add to the pointer between pixels,
765 it may be any value greater or equal to \p 3,
766 or it can be negative to flip the image horizontally.
767 \p L is the delta to add to the pointer between lines
768 (if 0 is passed it uses \p W*D).
769 and may be larger than \p W*D to crop data,
770 or negative to flip the image vertically.
773 It is highly recommended that you put the following code before the
774 first show() of \e any window in your program to get rid
775 of the dithering if possible:
782 Gray scale (1-channel) images may be drawn. This is done if
783 <tt>abs(D)</tt> is less than 3, or by calling
784 \p %fl_draw_image_mono(). Only one 8-bit sample is used for
785 each pixel, and on screens with different numbers of bits for
786 red, green, and blue only gray colors are used. Setting
787 \p D greater than 1 will let you display one channel of a
792 The X version does not support all possible visuals.
793 If FLTK cannot draw the image in the current visual it
794 will abort. FLTK supports any visual of 8 bits or less,
795 and all common TrueColor visuals up to 32 bits.
797 typedef void (*Fl_Draw_Image_Cb)(void *data,int x,int y,int w,uchar *buf) <br>
798 void fl_draw_image(Fl_Draw_Image_Cb cb,void *data,int X,int Y,int W,int H,int D) <br>
799 void fl_draw_image_mono(Fl_Draw_Image_Cb cb,void *data,int X,int Y,int W,int H,int D)
802 Call the passed function to provide each scan line of the
803 image. This lets you generate the image as it is being drawn,
804 or do arbitrary decompression of stored data, provided it can be
805 decompressed to individual scan lines easily.
808 The callback is called with the \p void* user data
809 pointer which can be used to point at a structure of information
810 about the image, and the \p x, \p y, and \p w
811 of the scan line desired from the image. 0,0 is the upper-left
812 corner of the image, <I>not <tt>X,Y</tt></I>. A pointer to a
813 buffer to put the data into is passed. You must copy \p w
814 pixels from scanline \p y, starting at pixel \p x,
818 Due to cropping, less than the whole image may be requested.
819 So \p x may be greater than zero, the first \p y may
820 be greater than zero, and \p w may be less than \p W.
821 The buffer is long enough to store the entire \p W*D
822 pixels, this is for convenience with some decompression
823 schemes where you must decompress the entire line at once:
824 decompress it into the buffer, and then if \p x is not
825 zero, copy the data over so the \p x'th pixel is at the
829 You can assume the \p y's will be consecutive, except
830 the first one may be greater than zero.
833 If \p D is 4 or more, you must fill in the unused bytes
836 int fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg) <br>
837 int fl_draw_pixmap(const char* const* cdata, int x, int y, Fl_Color bg)
840 Draws XPM image data, with the top-left corner at the given position.
841 The image is dithered on 8-bit displays so you won't lose color space
842 for programs displaying both images and pixmaps. This function returns
843 zero if there was any error decoding the XPM data.
851 fl_draw_pixmap(foo, X, Y);
855 Transparent colors are replaced by the optional
856 Fl_Color argument. To draw with true transparency you must
857 use the Fl_Pixmap class.
859 int fl_measure_pixmap(char* const* data, int &w, int &h) <br>
860 int fl_measure_pixmap(const char* const* cdata, int &w, int &h)
863 An XPM image contains the dimensions in its data. This
864 function finds and returns the width and height. The return
865 value is non-zero if the dimensions were parsed ok and zero if
866 there was any problem.
868 \subsection ssect_DirectImageReading Direct Image Reading
870 FLTK provides a single function for reading from the current
871 window or off-screen buffer into a RGB(A) image buffer.
873 uchar* fl_read_image(uchar *p, int X, int Y, int W, int H, int alpha)
876 Read a RGB(A) image from the current window or off-screen
877 buffer. The \p p argument points to a buffer that can hold
878 the image and must be at least \p W*H*3 bytes when reading
879 RGB images and \p W*H*4 bytes when reading RGBA images. If
880 \p NULL, \p %fl_read_image() will create an array of
881 the proper size which can be freed using \p delete[].
884 The \p alpha parameter controls whether an alpha
885 channel is created and the value that is placed in the alpha
886 channel. If 0, no alpha channel is generated.
888 \subsection ssect_Fl_Image Image Classes
890 FLTK provides a base image class called Fl_Image which supports
891 creating, copying, and drawing images of various kinds, along
892 with some basic color operations. Images can be used as labels
893 for widgets using the \p image() and \p deimage() methods or drawn directly.
895 The Fl_Image class does almost nothing by itself, but is instead
896 supported by three basic image types:
902 The Fl_Bitmap class encapsulates a mono-color bitmap image.
903 The \p draw() method draws the image using the current drawing
906 The Fl_Pixmap class encapsulates a colormapped image.
907 The \p draw() method draws the image using the colors in the
908 file, and masks off any transparent colors automatically.
910 The Fl_RGB_Image class encapsulates a full-color
911 (or grayscale) image with 1 to 4 color components. Images with
912 an even number of components are assumed to contain an
913 alpha channel that is used for transparency. The transparency
914 provided by the draw() method is either a 24-bit
915 blend against the existing window contents or a "screen door"
916 transparency mask, depending on the platform and screen color depth.
918 char fl_can_do_alpha_blending()
921 \p %fl_can_do_alpha_blending() will return 1, if your
922 platform supports true alpha blending for RGBA images, or 0,
923 if FLTK will use screen door transparency.
925 FLTK also provides several image classes based on the three
926 standard image types for common file formats:
935 Each of these image classes load a named file of the
936 corresponding format. The Fl_Shared_Image class
937 can be used to load any type of image file - the class examines
938 the file and constructs an image of the appropriate type.
940 Finally, FLTK provides a special image class called Fl_Tiled_Image to
941 tile another image object in the specified area. This class can be
942 used to tile a background image in a Fl_Group widget, for example.
944 virtual void Fl_Tiled_Image::copy(); <br>
945 virtual Fl_Image* Fl_Tiled_Image::copy(int w, int h);
948 The \p copy() method creates a copy of the image. The second form
949 specifies the new size of the image - the image is resized using the
950 nearest-neighbor algorithm.
952 void Fl_Tiled_Image::draw(int x, int y, int w, int h, int ox, int oy);
955 The \p draw() method draws the image object.
956 <tt>x,y,w,h</tt> indicates a destination rectangle.
957 <tt>ox,oy,w,h</tt> is a source rectangle. This source rectangle
958 is copied to the destination. The source rectangle may extend
959 outside the image, i.e. \p ox and \p oy may be
960 negative and \p w and \p h may be bigger than the
961 image, and this area is left unchanged.
963 void Fl_Tiled_Image::draw(int x, int y)
966 Draws the image with the upper-left corner at <tt>x,y</tt>.
967 This is the same as doing \p draw(x,y,img->w(),img->h(),0,0).
969 \subsection ssect_Offscreen Offscreen Drawing
971 Sometimes it can be very useful to generate a complex drawing
972 in memory first and copy it to the screen at a later point in
973 time. This technique can significantly reduce the amount of
974 repeated drawing. Offscreen drawing functions are declared in <FL/x.H>.
975 Fl_Double_Window uses offscreen rendering
976 to avoid flickering on systems that don't support
977 double-buffering natively.
979 Fl_Offscreen fl_create_offscreen(int w, int h)
982 Create an RGB offscreen buffer with \p w*h pixels.
984 void fl_delete_offscreen(Fl_Offscreen)
987 Delete a previously created offscreen buffer. All drawings are lost.
989 void fl_begin_offscreen(Fl_Offscreen)
992 Send all subsequent drawing commands to this offscreen buffer.
993 FLTK can draw into a buffer at any time. There is no need to wait for
994 an Fl_Widget::draw() to occur.
996 void fl_end_offscreen()
999 Quit sending drawing commands to this offscreen buffer.
1001 void fl_copy_offscreen(int x, int y, int w, int h, Fl_Offscreen osrc, int srcx, int srcy)
1004 Copy a rectangular area of the size \p w*h from \p srcx,srcy
1005 in the offscreen buffer into the current buffer at \p x,y.
1010 <table summary="navigation bar" width="100%" border="0">
1012 <td width="45%" align="LEFT">
1013 <a class="el" href="editor.html">
1015 Designing a Simple Text Editor
1018 <td width="10%" align="CENTER">
1019 <a class="el" href="index.html">[Index]</a>
1021 <td width="45%" align="RIGHT">
1022 <a class="el" href="events.html">