summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Bitmap.cxx12
-rw-r--r--src/Fl_Device.cxx6
-rw-r--r--src/Fl_Double_Window.cxx13
-rw-r--r--src/Fl_Image.cxx93
-rw-r--r--src/Fl_Image_Surface.cxx8
-rw-r--r--src/Fl_Paged_Device.cxx6
-rw-r--r--src/Fl_Pixmap.cxx10
-rw-r--r--src/Fl_Quartz_Printer.mm1
-rw-r--r--src/Fl_cocoa.mm3
-rw-r--r--src/drivers/GDI/Fl_GDI_Graphics_Driver_color.cxx4
-rw-r--r--src/drivers/GDI/Fl_GDI_Graphics_Driver_rect.cxx4
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver.cxx41
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver.h17
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_arci.cxx6
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_color.cxx5
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx7
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx122
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_line_style.cxx16
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx14
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_vertex.cxx6
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.cxx34
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.h42
-rw-r--r--src/fl_arci.cxx8
-rw-r--r--src/fl_color.cxx12
-rw-r--r--src/fl_draw_image.cxx2
-rw-r--r--src/fl_font.cxx2
-rw-r--r--src/fl_line_style.cxx9
-rw-r--r--src/fl_rect.cxx6
-rw-r--r--src/fl_vertex.cxx6
29 files changed, 319 insertions, 196 deletions
diff --git a/src/Fl_Bitmap.cxx b/src/Fl_Bitmap.cxx
index 52add9f97..0c64cc4da 100644
--- a/src/Fl_Bitmap.cxx
+++ b/src/Fl_Bitmap.cxx
@@ -275,18 +275,6 @@ int Fl_Bitmap::start(int XP, int YP, int WP, int HP, int &cx, int &cy,
}
#ifdef __APPLE__
-void Fl_Quartz_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy) {
- int X, Y, W, H;
- if (bm->start(XP, YP, WP, HP, cx, cy, X, Y, W, H)) {
- return;
- }
- if (bm->id_ && fl_gc) {
- CGRect rect = { { (CGFloat)X, (CGFloat)Y }, { (CGFloat)W, (CGFloat)H } };
- Fl_X::q_begin_image(rect, cx, cy, bm->w(), bm->h());
- CGContextDrawImage(fl_gc, rect, (CGImageRef)bm->id_);
- Fl_X::q_end_image();
- }
-}
#elif defined(WIN32)
void Fl_GDI_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy) {
diff --git a/src/Fl_Device.cxx b/src/Fl_Device.cxx
index 418157b7e..0dffc580c 100644
--- a/src/Fl_Device.cxx
+++ b/src/Fl_Device.cxx
@@ -20,6 +20,11 @@
#include <FL/Fl_Device.H>
#include <FL/Fl_Image.H>
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+#include "drivers/Quartz/Fl_Quartz_Graphics_Driver.h"
+#endif
+
#if defined(WIN32) || defined(__APPLE__)
#elif defined(FL_PORTING)
# pragma message "FL_PORTING: instantiate and implement various device drivers here"
@@ -31,7 +36,6 @@ const char *Fl_Surface_Device::class_id = "Fl_Surface_Device";
const char *Fl_Display_Device::class_id = "Fl_Display_Device";
const char *Fl_Graphics_Driver::class_id = "Fl_Graphics_Driver";
#if defined(__APPLE__) || defined(FL_DOXYGEN)
-const char *Fl_Quartz_Graphics_Driver::class_id = "Fl_Quartz_Graphics_Driver";
# ifndef FL_DOXYGEN
bool Fl_Display_Device::high_res_window_ = false;
# endif
diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx
index b3b82d851..8dd51133d 100644
--- a/src/Fl_Double_Window.cxx
+++ b/src/Fl_Double_Window.cxx
@@ -238,21 +238,12 @@ void Fl_GDI_Graphics_Driver::copy_offscreen_with_alpha(int x,int y,int w,int h,H
#elif defined(__APPLE_QUARTZ__) || defined(FL_DOXYGEN)
+#include "src/drivers/Quartz/Fl_Quartz_Graphics_Driver.h"
+
char fl_can_do_alpha_blending() {
return 1;
}
-#if ! defined(FL_DOXYGEN)
-Fl_Offscreen Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(int w, int h) {
- void *data = calloc(w*h,4);
- CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
- CGContextRef ctx = CGBitmapContextCreate(
- data, w, h, 8, w*4, lut, kCGImageAlphaPremultipliedLast);
- CGColorSpaceRelease(lut);
- return (Fl_Offscreen)ctx;
-}
-#endif
-
/** \addtogroup fl_drawings
@{
*/
diff --git a/src/Fl_Image.cxx b/src/Fl_Image.cxx
index da049386a..b4f6ddb9a 100644
--- a/src/Fl_Image.cxx
+++ b/src/Fl_Image.cxx
@@ -629,22 +629,6 @@ void Fl_RGB_Image::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
fl_graphics_driver->draw(this, XP, YP, WP, HP, cx, cy);
}
-static int start(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int w, int h, int &cx, int &cy,
- int &X, int &Y, int &W, int &H)
-{
- // account for current clip region (faster on Irix):
- fl_clip_box(XP,YP,WP,HP,X,Y,W,H);
- cx += X-XP; cy += Y-YP;
- // clip the box down to the size of image, quit if empty:
- if (cx < 0) {W += cx; X -= cx; cx = 0;}
- if (cx+W > w) W = w-cx;
- if (W <= 0) return 1;
- if (cy < 0) {H += cy; Y -= cy; cy = 0;}
- if (cy+H > h) H = h-cy;
- if (H <= 0) return 1;
- return 0;
-}
-
/** Draws an Fl_Image scaled to width \p W & height \p H with top-left corner at \em X,Y
\return zero when the graphics driver doesn't implement scaled drawing, non-zero if it does implement it.
*/
@@ -653,83 +637,6 @@ int Fl_Graphics_Driver::draw_scaled(Fl_Image *img, int X, int Y, int W, int H) {
}
#ifdef __APPLE__
-static void imgProviderReleaseData (void *info, const void *data, size_t size)
-{
- if (!info || *(bool*)info) delete[] (unsigned char *)data;
- delete (bool*)info;
-}
-
-void Fl_Quartz_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy) {
- int X, Y, W, H;
- // Don't draw an empty image...
- if (!img->d() || !img->array) {
- img->draw_empty(XP, YP);
- return;
- }
- if (start(img, XP, YP, WP, HP, img->w(), img->h(), cx, cy, X, Y, W, H)) {
- return;
- }
- if (!img->id_) {
- CGColorSpaceRef lut = img->d()<=2 ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();
- int ld = img->ld();
- if (!ld) ld = img->w() * img->d();
- // If img->alloc_array == 0, the CGImage data provider must not release the image data.
- // If img->alloc_array != 0, the CGImage data provider will take responsibilty of deleting RGB image data after use:
- // when the CGImage is deallocated, the release callback of its data provider
- // (imgProviderReleaseData) is called and can delete the RGB image data.
- // If the CGImage is printed, it is not deallocated until after the end of the page,
- // therefore, with img->alloc_array != 0, the RGB image can be safely deleted any time after return from this function.
- // The previously unused mask_ member allows to make sure the RGB image data is not deleted by Fl_RGB_Image::uncache().
- if (img->alloc_array) img->mask_ = new bool(true);
- CGDataProviderRef src = CGDataProviderCreateWithData(img->mask_, img->array, ld * img->h(),
- img->alloc_array?imgProviderReleaseData:NULL);
- img->id_ = CGImageCreate(img->w(), img->h(), 8, img->d()*8, ld,
- lut, (img->d()&1)?kCGImageAlphaNone:kCGImageAlphaLast,
- src, 0L, false, kCGRenderingIntentDefault);
- CGColorSpaceRelease(lut);
- CGDataProviderRelease(src);
- }
- if (img->id_ && fl_gc) {
- if (!img->alloc_array && has_feature(PRINTER) && !CGImageGetShouldInterpolate((CGImageRef)img->id_)) {
- // When printing, the image data is used when the page is completed, that is, after return from this function.
- // If the image has alloc_array = 0, we must protect against image data being freed before it is used:
- // we duplicate the image data and have it deleted after use by the release-callback of the CGImage data provider
- Fl_RGB_Image* img2 = (Fl_RGB_Image*)img->copy();
- img2->alloc_array = 0;
- const uchar *img_bytes = img2->array;
- int ld = img2->ld();
- if (!ld) ld = img2->w() * img2->d();
- delete img2;
- img->uncache();
- CGColorSpaceRef lut = img->d()<=2 ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();
- CGDataProviderRef src = CGDataProviderCreateWithData( NULL, img_bytes, ld * img->h(), imgProviderReleaseData);
- img->id_ = CGImageCreate(img->w(), img->h(), 8, img->d()*8, ld,
- lut, (img->d()&1)?kCGImageAlphaNone:kCGImageAlphaLast,
- src, 0L, true, kCGRenderingIntentDefault);
- CGColorSpaceRelease(lut);
- CGDataProviderRelease(src);
- }
- CGRect rect = CGRectMake(X, Y, W, H);
- Fl_X::q_begin_image(rect, cx, cy, img->w(), img->h());
- CGContextDrawImage(fl_gc, rect, (CGImageRef)img->id_);
- Fl_X::q_end_image();
- }
-}
-
-int Fl_Quartz_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) {
- int X, Y, W, H;
- fl_clip_box(XP,YP,WP,HP,X,Y,W,H); // X,Y,W,H will give the unclipped area of XP,YP,WP,HP
- if (W == 0 || H == 0) return 1;
- fl_push_no_clip(); // remove the FLTK clip that can't be rescaled
- CGContextSaveGState(fl_gc);
- CGContextClipToRect(fl_gc, CGRectMake(X, Y, W, H)); // this clip path will be rescaled & translated
- CGContextTranslateCTM(fl_gc, XP, YP);
- CGContextScaleCTM(fl_gc, float(WP)/img->w(), float(HP)/img->h());
- img->draw(0, 0, img->w(), img->h(), 0, 0);
- CGContextRestoreGState(fl_gc);
- fl_pop_clip(); // restore FLTK's clip
- return 1;
-}
#elif defined(WIN32)
static Fl_Offscreen build_id(Fl_RGB_Image *img, void **pmask)
diff --git a/src/Fl_Image_Surface.cxx b/src/Fl_Image_Surface.cxx
index 7f6198967..48b97ccfd 100644
--- a/src/Fl_Image_Surface.cxx
+++ b/src/Fl_Image_Surface.cxx
@@ -20,7 +20,13 @@
#include <FL/Fl_Printer.H>
#include <FL/Fl.H>
-#if defined(WIN32) || defined(__APPLE__)
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+#include "drivers/Quartz/Fl_Quartz_Graphics_Driver.h"
+#endif
+
+#if defined(WIN32)
+#elif defined(__APPLE__)
#elif defined(FL_PORTING)
# pragma message "FL_PORTING: implement image surface handling here"
#else
diff --git a/src/Fl_Paged_Device.cxx b/src/Fl_Paged_Device.cxx
index ccd63bf78..c951b4345 100644
--- a/src/Fl_Paged_Device.cxx
+++ b/src/Fl_Paged_Device.cxx
@@ -23,8 +23,12 @@
#include <FL/Fl.H>
#include <FL/fl_draw.H>
-const char *Fl_Paged_Device::class_id = "Fl_Paged_Device";
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+#include "drivers/Quartz/Fl_Quartz_Graphics_Driver.h"
+#endif
+const char *Fl_Paged_Device::class_id = "Fl_Paged_Device";
/**
@brief Draws the widget on the printed page.
diff --git a/src/Fl_Pixmap.cxx b/src/Fl_Pixmap.cxx
index da0c35c65..332def3c6 100644
--- a/src/Fl_Pixmap.cxx
+++ b/src/Fl_Pixmap.cxx
@@ -32,7 +32,9 @@
#include <FL/Fl_Pixmap.H>
#include <FL/Fl_Printer.H>
-#if defined(WIN32) || defined(__APPLE__)
+#if defined(WIN32)
+#elif defined(__APPLE__)
+#include "src/drivers/Quartz/Fl_Quartz_Graphics_Driver.h"
#elif defined(FL_PORTING)
# pragma message "FL_PORTING: this file needs a lot of custom code to draw Pixmaps correctly"
#else
@@ -146,12 +148,6 @@ int Fl_Pixmap::prepare(int XP, int YP, int WP, int HP, int &cx, int &cy,
#ifdef __APPLE__ // Apple, Mac OS X
//------------------------------------------------------------------------------
-void Fl_Quartz_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy) {
- int X, Y, W, H;
- if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return;
- copy_offscreen(X, Y, W, H, (Fl_Offscreen)pxm->id_, cx, cy);
-}
-
//------------------------------------------------------------------------------
#elif defined(WIN32) // Windows GDI
//------------------------------------------------------------------------------
diff --git a/src/Fl_Quartz_Printer.mm b/src/Fl_Quartz_Printer.mm
index 58153489b..739a67070 100644
--- a/src/Fl_Quartz_Printer.mm
+++ b/src/Fl_Quartz_Printer.mm
@@ -18,6 +18,7 @@
#ifdef __APPLE__
#include <FL/Fl_Printer.H>
+#include "drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.h"
#include <FL/Fl.H>
#include <FL/fl_ask.H>
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm
index 7c12a2136..3e0bbbb44 100644
--- a/src/Fl_cocoa.mm
+++ b/src/Fl_cocoa.mm
@@ -43,6 +43,7 @@ extern "C" {
#include <FL/Fl_Tooltip.H>
#include <FL/Fl_Printer.H>
#include <FL/Fl_Copy_Surface.H>
+#include "drivers/Quartz/Fl_Quartz_Graphics_Driver.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -54,6 +55,8 @@ extern "C" {
#import <Cocoa/Cocoa.h>
+
+
// #define DEBUG_SELECT // UNCOMMENT FOR SELECT()/THREAD DEBUGGING
#ifdef DEBUG_SELECT
#include <stdio.h> // testing
diff --git a/src/drivers/GDI/Fl_GDI_Graphics_Driver_color.cxx b/src/drivers/GDI/Fl_GDI_Graphics_Driver_color.cxx
index 2113b13b5..24744a927 100644
--- a/src/drivers/GDI/Fl_GDI_Graphics_Driver_color.cxx
+++ b/src/drivers/GDI/Fl_GDI_Graphics_Driver_color.cxx
@@ -34,10 +34,6 @@
// FIXME: maybe we can forget about color mapping and assume RGB?
-static unsigned fl_cmap[256] = {
-#include "../../fl_cmap.h" // this is a file produced by "cmap.cxx":
-};
-
// Translations to win32 data structures:
Fl_XMap fl_xmap[256];
diff --git a/src/drivers/GDI/Fl_GDI_Graphics_Driver_rect.cxx b/src/drivers/GDI/Fl_GDI_Graphics_Driver_rect.cxx
index 5adb0056d..f3077119e 100644
--- a/src/drivers/GDI/Fl_GDI_Graphics_Driver_rect.cxx
+++ b/src/drivers/GDI/Fl_GDI_Graphics_Driver_rect.cxx
@@ -16,8 +16,6 @@
// http://www.fltk.org/str.php
//
-#ifndef FL_CFG_GFX_QUARTZ_RECT_CXX
-#define FL_CFG_GFX_QUARTZ_RECT_CXX
/**
@@ -232,8 +230,6 @@ void Fl_GDI_Graphics_Driver::restore_clip() {
}
-#endif // FL_CFG_GFX_GDI_RECT_CXX
-
//
// End of "$Id$".
//
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.cxx
new file mode 100644
index 000000000..3e0f8e319
--- /dev/null
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.cxx
@@ -0,0 +1,41 @@
+//
+// "$Id$"
+//
+// Rectangle drawing routines for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2016 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+
+#include "../../config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
+#include "Fl_Quartz_Graphics_Driver.h"
+
+
+const char *Fl_Quartz_Graphics_Driver::class_id = "Fl_Quartz_Graphics_Driver";
+
+Fl_Offscreen Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(int w, int h) {
+ void *data = calloc(w*h,4);
+ CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
+ CGContextRef ctx = CGBitmapContextCreate(data, w, h, 8, w*4, lut, kCGImageAlphaPremultipliedLast);
+ CGColorSpaceRelease(lut);
+ return (Fl_Offscreen)ctx;
+}
+
+
+#endif // FL_CFG_GFX_QUARTZ
+
+//
+// End of "$Id$".
+//
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.h b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.h
index 150e51358..829c3dd5e 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.h
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.h
@@ -22,8 +22,11 @@
\brief Definition of Apple Quartz graphics driver.
*/
-#ifndef FL_CFG_GFX_QUARTZ_H
-#define FL_CFG_GFX_QUARTZ_H
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
+#ifndef FL_QUARTZ_GRAPHICS_DRIVER_H
+#define FL_QUARTZ_GRAPHICS_DRIVER_H
#include <FL/Fl_Device.H>
@@ -117,15 +120,9 @@ protected:
};
-/** Graphics driver used for Mac OS X printing. */
-class Fl_Quartz_Printer_Graphics_Driver : public Fl_Quartz_Graphics_Driver {
-public:
- virtual int has_feature(driver_feature mask) { return mask & (NATIVE | PRINTER); }
-};
-
-
+#endif // FL_QUARTZ_GRAPHICS_DRIVER_H
-#endif // FL_CFG_GFX_QUARTZ_H
+#endif // FL_CFG_GFX_QUARTZ
//
// End of "$Id: quartz.H 11017 2016-01-20 21:40:12Z matt $".
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_arci.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_arci.cxx
index c6288d7fe..2375c3ef3 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_arci.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_arci.cxx
@@ -16,8 +16,8 @@
// http://www.fltk.org/str.php
//
-#ifndef FL_CFG_GFX_QUARTZ_ARCI_CXX
-#define FL_CFG_GFX_QUARTZ_ARCI_CXX
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
#include "Fl_Quartz_Graphics_Driver.h"
@@ -68,7 +68,7 @@ void Fl_Quartz_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2)
CGContextSetShouldAntialias(fl_gc, false);
}
-#endif // FL_CFG_GFX_QUARTZ_ARCI_CXX
+#endif // FL_CFG_GFX_QUARTZ
//
// End of "$Id$".
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_color.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_color.cxx
index 178fb6604..1a4b11aea 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_color.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_color.cxx
@@ -16,6 +16,9 @@
// http://www.fltk.org/str.php
//
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
// The fltk "colormap". This allows ui colors to be stored in 8-bit
// locations, and provides a level of indirection so that global color
// changes can be made. Not to be confused with the X colormap, which
@@ -77,6 +80,8 @@ void Fl::set_color(Fl_Color i, unsigned c) {
}
}
+#endif // FL_CFG_GFX_QUARTZ
+
//
// End of "$Id$".
//
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx
index b48a14f4a..cdcbd2cf2 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx
@@ -16,10 +16,15 @@
// http://www.fltk.org/str.php
//
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
#include "Fl_Quartz_Graphics_Driver.h"
#include <config.h>
#include <math.h>
+#include <FL/Fl.H>
+#include <FL/fl_utf8.h>
Fl_Fontdesc* fl_fonts = NULL;
@@ -583,6 +588,8 @@ void Fl_Quartz_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) {
draw(c, n, x - w - dx, y);
}
+#endif // FL_CFG_GFX_QUARTZ
+
//
// End of "$Id$".
//
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx
index 87fcbc068..8b3229459 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx
@@ -16,7 +16,10 @@
// http://www.fltk.org/str.php
//
-////////////////////////////////////////////////////////////////
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
+#include "Fl_Quartz_Graphics_Driver.h"
#include <config.h>
#include <FL/Fl.H>
@@ -162,6 +165,123 @@ void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
fl_rectf(x,y,w,h);
}
+void Fl_Quartz_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy) {
+ int X, Y, W, H;
+ if (bm->start(XP, YP, WP, HP, cx, cy, X, Y, W, H)) {
+ return;
+ }
+ if (bm->id_ && fl_gc) {
+ CGRect rect = { { (CGFloat)X, (CGFloat)Y }, { (CGFloat)W, (CGFloat)H } };
+ Fl_X::q_begin_image(rect, cx, cy, bm->w(), bm->h());
+ CGContextDrawImage(fl_gc, rect, (CGImageRef)bm->id_);
+ Fl_X::q_end_image();
+ }
+}
+
+static void imgProviderReleaseData (void *info, const void *data, size_t size)
+{
+ if (!info || *(bool*)info) delete[] (unsigned char *)data;
+ delete (bool*)info;
+}
+
+static int start(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int w, int h, int &cx, int &cy,
+ int &X, int &Y, int &W, int &H)
+{
+ // account for current clip region (faster on Irix):
+ fl_clip_box(XP,YP,WP,HP,X,Y,W,H);
+ cx += X-XP; cy += Y-YP;
+ // clip the box down to the size of image, quit if empty:
+ if (cx < 0) {W += cx; X -= cx; cx = 0;}
+ if (cx+W > w) W = w-cx;
+ if (W <= 0) return 1;
+ if (cy < 0) {H += cy; Y -= cy; cy = 0;}
+ if (cy+H > h) H = h-cy;
+ if (H <= 0) return 1;
+ return 0;
+}
+
+void Fl_Quartz_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy) {
+ int X, Y, W, H;
+ // Don't draw an empty image...
+ if (!img->d() || !img->array) {
+ img->draw_empty(XP, YP);
+ return;
+ }
+ if (start(img, XP, YP, WP, HP, img->w(), img->h(), cx, cy, X, Y, W, H)) {
+ return;
+ }
+ if (!img->id_) {
+ CGColorSpaceRef lut = img->d()<=2 ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();
+ int ld = img->ld();
+ if (!ld) ld = img->w() * img->d();
+ // If img->alloc_array == 0, the CGImage data provider must not release the image data.
+ // If img->alloc_array != 0, the CGImage data provider will take responsibilty of deleting RGB image data after use:
+ // when the CGImage is deallocated, the release callback of its data provider
+ // (imgProviderReleaseData) is called and can delete the RGB image data.
+ // If the CGImage is printed, it is not deallocated until after the end of the page,
+ // therefore, with img->alloc_array != 0, the RGB image can be safely deleted any time after return from this function.
+ // The previously unused mask_ member allows to make sure the RGB image data is not deleted by Fl_RGB_Image::uncache().
+ if (img->alloc_array) img->mask_ = new bool(true);
+ CGDataProviderRef src = CGDataProviderCreateWithData(img->mask_, img->array, ld * img->h(),
+ img->alloc_array?imgProviderReleaseData:NULL);
+ img->id_ = CGImageCreate(img->w(), img->h(), 8, img->d()*8, ld,
+ lut, (img->d()&1)?kCGImageAlphaNone:kCGImageAlphaLast,
+ src, 0L, false, kCGRenderingIntentDefault);
+ CGColorSpaceRelease(lut);
+ CGDataProviderRelease(src);
+ }
+ if (img->id_ && fl_gc) {
+ if (!img->alloc_array && has_feature(PRINTER) && !CGImageGetShouldInterpolate((CGImageRef)img->id_)) {
+ // When printing, the image data is used when the page is completed, that is, after return from this function.
+ // If the image has alloc_array = 0, we must protect against image data being freed before it is used:
+ // we duplicate the image data and have it deleted after use by the release-callback of the CGImage data provider
+ Fl_RGB_Image* img2 = (Fl_RGB_Image*)img->copy();
+ img2->alloc_array = 0;
+ const uchar *img_bytes = img2->array;
+ int ld = img2->ld();
+ if (!ld) ld = img2->w() * img2->d();
+ delete img2;
+ img->uncache();
+ CGColorSpaceRef lut = img->d()<=2 ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();
+ CGDataProviderRef src = CGDataProviderCreateWithData( NULL, img_bytes, ld * img->h(), imgProviderReleaseData);
+ img->id_ = CGImageCreate(img->w(), img->h(), 8, img->d()*8, ld,
+ lut, (img->d()&1)?kCGImageAlphaNone:kCGImageAlphaLast,
+ src, 0L, true, kCGRenderingIntentDefault);
+ CGColorSpaceRelease(lut);
+ CGDataProviderRelease(src);
+ }
+ CGRect rect = CGRectMake(X, Y, W, H);
+ Fl_X::q_begin_image(rect, cx, cy, img->w(), img->h());
+ CGContextDrawImage(fl_gc, rect, (CGImageRef)img->id_);
+ Fl_X::q_end_image();
+ }
+}
+
+int Fl_Quartz_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) {
+ int X, Y, W, H;
+ fl_clip_box(XP,YP,WP,HP,X,Y,W,H); // X,Y,W,H will give the unclipped area of XP,YP,WP,HP
+ if (W == 0 || H == 0) return 1;
+ fl_push_no_clip(); // remove the FLTK clip that can't be rescaled
+ CGContextSaveGState(fl_gc);
+ CGContextClipToRect(fl_gc, CGRectMake(X, Y, W, H)); // this clip path will be rescaled & translated
+ CGContextTranslateCTM(fl_gc, XP, YP);
+ CGContextScaleCTM(fl_gc, float(WP)/img->w(), float(HP)/img->h());
+ img->draw(0, 0, img->w(), img->h(), 0, 0);
+ CGContextRestoreGState(fl_gc);
+ fl_pop_clip(); // restore FLTK's clip
+ return 1;
+}
+
+void Fl_Quartz_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy) {
+ int X, Y, W, H;
+ if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return;
+ copy_offscreen(X, Y, W, H, (Fl_Offscreen)pxm->id_, cx, cy);
+}
+
+
+
+#endif // FL_CFG_GFX_QUARTZ
+
//
// End of "$Id$".
//
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_line_style.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_line_style.cxx
index a70a067b6..e680ea43a 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_line_style.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_line_style.cxx
@@ -16,8 +16,12 @@
// http://www.fltk.org/str.php
//
-#ifndef FL_CFG_GFX_QUARTZ_LINE_STYLE_CXX
-#define FL_CFG_GFX_QUARTZ_LINE_STYLE_CXX
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
+#include <FL/fl_draw.h>
+
+extern int fl_line_width_;
/**
\file quartz_line_style.cxx
@@ -53,9 +57,11 @@ void Fl_Quartz_Graphics_Driver::line_style(int style, int width, char* dashes) {
fl_quartz_line_width_ = (float)width;
fl_quartz_line_cap_ = Cap[(style>>8)&3];
// when printing kCGLineCapSquare seems better for solid lines
- if ( Fl_Surface_Device::surface() != Fl_Display_Device::display_device() && style == FL_SOLID && dashes == NULL ) {
+ if ( Fl_Surface_Device::surface() != Fl_Display_Device::display_device()
+ && style == FL_SOLID && dashes == NULL )
+ {
fl_quartz_line_cap_ = kCGLineCapSquare;
- }
+ }
fl_quartz_line_join_ = Join[(style>>12)&3];
char *d = dashes;
static CGFloat pattern[16];
@@ -91,7 +97,7 @@ void Fl_Quartz_Graphics_Driver::line_style(int style, int width, char* dashes) {
fl_quartz_restore_line_style_();
}
-#endif // FL_CFG_GFX_QUARTZ_LINE_STYLE_CXX
+#endif // FL_CFG_GFX_QUARTZ
//
// End of "$Id$".
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
index c4f3c9973..fed0a6a4c 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
@@ -17,8 +17,10 @@
//
-#ifndef FL_CFG_GFX_QUARTZ_RECT_CXX
-#define FL_CFG_GFX_QUARTZ_RECT_CXX
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
+#include <FL/Fl.H>
/**
@@ -210,7 +212,7 @@ void Fl_Quartz_Graphics_Driver::push_clip(int x, int y, int w, int h) {
}
if (rstackptr < region_stack_max) rstack[++rstackptr] = r;
else Fl::warning("Fl_Quartz_Graphics_Driver::push_clip: clip stack overflow!\n");
- fl_restore_clip();
+ restore_clip();
}
int Fl_Quartz_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y, int& W, int& H){
@@ -251,7 +253,7 @@ int Fl_Quartz_Graphics_Driver::not_clipped(int x, int y, int w, int h) {
void Fl_Quartz_Graphics_Driver::push_no_clip() {
if (rstackptr < region_stack_max) rstack[++rstackptr] = 0;
else Fl::warning("Fl_Quartz_Graphics_Driver::push_no_clip: clip stack overflow!\n");
- fl_restore_clip();
+ restore_clip();
}
// pop back to previous clip:
@@ -260,7 +262,7 @@ void Fl_Quartz_Graphics_Driver::pop_clip() {
Fl_Region oldr = rstack[rstackptr--];
if (oldr) XDestroyRegion(oldr);
} else Fl::warning("Fl_Quartz_Graphics_Driver::pop_clip: clip stack underflow!\n");
- fl_restore_clip();
+ restore_clip();
}
void Fl_Quartz_Graphics_Driver::restore_clip() {
@@ -277,7 +279,7 @@ void Fl_Quartz_Graphics_Driver::restore_clip() {
}
-#endif // FL_CFG_GFX_QUARTZ_RECT_CXX
+#endif // FL_CFG_GFX_QUARTZ
//
// End of "$Id$".
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_vertex.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_vertex.cxx
index b7404e299..83316507c 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_vertex.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_vertex.cxx
@@ -16,8 +16,8 @@
// http://www.fltk.org/str.php
//
-#ifndef FL_CFG_GFX_QUARTZ_VERTEX_CXX
-#define FL_CFG_GFX_QUARTZ_VERTEX_CXX
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
/**
\file quartz_vertex.cxx
@@ -135,7 +135,7 @@ void Fl_Quartz_Graphics_Driver::circle(double x, double y,double r) {
CGContextSetShouldAntialias(fl_gc, false);
}
-#endif // FL_CFG_GFX_QUARTZ_VERTEX_CXX
+#endif // FL_CFG_GFX_QUARTZ
//
// End of "$Id$".
diff --git a/src/drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.cxx b/src/drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.cxx
new file mode 100644
index 000000000..73d24bd0f
--- /dev/null
+++ b/src/drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.cxx
@@ -0,0 +1,34 @@
+//
+// "$Id$"
+//
+// Rectangle drawing routines for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2016 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+
+#include "config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
+#include "Fl_Quartz_Printer_Graphics_Driver.h"
+
+int Fl_Quartz_Printer_Graphics_Driver::has_feature(driver_feature mask)
+{
+ return mask & (NATIVE | PRINTER);
+}
+
+#endif // FL_CFG_GFX_QUARTZ
+
+//
+// End of "$Id$".
+//
diff --git a/src/drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.h b/src/drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.h
new file mode 100644
index 000000000..38c865f36
--- /dev/null
+++ b/src/drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.h
@@ -0,0 +1,42 @@
+//
+// "$Id: quartz.H 11017 2016-01-20 21:40:12Z matt $"
+//
+// Definition of Apple Quartz graphics driver
+// for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2010-2016 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+#include "../../config_lib.h"
+#ifdef FL_CFG_GFX_QUARTZ
+
+#ifndef FL_QUARTZ_PRINTER_GRAPHICS_DRIVER_H
+#define FL_QUARTZ_PRINTER_GRAPHICS_DRIVER_H
+
+#include "Fl_Quartz_Graphics_Driver.h"
+
+
+/** Graphics driver used for Mac OS X printing. */
+class Fl_Quartz_Printer_Graphics_Driver : public Fl_Quartz_Graphics_Driver {
+public:
+ virtual int has_feature(driver_feature mask);
+};
+
+
+#endif // FL_QUARTZ_PRINTER_GRAPHICS_DRIVER_H
+
+#endif // FL_CFG_GFX_QUARTZ
+
+//
+// End of "$Id: quartz.H 11017 2016-01-20 21:40:12Z matt $".
+//
diff --git a/src/fl_arci.cxx b/src/fl_arci.cxx
index 3f5db09c6..b436ae900 100644
--- a/src/fl_arci.cxx
+++ b/src/fl_arci.cxx
@@ -35,14 +35,8 @@
#include <config.h>
#include "config_lib.h"
-// -----------------------------------------------------------------------------
-
-
-#ifdef FL_CFG_GFX_QUARTZ
-# include "drivers/Quartz/Fl_Quartz_Graphics_Driver_arci.cxx"
-
-#endif
+// Apple Quartz driver in "drivers/Quartz/Fl_Quartz_Graphics_Driver_arci.cxx"
// -----------------------------------------------------------------------------
diff --git a/src/fl_color.cxx b/src/fl_color.cxx
index c4ab6e869..d2d737bbb 100644
--- a/src/fl_color.cxx
+++ b/src/fl_color.cxx
@@ -24,18 +24,16 @@
// Implementation of fl_color(i), fl_color(r,g,b).
#include <FL/Fl_Device.H>
+#include <FL/Fl.H>
#include <config.h>
#include "config_lib.h"
+// Apple Quartz driver in "drivers/Quartz/Fl_Quartz_Graphics_Driver_color.cxx"
-// -----------------------------------------------------------------------------
-
-
-#ifdef FL_CFG_GFX_QUARTZ
-# include "drivers/Quartz/Fl_Quartz_Graphics_Driver_color.cxx"
-
-#endif
+static unsigned fl_cmap[256] = {
+#include "fl_cmap.h" // this is a file produced by "cmap.cxx":
+};
// -----------------------------------------------------------------------------
diff --git a/src/fl_draw_image.cxx b/src/fl_draw_image.cxx
index bcd7e9e4a..a4741c746 100644
--- a/src/fl_draw_image.cxx
+++ b/src/fl_draw_image.cxx
@@ -31,7 +31,7 @@
#ifdef WIN32
# include "drivers/GDI/Fl_GDI_Graphics_Driver_image.cxx"
#elif defined(__APPLE__)
-# include "drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx"
+// Apple Quartz driver in "drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx"
#else
# include "drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx"
#endif
diff --git a/src/fl_font.cxx b/src/fl_font.cxx
index c69cf8e5b..38088d69f 100644
--- a/src/fl_font.cxx
+++ b/src/fl_font.cxx
@@ -48,7 +48,7 @@
#ifdef WIN32
# include "drivers/GDI/Fl_GDI_Graphics_Driver_font.cxx"
#elif defined(__APPLE__)
-# include "drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx"
+// Apple Quartz driver in "drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx"
#elif USE_XFT
# include "drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx"
#elif defined(FL_PORTING)
diff --git a/src/fl_line_style.cxx b/src/fl_line_style.cxx
index 15a4ba1c5..da601fe8e 100644
--- a/src/fl_line_style.cxx
+++ b/src/fl_line_style.cxx
@@ -35,14 +35,7 @@
int fl_line_width_ = 0;
-// -----------------------------------------------------------------------------
-
-
-#ifdef FL_CFG_GFX_QUARTZ
-
-# include "drivers/Quartz/Fl_Quartz_Graphics_Driver_line_style.cxx"
-
-#endif
+// Apple Quartz driver in "drivers/Quartz/Fl_Quartz_Graphics_Driver_line_style.cxx"
// -----------------------------------------------------------------------------
diff --git a/src/fl_rect.cxx b/src/fl_rect.cxx
index 3c6574367..5530ccfbb 100644
--- a/src/fl_rect.cxx
+++ b/src/fl_rect.cxx
@@ -65,11 +65,7 @@ Fl_Region Fl_Graphics_Driver::clip_region() {
-#ifdef FL_CFG_GFX_QUARTZ
-
-# include "drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx"
-
-#endif
+// Apple Quartz driver in "drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx"
// -----------------------------------------------------------------------------
diff --git a/src/fl_vertex.cxx b/src/fl_vertex.cxx
index 36aae3627..80f76d3e7 100644
--- a/src/fl_vertex.cxx
+++ b/src/fl_vertex.cxx
@@ -148,11 +148,7 @@ void Fl_Graphics_Driver::fixloop() { // remove equal points from closed path
// -----------------------------------------------------------------------------
-#ifdef FL_CFG_GFX_QUARTZ
-
-# include "drivers/Quartz/Fl_Quartz_Graphics_Driver_vertex.cxx"
-
-#endif
+// Apple Quartz graphics driver "drivers/Quartz/Fl_Quartz_Graphics_Driver_vertex.cxx"
// -----------------------------------------------------------------------------