DO NOT REPLY TO THIS MESSAGE. INSTEAD, POST ANY RESPONSES TO THE LINK BELOW.
[STR New]
Link: http://www.fltk.org/str.php?L2242
Version: 1.3-feature
Currently in 1.3-svn there exist no way of matching cairo fonts with FLTK
ones. Also the only platform independent way of using fonts in cairo
context with FLTK is through the "toy" font api (which is only supposed to
be used for simple testing according to official cairo docs)
In order to use text rendering with fltk-cairo I thus propose the method
cairo_font_face_t* fl_cairo_font_reference(Fl_Font); which returns a
reference to supplied FLTK font handle.
This also have the positive side effect of making cairo_test.cxx render
identically on all three cairo platforms.
Patch with implementation for all platforms is attached and tested.
Link: http://www.fltk.org/str.php?L2242
Version: 1.3-feature
diff --git a/FL/Fl_Cairo.H b/FL/Fl_Cairo.H
index aeed1fd..aaabd37 100644
--- a/FL/Fl_Cairo.H
+++ b/FL/Fl_Cairo.H
@@ -37,6 +37,7 @@
// Win32, Apple Quartz, X11
# include <FL/Fl_Export.H>
+# include <FL/Enumerations.H>
# if defined(USE_X11) // X11
# include <cairo-xlib.h>
@@ -87,6 +88,13 @@ private:
void* window_, *gc_; // for keeping track internally of last win+gc treated
};
+/**
+ Returns the a cairo font face created for the specified FLTK font.
+ Returned font face should be freed by calling cairo_font_face_destroy.
+ \note Only available when configure has the --enable-cairo option
+*/
+FL_EXPORT cairo_font_face_t* fl_cairo_font_reference(Fl_Font font);
+
/** @} */
# endif // HAVE_CAIRO
diff --git a/cairo/Fl_Cairo.cxx b/cairo/Fl_Cairo.cxx
index 0272671..5dcbcec 100644
--- a/cairo/Fl_Cairo.cxx
+++ b/cairo/Fl_Cairo.cxx
@@ -26,11 +26,24 @@
//
#include <config.h>
+#include <FL/Fl_Export.H>
#ifdef HAVE_CAIRO
#include <FL/Fl.H>
#include <FL/x.H>
#include <FL/Fl_Window.H>
+#include <FL/Enumerations.H>
+#include <FL/fl_draw.H>
+#include "src/Fl_Font.H"
+
+#if defined(WIN32)
+# include <cairo-win32.h>
+#elif (USE_XFT)
+# include <X11/Xft/Xft.h>
+# include <cairo-ft.h>
+#elif (__APPLE_QUARTZ__)
+# include <cairo-quartz.h>
+#endif
// static Fl module initialization :
Fl_Cairo_State Fl::cairo_state_; ///< contains all necesary info for
current cairo context mapping
@@ -155,9 +168,42 @@ cairo_t * Fl::cairo_make_current(void *gc, int W, int H) {
Fl::cairo_cc(c);
return c;
}
+
+FL_EXPORT cairo_font_face_t* fl_cairo_font_reference(Fl_Font font) {
+
+ Fl_Font oldfont;
+ Fl_Fontsize oldsize;
+ cairo_font_face_t* ret;
+
+ oldfont = fl_font();
+ oldsize = fl_size();
+
+ fl_font(font, FL_NORMAL_SIZE);
+
+ // fetch global font descriptor
+ Fl_Font_Descriptor* d = fl_fontsize;
+
+# if defined(WIN32)
+ ret = cairo_win32_font_face_create_for_hfont(d->fid);
+# elif defined(__APPLE_QUARTZ__)
+ ATSUFontID fontid;
+ ByteCount tmp;
+ ATSUGetAttribute(d->style, kATSUFontTag, sizeof(ATSUFontID),
&fontid, &tmp);
+ ret = cairo_quartz_font_face_create_for_atsu_font_id(fontid);
+# elif (USE_XFT)
+ ret = cairo_ft_font_face_create_for_pattern(d->font->pattern);
+# else
+# error Unsupported font configuration!
+# endif
+
+ // Restore old font & size
+ fl_font(oldfont, oldsize);
+
+ return ret;
+}
+
#else
// just don't leave the libfltk_cairo lib empty to avoid warnings
-#include <FL/Fl_Export.H>
FL_EXPORT int fltk_cairo_dummy() { return 1;}
#endif // HAVE_CAIRO
diff --git a/test/cairo_test.cxx b/test/cairo_test.cxx
index 0914572..351c19b 100644
--- a/test/cairo_test.cxx
+++ b/test/cairo_test.cxx
@@ -43,7 +43,8 @@ const char* name[7] = {"X", "Y", "W", "H", "start", "end",
"rotate"};
static void centered_text(cairo_t* cr, double x0,double y0,double w0,double
h0, const char * my_text) {
- cairo_select_font_face (cr, "Sans",
CAIRO_FONT_SLANT_OBLIQUE,CAIRO_FONT_WEIGHT_BOLD);
+ cairo_font_face_t* cf =
fl_cairo_font_reference(FL_HELVETICA|FL_BOLD|FL_ITALIC);
+ cairo_set_font_face(cr, cf);
cairo_set_source_rgba (cr, 0.9, 0.9, 0.4, 0.6);
cairo_text_extents_t extents;
cairo_text_extents (cr, my_text, &extents);
@@ -57,7 +58,7 @@ static void centered_text(cairo_t* cr, double x0,double
y0,double w0,double h0,
cairo_stroke (cr);
cairo_set_line_width (cr, DEF_WIDTH);
-
+ cairo_font_face_destroy(cf);
}
static void round_button(cairo_t* cr, double x0, double y0,
_______________________________________________
fltk-dev mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-dev