diff options
Diffstat (limited to 'src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx')
| -rw-r--r-- | src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx | 167 |
1 files changed, 0 insertions, 167 deletions
diff --git a/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx b/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx deleted file mode 100644 index 4615ba475..000000000 --- a/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx +++ /dev/null @@ -1,167 +0,0 @@ -// -// Draw-to-image code for the Fast Light Tool Kit (FLTK). -// -// Copyright 1998-2026 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: -// -// https://www.fltk.org/COPYING.php -// -// Please see the following page on how to report bugs and issues: -// -// https://www.fltk.org/bugs.php -// - -#include <FL/platform.H> -#include <FL/fl_draw.H> -#include "Fl_Quartz_Image_Surface_Driver.H" -#include "Fl_Quartz_Graphics_Driver.H" -#include "../Cocoa/Fl_Cocoa_Window_Driver.H" -#include <ApplicationServices/ApplicationServices.h> - - -Fl_Quartz_Image_Surface_Driver::Fl_Quartz_Image_Surface_Driver(int w, int h, int high_res, Fl_Offscreen off) : Fl_Image_Surface_Driver(w, h, high_res, off) { - mask_ = NULL; - int W = w, H = h; - float s = 1; - if (high_res) { - s = Fl_Graphics_Driver::default_driver().scale(); - Fl_Window *cw = Fl::first_window(); - Fl_Cocoa_Window_Driver *dr = cw ? Fl_Cocoa_Window_Driver::driver(cw) : NULL; - if (dr && dr->mapped_to_retina()) s *= 2; - W *= s; H *= s; - } - CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); - offscreen = off ? off : (Fl_Offscreen)CGBitmapContextCreate(calloc(W*H,4), W, H, 8, W*4, lut, kCGImageAlphaPremultipliedLast); - CGColorSpaceRelease(lut); - driver(new Fl_Quartz_Graphics_Driver); - CGContextTranslateCTM((CGContextRef)offscreen, 0.5*s, -0.5*s); // as when drawing to a window - if (high_res) { - CGContextScaleCTM((CGContextRef)offscreen, s, s); - driver()->scale(s); - } - CGContextSetShouldAntialias((CGContextRef)offscreen, false); - CGContextTranslateCTM((CGContextRef)offscreen, 0, height); - CGContextScaleCTM((CGContextRef)offscreen, 1.0f, -1.0f); - CGContextSaveGState((CGContextRef)offscreen); - CGContextSetRGBFillColor((CGContextRef)offscreen, 1, 1, 1, 0); - CGContextFillRect((CGContextRef)offscreen, CGRectMake(0,0,w,h)); -} - -Fl_Quartz_Image_Surface_Driver::~Fl_Quartz_Image_Surface_Driver() { - if (mask_) { - CGImageRelease(mask_); - } - if (offscreen) CGContextRestoreGState((CGContextRef)offscreen); - if (offscreen && !external_offscreen) { - void *data = CGBitmapContextGetData((CGContextRef)offscreen); - free(data); - CGContextRelease((CGContextRef)offscreen); - } - delete driver(); -} - - -void Fl_Quartz_Image_Surface_Driver::set_current() { - Fl_Surface_Device::set_current(); - pre_window = fl_window; - driver()->gc((CGContextRef)offscreen); - fl_window = 0; - ((Fl_Quartz_Graphics_Driver*)driver())->high_resolution( CGBitmapContextGetWidth((CGContextRef)offscreen) > (size_t)width ); - if (mask_) { - int W, H; - printable_rect(&W, &H); - CGContextSaveGState((CGContextRef)offscreen); - CGContextClipToMask((CGContextRef)offscreen, CGRectMake(0,0,W,H), mask_); // 10.4 - CGContextSaveGState((CGContextRef)offscreen); - } -} - -void Fl_Quartz_Image_Surface_Driver::translate(int x, int y) { - CGContextRestoreGState((CGContextRef)offscreen); - CGContextSaveGState((CGContextRef)offscreen); - CGContextTranslateCTM((CGContextRef)offscreen, x, y); - CGContextSaveGState((CGContextRef)offscreen); -} - -void Fl_Quartz_Image_Surface_Driver::untranslate() { - CGContextRestoreGState((CGContextRef)offscreen); -} - -Fl_RGB_Image* Fl_Quartz_Image_Surface_Driver::image() -{ - CGContextFlush((CGContextRef)offscreen); - if (mask_) { - CGContextRestoreGState((CGContextRef)offscreen); - CGImageRelease(mask_); - mask_ = NULL; - } - int W = (int)CGBitmapContextGetWidth((CGContextRef)offscreen); - int H = (int)CGBitmapContextGetHeight((CGContextRef)offscreen); - int bpr = (int)CGBitmapContextGetBytesPerRow((CGContextRef)offscreen); - int bpp = (int)CGBitmapContextGetBitsPerPixel((CGContextRef)offscreen)/8; - uchar *base = (uchar*)CGBitmapContextGetData((CGContextRef)offscreen); - int idx, idy; - uchar *pdst, *psrc; - unsigned char *data = new uchar[W * H * 3]; - for (idy = 0, pdst = data; idy < H; idy ++) { - for (idx = 0, psrc = base + idy * bpr; idx < W; idx ++, psrc += bpp, pdst += 3) { - pdst[0] = psrc[0]; // R - pdst[1] = psrc[1]; // G - pdst[2] = psrc[2]; // B - } - } - Fl_RGB_Image *image = new Fl_RGB_Image(data, W, H); - image->alloc_array = 1; - return image; -} - -void Fl_Quartz_Image_Surface_Driver::end_current() -{ - if (mask_) { - CGContextRestoreGState((CGContextRef)offscreen); - CGContextRestoreGState((CGContextRef)offscreen); - } - fl_window = pre_window; - Fl_Surface_Device::end_current(); -} - - -static void MyProviderReleaseData (void *info, const void *data, size_t size) { - delete[] (uchar*)data; -} - - -void Fl_Quartz_Image_Surface_Driver::mask(const Fl_RGB_Image *img) { - if (!&CGContextClipToMask) return; - int W = (int)CGBitmapContextGetWidth((CGContextRef)offscreen); - int H = (int)CGBitmapContextGetHeight((CGContextRef)offscreen); - bool using_copy = false; - if (W != img->data_w() || H != img->data_h()) { - Fl_RGB_Image *copy = (Fl_RGB_Image*)img->copy(W, H); - img = copy; - using_copy = true; - } - - int i, d = img->d(), w = img->data_w(), h = img->data_h(); - // reverse top and bottom and convert to gray scale if img->d() == 3 and complement bits - int bytes_per_row = (img->ld() ? img->ld() : w * d); - uchar *from = new uchar[w * h]; - for ( i = 0; i < h; i++) { - const uchar *p = img->array + bytes_per_row * i; - const uchar *last = p + bytes_per_row; - uchar *q = from + (h - 1 - i) * w; - while (p < last) { - unsigned u = *p++; - u += *p++; - u += *p++; - *q++ = ~(u/3); - } - } - CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, from, w * h, MyProviderReleaseData); - mask_ = CGImageMaskCreate(w, h, 8, 8, w, provider, NULL, false); - CFRelease(provider); - if (using_copy) delete img; -} |
