summaryrefslogtreecommitdiff
path: root/FL
diff options
context:
space:
mode:
authorFabien Costantini <fabien@onepost.net>2008-09-25 18:26:33 +0000
committerFabien Costantini <fabien@onepost.net>2008-09-25 18:26:33 +0000
commitffad932289d17877a506a51c5f2f32c743d747d8 (patch)
treef45d4fa0e5b42f4faad7c5aba99a3da01d243a9c /FL
parentf9dc24a096d98abf3d3176eee74a759f886c4134 (diff)
+ Cairo branch merged after successful testing on Mac OS X 10.5.4, Linux Ubuntu 8.04,Windows XPSP2.
This integration is minimum as discussed, in particular it does not feature any fltk cairo drawing substitution as in fltk2. Still it provides all the fundations to go further even in next 1.4 ... By default *no* cairo features are implemented nor linked, it can only be activated by --enable-cairo whose default is false. Please visit the README.cairo for complete description. + fixed UTF8 compilation pb on linux ubuntu + minor comments fixes on the fly git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6350 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'FL')
-rw-r--r--FL/Fl.H57
-rw-r--r--FL/Fl_Cairo.H98
-rw-r--r--FL/Fl_Cairo_Window.H87
-rw-r--r--FL/win32.H10
4 files changed, 244 insertions, 8 deletions
diff --git a/FL/Fl.H b/FL/Fl.H
index df1b9d861..88d963d5c 100644
--- a/FL/Fl.H
+++ b/FL/Fl.H
@@ -25,14 +25,17 @@
// http://www.fltk.org/str.php
//
-/** \file
-
- * Fl static class .
+/** \file
+ Fl static class .
*/
#ifndef Fl_H
# define Fl_H
+#ifdef HAVE_CAIRO
+# include <FL/Fl_Cairo.H>
+#endif
+
# include "fl_utf8.h"
# include "Enumerations.H"
# ifndef Fl_Object
@@ -43,6 +46,7 @@
# undef check
# endif
+
class Fl_Widget;
class Fl_Window;
class Fl_Image;
@@ -800,6 +804,53 @@ public:
static void clear_widget_pointer(Fl_Widget const *w);
/** @} */
+#ifdef HAVE_CAIRO
+ /** \defgroup group_cairo Cairo functions support
+ @{
+ */
+public:
+ // Cairo support API
+ static cairo_t * cairo_make_current(Fl_Window* w);
+ /** when HAVE_CAIRO is defined and cairo_autolink_context() is true,
+ any current window dc is linked to a current context.
+ this is not the default because, it may not be necessary
+ to add cairo support to all fltk supported windows.
+ When you wish to associate a cairo context in this mode,
+ you need to call explicitly in your draw() overriden method,
+ FL::cairo_make_current(Fl_Window*). This will create a cairo context
+ but only for this Window.
+ Still in custom cairo application it is possible to handle
+ completely this process automatically by setting \a alink to true.
+ In this last case, you don't need anymore to call Fl::cairo_make_current()
+ you can use Fl::cairo_cc() to get the current cairo context anytime.
+ \note Only available when configure has the --enable-cairo option
+ */
+ static void cairo_autolink_context(bool alink) {cairo_state_.autolink(alink);}
+ /**
+ Gets the current autolink mode for cairo support,
+ \retval false if no cairo context autolink is made for each window.
+ \retval true if any fltk window is attached a cairo context when it
+ is current. \see void cairo_autolink_context(bool alink)
+ \note Only available when configure has the --enable-cairo option
+ */
+ static bool cairo_autolink_context() {return cairo_state_.autolink();}
+ /** Gets the current cairo context linked with a fltk window. */
+ static cairo_t * cairo_cc() { return cairo_state_.cc(); }
+ /** Sets the cairo current context to \a c,
+ set \a own to true if you want fltk to handle this cc deletion.
+ \note Only available when configure has the --enable-cairo option
+*/
+ static void cairo_cc(cairo_t * c, bool own=false){ cairo_state_.cc(c, own); }
+
+private:
+ static cairo_t * cairo_make_current(void* gc);
+ static cairo_t * cairo_make_current(void* gc, int W, int H);
+ static Fl_Cairo_State cairo_state_;
+public:
+ /** @} */
+
+#endif // HAVE_CAIRO
+
};
#endif // !Fl_H
diff --git a/FL/Fl_Cairo.H b/FL/Fl_Cairo.H
new file mode 100644
index 000000000..15cd14831
--- /dev/null
+++ b/FL/Fl_Cairo.H
@@ -0,0 +1,98 @@
+//
+// "$Id$"
+//
+// Main header file for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2008 by Bill Spitzak and others.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+/** \file
+ Hanling transparently platform dependent cairo include files
+*/
+
+#ifndef FL_CAIRO_H
+# define FL_CAIRO_H
+# ifdef HAVE_CAIRO
+
+// Cairo is currently supported for the following platforms:
+// Win32, Apple Quartz, X11
+
+# include <FL/Fl_Export.H>
+
+# if defined(USE_X11) // X11
+# include <cairo-xlib.h>
+# elif defined(WIN32)
+# include <cairo-win32.h>
+# elif defined(__APPLE_QUARTZ__)
+# include <cairo-quartz.h>
+# elif defined(__APPLE_QD__)
+# error Apple Quartz is necessary for Cairo upport.
+# else
+# error Cairo is not supported on that platform.
+# endif
+
+/**
+ \addtogroup group_cairo
+ @{
+*/
+
+/**
+ Contains all the necessary info on the current cairo context.
+ A private internal & unique corresponding object is created to
+ permit cairo context state handling while keeping it opaque.
+ For internal use only.
+ \note Only available when configure has the --enable-cairo option
+*/
+class FL_EXPORT Fl_Cairo_State {
+public:
+ Fl_Cairo_State() : cc_(0), own_cc_(false), autolink_(false), window_(0), gc_(0) {}
+
+ // access attributes
+ cairo_t* cc() const {return cc_;} ///< Gets the current cairo context
+ bool autolink() const {return autolink_;} ///< Sets the autolink option \see Fl:cairo_autolink_context(bool)
+ void cc(cairo_t* c, bool own=true) { ///< Sets the current cairo context, \a own indicates cc deletion is made by us
+ if (cc_ && own_cc_) cairo_destroy(cc_);
+ cc_=c;
+ if (!cc_) window_=0;
+ own_cc_=own;
+ }
+ void autolink(bool b) {autolink_ = b;} ///< Gets the autolink option
+ void window(void* w) {window_=w;} ///< Sets the window \w to keep track on
+ void* window() const {return window_;} ///< Gets the last window attached to a cc
+ void gc(void* c) {gc_=c;} ///< Sets the gc \c to keep track on
+ void* gc() const {return gc_;} ///< Gets the last gc attached to a cc
+
+private:
+ cairo_t * cc_; // contains the unique autoupdated cairo context
+ bool own_cc_; // indicates whether we must delete the cc, useful for internal cleanup
+ bool autolink_; // true by default, permits to prevent the automatic cairo mapping on fltk windows for custom cairo implementations
+ void* window_, *gc_; // for keeping track internally of last win+gc treated
+};
+
+/** @} */
+
+# endif // HAVE_CAIRO
+#endif // FL_CAIRO_H
+
+//
+// End of "$Id$" .
+//
diff --git a/FL/Fl_Cairo_Window.H b/FL/Fl_Cairo_Window.H
new file mode 100644
index 000000000..3914657a9
--- /dev/null
+++ b/FL/Fl_Cairo_Window.H
@@ -0,0 +1,87 @@
+//
+// "$Id$"
+//
+// Main header file for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2008 by Bill Spitzak and others.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+/** \file
+ Fl_Cairo_Window Hanling transparently a fltk window incorporte a cairo draw callback.
+*/
+
+#ifndef FL_CAIRO_WINDOW_H
+# define FL_CAIRO_WINDOW_H
+# ifdef HAVE_CAIRO
+
+// Cairo is currently supported for the following platforms:
+// Win32, Apple Quartz, X11
+# include <FL/Fl.H>
+# include <FL/Fl_Double_Window.H>
+
+/**
+ \addtogroup group_cairo
+ @{
+*/
+
+/**
+ This defines a pre-configured cairo fltk window.
+ This class overloads for you the virtual draw() method,
+ so that the only thing you have to do is to provide your cairo code.
+ All cairo context handling is achieved transparently.
+ \note You can alternatively define your custom cairo fltk window,
+ and thus at least override the draw() method to provide custom cairo
+ support. In this case you will probably use Fl:cairo_make_current(Fl_Window*)
+ to attach a context to your window. You should do it on ly when your Window is
+ the current window. \see Fl_Window::current()
+*/
+class FL_EXPORT Fl_Cairo_Window : public Fl_Double_Window {
+public:
+ Fl_Cairo_Window(int w, int h) : Fl_Double_Window(w,h),draw_cb_(0) {}
+ /** Overloaded to provide cairo callback support */
+ void draw() {
+ Fl_Double_Window::draw();
+ // manual method ? if yes explicitly get a cairo_context here
+ if (!Fl::cairo_autolink_context())
+ Fl::cairo_make_current(this);
+ if (draw_cb_) draw_cb_(this, Fl::cairo_cc());
+ }
+ /** This defines the cairo draw calback prototype that you must further */
+ typedef void (*cairo_draw_cb) (Fl_Cairo_Window* self, cairo_t* def);
+ /**
+ You must provide a draw callback which will implement your cairo rendering,
+ This method will permit you to set you \a cb cairo callback.
+ */
+ void set_draw_cb(cairo_draw_cb cb){draw_cb_=cb;}
+private:
+ cairo_draw_cb draw_cb_;
+};
+
+
+/** @} */
+
+# endif // HAVE_CAIRO
+#endif // FL_CAIRO_WINDOW_H
+
+//
+// End of "$Id$" .
+//
diff --git a/FL/win32.H b/FL/win32.H
index e58dbfb39..b03c6ef44 100644
--- a/FL/win32.H
+++ b/FL/win32.H
@@ -125,12 +125,12 @@ typedef HBITMAP Fl_Offscreen;
extern FL_EXPORT HDC fl_makeDC(HBITMAP);
-#define fl_begin_offscreen(b) \
- HDC _sgc=fl_gc; Window _sw=fl_window; \
- fl_gc=fl_makeDC(b); int _savedc = SaveDC(fl_gc); fl_window=(HWND)b; fl_push_no_clip()
+# define fl_begin_offscreen(b) \
+ HDC _sgc=fl_gc; Window _sw=fl_window; \
+ fl_gc=fl_makeDC(b); int _savedc = SaveDC(fl_gc); fl_window=(HWND)b; fl_push_no_clip()
-#define fl_end_offscreen() \
- fl_pop_clip(); RestoreDC(fl_gc, _savedc); DeleteDC(fl_gc); fl_window=_sw; fl_gc = _sgc
+# define fl_end_offscreen() \
+ fl_pop_clip(); RestoreDC(fl_gc, _savedc); DeleteDC(fl_gc); fl_window=_sw; fl_gc = _sgc
FL_EXPORT void fl_copy_offscreen(int x,int y,int w,int h,HBITMAP pixmap,int srcx,int srcy);
FL_EXPORT void fl_copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP pixmap,int srcx,int srcy);