summaryrefslogtreecommitdiff
path: root/cairo
diff options
context:
space:
mode:
Diffstat (limited to 'cairo')
-rw-r--r--cairo/Fl_Cairo.cxx166
-rw-r--r--cairo/Makefile173
2 files changed, 339 insertions, 0 deletions
diff --git a/cairo/Fl_Cairo.cxx b/cairo/Fl_Cairo.cxx
new file mode 100644
index 000000000..4fd456cce
--- /dev/null
+++ b/cairo/Fl_Cairo.cxx
@@ -0,0 +1,166 @@
+//
+// "$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
+//
+
+#include <config.h>
+
+#ifdef HAVE_CAIRO
+#include <FL/Fl.H>
+#include <FL/x.H>
+#include <FL/Fl_Window.H>
+
+// static Fl module initialization :
+Fl_Cairo_State Fl::cairo_state_; ///< contains all necesary info for current cairo context mapping
+
+
+// Fl cairo features implementation
+
+// Fl_Cairo_State class impl
+
+void Fl_Cairo_State::autolink(bool b) {
+#ifdef USE_CAIRO
+ autolink_ = b;
+#else
+ Fl::fatal("In Fl::autolink(bool) : Cairo autolink() feature is only "
+ "available with the enable-cairoext configure option, now quitting.");
+#endif
+}
+
+/**
+ Provides a corresponding cairo context for window \a wi.
+ This is needed in a draw() override if Fl::cairo_autolink_context()
+ returns false, which is the default.
+ The cairo_context() does not need to be freed as it is freed every time
+ a new cairo context is created. When the program terminates,
+ a call to Fl::cairo_make_current(0) will destroy any residual context.
+ \note A new cairo context is not always re-created when this method
+ is used. In particular, if the current graphical context and the current
+ window didn't change between two calls, the previous gc is internally kept,
+ thus optimizing the drawing performances.
+ Also, after this call, Fl::cairo_gc() is adequately updated with this
+ cairo context.
+ \note Only available when configure has the --enable-cairo option
+ \return the valid cairo_t* cairo context associated to this window.
+*/
+cairo_t * Fl::cairo_make_current(Fl_Window* wi) {
+ if (!wi) return NULL; // Precondition
+
+ if (fl_gc==0) { // means remove current cc
+ Fl::cairo_cc(0); // destroy any previous cc
+ cairo_state_.window(0);
+ return 0;
+ }
+
+ // don't re-create a context if it's the same gc/window couple
+ if (fl_gc==Fl::cairo_state_.gc() && fl_xid(wi) == (Window) Fl::cairo_state_.window())
+ return Fl::cairo_cc();
+
+ cairo_state_.window(wi);
+
+#if defined(USE_X11)
+ return Fl::cairo_make_current(0, wi->w(), wi->h());
+#else
+ return Fl::cairo_make_current(fl_gc, wi->w(), wi->h());
+#endif
+}
+
+/*
+ Creates transparently a cairo_surface_t object.
+ gc is an HDC context in WIN32, a CGContext* in Quartz, a display on X11
+ */
+static cairo_surface_t * cairo_create_surface(void * gc, int W, int H) {
+# if defined(USE_X11)
+ return cairo_xlib_surface_create(fl_display, fl_window, fl_visual->visual, W, H);
+# elif defined(WIN32)
+ return cairo_win32_surface_create((HDC) gc);
+# elif defined(__APPLE_QUARTZ__)
+ return cairo_quartz_surface_create_for_cg_context((CGContext*) gc, W, H);
+# else
+# error Cairo is not supported under this platform.
+# endif
+}
+
+/**
+ Creates a cairo context from a \a gc only, get its window size or offscreen size if fl_window is null.
+ \note Only available when configure has the --enable-cairo option
+*/
+cairo_t * Fl::cairo_make_current(void *gc) {
+ int W=0,H=0;
+#if defined(USE_X11)
+ //FIXME X11 get W,H
+ // gc will be the window handle here
+# warning FIXME get W,H for cairo_make_current(void*)
+#elif defined(__APPLE_QUARTZ__)
+ if (fl_window) {
+ Rect portRect;
+ GetPortBounds(GetWindowPort( fl_window ), &portRect);
+ W = portRect.right-portRect.left;
+ H = portRect.bottom-portRect.top;
+ }
+ else {
+ W = CGBitmapContextGetHeight(fl_gc);
+ H = CGBitmapContextGetHeight(fl_gc);
+ }
+#elif defined(WIN32)
+ // we don't need any W,H for WIN32
+#else
+# error Cairo is not supported under this platform.
+#endif
+ if (!gc) {
+ Fl::cairo_cc(0);
+ cairo_state_.gc(0); // keep track for next time
+ return 0;
+ }
+ if (gc==Fl::cairo_state_.gc() && fl_window== (Window) Fl::cairo_state_.window())
+ return Fl::cairo_cc();
+ cairo_state_.gc(fl_gc); // keep track for next time
+ cairo_surface_t * s = cairo_create_surface(gc, W, H);
+ cairo_t * c = cairo_create(s);
+ cairo_surface_destroy(s);
+ Fl::cairo_cc(c);
+ return c;
+}
+
+/**
+ Creates a cairo context from a \a gc and its size
+ \note Only available when configure has the --enable-cairo option
+*/
+cairo_t * Fl::cairo_make_current(void *gc, int W, int H) {
+ cairo_surface_t * s = cairo_create_surface(gc, W, H);
+ cairo_t * c = cairo_create(s);
+ cairo_surface_destroy(s);
+ Fl::cairo_cc(c);
+ return c;
+}
+#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
+
+//
+// End of "$Id$" .
+//
diff --git a/cairo/Makefile b/cairo/Makefile
new file mode 100644
index 000000000..8381369de
--- /dev/null
+++ b/cairo/Makefile
@@ -0,0 +1,173 @@
+#
+# "$Id: Makefile 5667 2007-02-07 02:35:44Z mike $"
+#
+# PNG library makefile for the Fast Light Toolkit (FLTK).
+#
+# Copyright 1997-2007 by Easy Software Products.
+#
+# 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 to "fltk-bugs@fltk.org".
+#
+
+include ../makeinclude
+
+#
+# Object files...
+#
+
+CAIROOBJECTS = Fl_Cairo.o
+
+$(CAIROLIBNAME): $(CAIROOBJECTS)
+ echo $(LIBCOMMAND) $@ ...
+ $(RM) $@
+ $(LIBCOMMAND) $@ $(CAIROOBJECTS)
+ $(RANLIB) $@
+
+libfltk_cairo.so.1.3: $(CAIROOBJECTS) libfltk.so.1.3
+ echo $(DSOCOMMAND) $@ ...
+ $(DSOCOMMAND) $@ $(CAIROOBJECTS) -L. $(IMAGELIBS) -lfltk
+ $(RM) libfltk_cairo.so
+ $(LN) libfltk_cairo.so.1.3 libfltk_cairo.so
+
+libfltk_cairo.sl.1.3: $(CAIROOBJECTS) libfltk.sl.1.3
+ echo $(DSOCOMMAND) $@ ...
+ $(DSOCOMMAND) $@ $(CAIROOBJECTS) -L. $(IMAGELIBS) -lfltk
+ $(RM) libfltk_cairo.sl
+ $(LN) libfltk_cairo.sl.1.3 libfltk_cairo.sl
+
+libfltk_cairo.1.3.dylib: $(CAIROOBJECTS) libfltk.1.3.dylib
+ echo $(DSOCOMMAND) $@ ...
+ $(DSOCOMMAND) $@ \
+ -install_name $(libdir)/$@ \
+ -current_version 1.3.0 \
+ -compatibility_version 1.3.0 \
+ $(CAIROOBJECTS) -L. $(LDLIBS) $(IMAGELIBS) -lfltk
+ $(RM) libfltk_cairo.dylib
+ $(LN) libfltk_cairo.1.3.dylib libfltk_cairo.dylib
+
+libfltk_cairo_s.a: $(CAIROOBJECTS)
+ echo $(DSOCOMMAND) libfltk_cairo_s.o ...
+ $(DSOCOMMAND) libfltk_cairo_s.o $(CAIROOBJECTS)
+ echo $(LIBCOMMAND) libfltk_cairo_s.a libfltk_cairo_s.o
+ $(RM) $@
+ $(LIBCOMMAND) libfltk_cairo_s.a libfltk_cairo_s.o
+ $(CHMOD) +x libfltk_cairo_s.a
+
+
+cygfltknox_cairo-1.3.dll: $(CAIROLIBNAME) cygfltknox-1.3.dll
+ echo $(DSOCOMMAND) $(CAIROLIBNAME) ...
+ $(DSOCOMMAND) $(CAIROLIBNAME) -Wl,--no-whole-archive \
+ -Wl,--out-implib=libfltk_cairo.dll.a \
+ -L. -lfltk $(CAIROLIBS) $(LDLIBS)
+
+mgwfltknox_cairo-1.3.dll: $(CAIROLIBNAME) mgwfltknox-1.3.dll
+ echo $(DSOCOMMAND) $(CAIROLIBNAME) ...
+ $(DSOCOMMAND) $(CAIROLIBNAME) -Wl,--no-whole-archive \
+ -Wl,--out-implib=libfltk_cairo.dll.a \
+ -L. -lfltk $(CAIROLIBS) $(LDLIBS)
+
+#
+# Make all of the targets...
+#
+
+all: $(CAIROLIBNAME) $(CAIRODSONAME)
+
+
+#
+# Clean all of the targets and object files...
+#
+
+clean:
+ -$(RM) *.o *.dll.a core.* *~ *.bak *.bck
+ -$(RM) $(CAIROOBJECTS) $(CAIROLIBNAME) $(CAIRODSONAME) \
+ libfltk_cairo.so libfltk_cairo.sl libfltk_cairo.dylib
+
+#
+# Install everything...
+#
+
+install: $(CAIROLIBNAME) $(CAIRODSONAME)
+ echo "Installing libfltk_cairo$(LIBEXT) in $(libdir)..."
+ -$(INSTALL_DIR) $(DESTDIR)$(libdir)
+ $(INSTALL_LIB) $(CAIROLIBNAME) $(DESTDIR)$(libdir)
+
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.so.1.3; then\
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.so*;\
+ $(INSTALL_LIB) libfltk_cairo.so.1.3 $(DESTDIR)$(libdir); \
+ $(LN) libfltk_cairo.so.1.3 $(DESTDIR)$(libdir)/libfltk_cairo.so;\
+ fi
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.sl.1.3; then\
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.sl*;\
+ $(INSTALL_LIB) libfltk_cairo.sl.1.3 $(DESTDIR)$(libdir); \
+ $(LN) libfltk_cairo.sl.1.3 $(DESTDIR)$(libdir)/libfltk_cairo.sl;\
+ fi
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.1.3.dylib; then\
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.*dylib;\
+ $(INSTALL_LIB) libfltk_cairo.1.3.dylib $(DESTDIR)$(libdir); \
+ $(LN) libfltk_cairo.1.3.dylib $(DESTDIR)$(libdir)/libfltk_cairo.dylib;\
+ fi
+ if test x$(CAIRODSONAME) = xlibfltk_cairo_s.a; then\
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo_s.a;\
+ $(INSTALL_LIB) libfltk_cairo_s.a $(DESTDIR)$(libdir); \
+ fi
+ if test x$(CAIRODSONAME) = xcygfltknox_cairo-1.3.dll; then\
+ $(RM) $(DESTDIR)$(bindir)/$(CAIRODSONAME); \
+ $(INSTALL_LIB) $(CAIRODSONAME) $(DESTDIR)$(bindir); \
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.dll.a;\
+ $(INSTALL_LIB) libfltk_cairo.dll.a $(DESTDIR)$(libdir); \
+ fi
+ if test x$(CAIRODSONAME) = xmgwfltknox_cairo-1.3.dll; then\
+ $(RM) $(DESTDIR)$(bindir)/$(CAIRODSONAME); \
+ $(INSTALL_LIB) $(CAIRODSONAME) $(DESTDIR)$(bindir); \
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.dll.a;\
+ $(INSTALL_LIB) libfltk_cairo.dll.a $(DESTDIR)$(libdir); \
+ fi
+#
+# Uninstall everything...
+#
+
+uninstall:
+ echo "Uninstalling libfltk_cairo$(LIBEXT) in $(libdir)..."
+ if test x$(CAIROLIBNAME) != x; then\
+ $(RM) $(DESTDIR)$(libdir)/$(CAIROLIBNAME);\
+ fi
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.so.1.3; then\
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.so*;\
+ fi
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.sl.1.3; then\
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.sl*;\
+ fi
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.1.3.dylib; then\
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.*dylib;\
+ fi
+ if test x$(CAIRODSONAME) = xlibfltk_cairo_s.a; then\
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo_s.a;\
+ fi
+ if test x$(CAIRODSONAME) = xcygfltknox_cairo-1.3.dll; then\
+ $(RM) $(DESTDIR)$(bindir)/$(CAIRODSONAME); \
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.dll.a;\
+ fi
+ if test x$(CAIRODSONAME) = xmgwfltknox_cairo-1.3.dll; then\
+ $(RM) $(DESTDIR)$(bindir)/$(CAIRODSONAME); \
+ $(RM) $(DESTDIR)$(libdir)/libfltk_cairo.dll.a;\
+ fi
+
+$(CAIROOBJECTS): ../makeinclude
+
+#
+# End of "$Id: Makefile 5667 2007-02-07 02:35:44Z mike $".
+#