diff options
Diffstat (limited to 'cairo')
| -rw-r--r-- | cairo/Fl_Cairo.cxx | 166 | ||||
| -rw-r--r-- | cairo/Makefile | 173 |
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 $". +# |
