Rename Fl_Graphics_Driver::set_gc(void*) to gc(void*) and Fl_Graphics_Driver::get_gc() to gc().

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11191 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy
2016-02-19 12:40:24 +00:00
parent 6d766cc681
commit 1b5e231c90
50 changed files with 492 additions and 491 deletions
+2 -2
View File
@@ -252,9 +252,9 @@ public:
virtual void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy); virtual void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
/** Sets the value of the driver-specific graphics context. */ /** Sets the value of the driver-specific graphics context. */
virtual void set_gc(void*) {} virtual void gc(void*) {}
/** Returns the driver-specific graphics context, of NULL if there's none. */ /** Returns the driver-specific graphics context, of NULL if there's none. */
virtual void *get_gc(void) {return NULL;} virtual void *gc(void) {return NULL;}
protected: protected:
// --- implementation is in src/fl_vertex.cxx which includes src/cfg_gfx/xxx_rect.cxx // --- implementation is in src/fl_vertex.cxx which includes src/cfg_gfx/xxx_rect.cxx
virtual void transformed_vertex0(COORD_T x, COORD_T y); virtual void transformed_vertex0(COORD_T x, COORD_T y);
+4 -4
View File
@@ -132,17 +132,17 @@ extern FL_EXPORT HDC fl_makeDC(HBITMAP);
// off-screen pixmaps: create, destroy, draw into, copy to window // off-screen pixmaps: create, destroy, draw into, copy to window
typedef HBITMAP Fl_Offscreen; typedef HBITMAP Fl_Offscreen;
#define fl_create_offscreen(w, h) \ #define fl_create_offscreen(w, h) \
CreateCompatibleBitmap( (fl_graphics_driver->get_gc() ? (HDC)fl_graphics_driver->get_gc() : fl_GetDC(0) ) , w, h) CreateCompatibleBitmap( (fl_graphics_driver->gc() ? (HDC)fl_graphics_driver->gc() : fl_GetDC(0) ) , w, h)
# define fl_begin_offscreen(b) \ # define fl_begin_offscreen(b) \
void* _sgc=fl_graphics_driver->get_gc(); Window _sw=fl_window; \ void* _sgc=fl_graphics_driver->gc(); Window _sw=fl_window; \
Fl_Surface_Device *_ss = Fl_Surface_Device::surface(); \ Fl_Surface_Device *_ss = Fl_Surface_Device::surface(); \
HDC _tmp_gc = fl_makeDC(b); int _savedc = SaveDC(_tmp_gc); \ HDC _tmp_gc = fl_makeDC(b); int _savedc = SaveDC(_tmp_gc); \
Fl_Display_Device::display_device()->set_current(); \ Fl_Display_Device::display_device()->set_current(); \
fl_graphics_driver->set_gc(_tmp_gc); fl_window=(HWND)b; fl_push_no_clip() fl_graphics_driver->gc(_tmp_gc); fl_window=(HWND)b; fl_push_no_clip()
# define fl_end_offscreen() \ # define fl_end_offscreen() \
fl_pop_clip(); RestoreDC((HDC)fl_graphics_driver->get_gc(), _savedc); DeleteDC((HDC)fl_graphics_driver->get_gc()); _ss->set_current(); fl_window=_sw; fl_graphics_driver->set_gc(_sgc); fl_pop_clip(); RestoreDC((HDC)fl_graphics_driver->gc(), _savedc); DeleteDC((HDC)fl_graphics_driver->gc()); _ss->set_current(); fl_window=_sw; fl_graphics_driver->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(int x,int y,int w,int h,HBITMAP pixmap,int srcx,int srcy);
+3 -3
View File
@@ -1619,10 +1619,10 @@ void Fl_Window::hide() {
// Send a message to myself so that I'll get out of the event loop... // Send a message to myself so that I'll get out of the event loop...
PostMessage(ip->xid, WM_APP, 0, 0); PostMessage(ip->xid, WM_APP, 0, 0);
if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc); if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc);
if (ip->xid == fl_window && fl_graphics_driver->get_gc()) { if (ip->xid == fl_window && fl_graphics_driver->gc()) {
fl_release_dc(fl_window, (HDC)fl_graphics_driver->get_gc()); fl_release_dc(fl_window, (HDC)fl_graphics_driver->gc());
fl_window = (HWND)-1; fl_window = (HWND)-1;
fl_graphics_driver->set_gc(0); fl_graphics_driver->gc(0);
# ifdef FLTK_USE_CAIRO # ifdef FLTK_USE_CAIRO
if (Fl::cairo_autolink_context()) Fl::cairo_make_current((Fl_Window*) 0); if (Fl::cairo_autolink_context()) Fl::cairo_make_current((Fl_Window*) 0);
# endif # endif
+7 -7
View File
@@ -49,15 +49,15 @@ Fl_GDI_Surface_::~Fl_GDI_Surface_() {
} }
void Fl_GDI_Surface_::translate(int x, int y) { void Fl_GDI_Surface_::translate(int x, int y) {
GetWindowOrgEx((HDC)driver()->get_gc(), origins+depth); GetWindowOrgEx((HDC)driver()->gc(), origins+depth);
SetWindowOrgEx((HDC)driver()->get_gc(), origins[depth].x - x, origins[depth].y - y, NULL); SetWindowOrgEx((HDC)driver()->gc(), origins[depth].x - x, origins[depth].y - y, NULL);
if (depth < sizeof(origins)/sizeof(POINT)) depth++; if (depth < sizeof(origins)/sizeof(POINT)) depth++;
else Fl::warning("Fl_GDI_Surface_: translate stack overflow!"); else Fl::warning("Fl_GDI_Surface_: translate stack overflow!");
} }
void Fl_GDI_Surface_::untranslate() { void Fl_GDI_Surface_::untranslate() {
if (depth > 0) depth--; if (depth > 0) depth--;
SetWindowOrgEx((HDC)driver()->get_gc(), origins[depth].x, origins[depth].y, NULL); SetWindowOrgEx((HDC)driver()->gc(), origins[depth].x, origins[depth].y, NULL);
} }
const char *Fl_GDI_Surface_::class_id = "Fl_GDI_Surface_"; const char *Fl_GDI_Surface_::class_id = "Fl_GDI_Surface_";
@@ -82,7 +82,7 @@ Fl_Copy_Surface::Fl_Copy_Surface(int w, int h) : Fl_Surface_Device(NULL)
#elif defined(WIN32) #elif defined(WIN32)
helper = new Fl_GDI_Surface_(); helper = new Fl_GDI_Surface_();
driver(helper->driver()); driver(helper->driver());
oldgc = (HDC)Fl_Surface_Device::surface()->driver()->get_gc(); oldgc = (HDC)Fl_Surface_Device::surface()->driver()->gc();
// exact computation of factor from screen units to EnhMetaFile units (0.01 mm) // exact computation of factor from screen units to EnhMetaFile units (0.01 mm)
HDC hdc = GetDC(NULL); HDC hdc = GetDC(NULL);
int hmm = GetDeviceCaps(hdc, HORZSIZE); int hmm = GetDeviceCaps(hdc, HORZSIZE);
@@ -123,7 +123,7 @@ Fl_Copy_Surface::~Fl_Copy_Surface()
complete_copy_pdf_and_tiff(); complete_copy_pdf_and_tiff();
delete (Fl_Quartz_Surface_*)helper; delete (Fl_Quartz_Surface_*)helper;
#elif defined(WIN32) #elif defined(WIN32)
if (oldgc == (HDC)Fl_Surface_Device::surface()->driver()->get_gc()) oldgc = NULL; if (oldgc == (HDC)Fl_Surface_Device::surface()->driver()->gc()) oldgc = NULL;
HENHMETAFILE hmf = CloseEnhMetaFile (gc); HENHMETAFILE hmf = CloseEnhMetaFile (gc);
if ( hmf != NULL ) { if ( hmf != NULL ) {
if ( OpenClipboard (NULL) ){ if ( OpenClipboard (NULL) ){
@@ -134,7 +134,7 @@ Fl_Copy_Surface::~Fl_Copy_Surface()
DeleteEnhMetaFile(hmf); DeleteEnhMetaFile(hmf);
} }
DeleteDC(gc); DeleteDC(gc);
Fl_Surface_Device::surface()->driver()->set_gc(oldgc); Fl_Surface_Device::surface()->driver()->gc(oldgc);
delete (Fl_GDI_Surface_*)helper; delete (Fl_GDI_Surface_*)helper;
#elif defined(FL_PORTING) #elif defined(FL_PORTING)
# pragma message "FL_PORTING: free resources in destructor of Fl_Copy_Surface" # pragma message "FL_PORTING: free resources in destructor of Fl_Copy_Surface"
@@ -164,7 +164,7 @@ void Fl_Copy_Surface::draw(Fl_Widget* widget, int delta_x, int delta_y)
void Fl_Copy_Surface::set_current() void Fl_Copy_Surface::set_current()
{ {
#if defined(__APPLE__) || defined(WIN32) // PORTME: Fl_Surface_Driver - platform copy surface #if defined(__APPLE__) || defined(WIN32) // PORTME: Fl_Surface_Driver - platform copy surface
driver()->set_gc(gc); driver()->gc(gc);
fl_window = (Window)1; fl_window = (Window)1;
Fl_Surface_Device::set_current(); Fl_Surface_Device::set_current();
#elif defined(FL_PORTING) #elif defined(FL_PORTING)
+3 -3
View File
@@ -176,15 +176,15 @@ void Fl_Double_Window::flush(int eraseoverlay) {
if (damage() & ~FL_DAMAGE_EXPOSE) { if (damage() & ~FL_DAMAGE_EXPOSE) {
fl_clip_region(myi->region); myi->region = 0; fl_clip_region(myi->region); myi->region = 0;
#ifdef WIN32 #ifdef WIN32
void* _sgc = fl_graphics_driver->get_gc(); void* _sgc = fl_graphics_driver->gc();
HDC gc = fl_makeDC(myi->other_xid); HDC gc = fl_makeDC(myi->other_xid);
fl_graphics_driver->set_gc(gc); fl_graphics_driver->gc(gc);
int save = SaveDC(gc); int save = SaveDC(gc);
fl_restore_clip(); // duplicate region into new gc fl_restore_clip(); // duplicate region into new gc
draw(); draw();
RestoreDC(gc, save); RestoreDC(gc, save);
DeleteDC(gc); DeleteDC(gc);
fl_graphics_driver->set_gc(_sgc); fl_graphics_driver->gc(_sgc);
//# if defined(FLTK_USE_CAIRO) //# if defined(FLTK_USE_CAIRO)
//if Fl::cairo_autolink_context() Fl::cairo_make_current(this); // capture gc changes automatically to update the cairo context adequately //if Fl::cairo_autolink_context() Fl::cairo_make_current(this); // capture gc changes automatically to update the cairo context adequately
//# endif //# endif
+7 -7
View File
@@ -109,7 +109,7 @@ int Fl_System_Printer::start_job (int pagecount, int *frompage, int *topage)
x_offset = 0; x_offset = 0;
y_offset = 0; y_offset = 0;
WIN_SetupPrinterDeviceContext (hPr); WIN_SetupPrinterDeviceContext (hPr);
driver()->set_gc(hPr); driver()->gc(hPr);
this->set_current(); this->set_current();
} }
return err; return err;
@@ -143,7 +143,7 @@ void Fl_System_Printer::absolute_printable_rect(int *x, int *y, int *w, int *h)
XFORM transform; XFORM transform;
if (hPr == NULL) return; if (hPr == NULL) return;
HDC gc = (HDC)driver()->get_gc(); HDC gc = (HDC)driver()->gc();
GetWorldTransform(gc, &transform); GetWorldTransform(gc, &transform);
ModifyWorldTransform(gc, NULL, MWT_IDENTITY); ModifyWorldTransform(gc, NULL, MWT_IDENTITY);
SetWindowOrgEx(gc, 0, 0, NULL); SetWindowOrgEx(gc, 0, 0, NULL);
@@ -205,7 +205,7 @@ int Fl_System_Printer::start_page (void)
void Fl_System_Printer::origin (int deltax, int deltay) void Fl_System_Printer::origin (int deltax, int deltay)
{ {
SetWindowOrgEx( (HDC)driver()->get_gc(), - left_margin - deltax, - top_margin - deltay, NULL); SetWindowOrgEx( (HDC)driver()->gc(), - left_margin - deltax, - top_margin - deltay, NULL);
x_offset = deltax; x_offset = deltax;
y_offset = deltay; y_offset = deltay;
} }
@@ -214,7 +214,7 @@ void Fl_System_Printer::scale (float scalex, float scaley)
{ {
if (scaley == 0.) scaley = scalex; if (scaley == 0.) scaley = scalex;
int w, h; int w, h;
SetWindowExtEx((HDC)driver()->get_gc(), (int)(720 / scalex + 0.5), (int)(720 / scaley + 0.5), NULL); SetWindowExtEx((HDC)driver()->gc(), (int)(720 / scalex + 0.5), (int)(720 / scaley + 0.5), NULL);
printable_rect(&w, &h); printable_rect(&w, &h);
origin(0, 0); origin(0, 0);
} }
@@ -229,7 +229,7 @@ void Fl_System_Printer::rotate (float rot_angle)
mat.eM21 = - mat.eM12; mat.eM21 = - mat.eM12;
mat.eM22 = mat.eM11; mat.eM22 = mat.eM11;
mat.eDx = mat.eDy = 0; mat.eDx = mat.eDy = 0;
SetWorldTransform((HDC)driver()->get_gc(), &mat); SetWorldTransform((HDC)driver()->gc(), &mat);
} }
int Fl_System_Printer::end_page (void) int Fl_System_Printer::end_page (void)
@@ -265,7 +265,7 @@ static void do_translate(int x, int y, HDC gc)
void Fl_System_Printer::translate (int x, int y) void Fl_System_Printer::translate (int x, int y)
{ {
do_translate(x, y, (HDC)driver()->get_gc()); do_translate(x, y, (HDC)driver()->gc());
if (translate_stack_depth < translate_stack_max) { if (translate_stack_depth < translate_stack_max) {
translate_stack_x[translate_stack_depth] = x; translate_stack_x[translate_stack_depth] = x;
translate_stack_y[translate_stack_depth] = y; translate_stack_y[translate_stack_depth] = y;
@@ -277,7 +277,7 @@ void Fl_System_Printer::untranslate (void)
{ {
if (translate_stack_depth > 0) { if (translate_stack_depth > 0) {
translate_stack_depth--; translate_stack_depth--;
do_translate( - translate_stack_x[translate_stack_depth], - translate_stack_y[translate_stack_depth], (HDC)driver()->get_gc() ); do_translate( - translate_stack_x[translate_stack_depth], - translate_stack_y[translate_stack_depth], (HDC)driver()->gc() );
} }
} }
+1 -1
View File
@@ -119,7 +119,7 @@ Fl_Gl_Choice *Fl_Gl_Choice::find(int m, const int *alistp) {
// Replacement for ChoosePixelFormat() that finds one with an overlay // Replacement for ChoosePixelFormat() that finds one with an overlay
// if possible: // if possible:
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
if (!gc) gc = fl_GetDC(0); if (!gc) gc = fl_GetDC(0);
int pixelformat = 0; int pixelformat = 0;
PIXELFORMATDESCRIPTOR chosen_pfd; PIXELFORMATDESCRIPTOR chosen_pfd;
+1 -1
View File
@@ -126,7 +126,7 @@ public:
provider, NULL, false, kCGRenderingIntentDefault); provider, NULL, false, kCGRenderingIntentDefault);
CGColorSpaceRelease(cSpace); CGColorSpaceRelease(cSpace);
CGDataProviderRelease(provider); CGDataProviderRelease(provider);
CGContextDrawImage((CGContextRef)Fl_Surface_Device::surface()->driver()->get_gc(), CGContextDrawImage((CGContextRef)Fl_Surface_Device::surface()->driver()->gc(),
CGRectMake(0, 0, glw->w(), glw->h()), cgimg); CGRectMake(0, 0, glw->w(), glw->h()), cgimg);
CFRelease(cgimg); CFRelease(cgimg);
return 1; return 1;
+2 -2
View File
@@ -211,8 +211,8 @@ void Fl_Gl_Window::make_current() {
#if defined(WIN32) && USE_COLORMAP #if defined(WIN32) && USE_COLORMAP
if (fl_palette) { if (fl_palette) {
fl_GetDC(fl_xid(this)); fl_GetDC(fl_xid(this));
SelectPalette((HDC)fl_graphics_driver->get_gc(), fl_palette, FALSE); SelectPalette((HDC)fl_graphics_driver->gc(), fl_palette, FALSE);
RealizePalette((HDC)fl_graphics_driver->get_gc()); RealizePalette((HDC)fl_graphics_driver->gc());
} }
#endif // USE_COLORMAP #endif // USE_COLORMAP
if (mode_ & FL_FAKE_SINGLE) { if (mode_ & FL_FAKE_SINGLE) {
+7 -7
View File
@@ -107,12 +107,12 @@ Fl_RGB_Image* Fl_Image_Surface::image()
#elif defined(WIN32) #elif defined(WIN32)
fl_pop_clip(); fl_pop_clip();
data = fl_read_image(NULL, 0, 0, width, height, 0); data = fl_read_image(NULL, 0, 0, width, height, 0);
HDC gc = (HDC)driver()->get_gc(); HDC gc = (HDC)driver()->gc();
RestoreDC(gc, _savedc); RestoreDC(gc, _savedc);
DeleteDC(gc); DeleteDC(gc);
_ss->set_current(); _ss->set_current();
fl_window=_sw; fl_window=_sw;
_ss->driver()->set_gc(_sgc); _ss->driver()->gc(_sgc);
#elif defined(FL_PORTING) #elif defined(FL_PORTING)
# pragma message "FL_PORTING: implement Fl_Image_Surface" # pragma message "FL_PORTING: implement Fl_Image_Surface"
#else #else
@@ -156,17 +156,17 @@ void Fl_Image_Surface::draw(Fl_Widget *widget, int delta_x, int delta_y)
void Fl_Image_Surface::set_current() void Fl_Image_Surface::set_current()
{ {
#if defined(__APPLE__) // PORTME: Fl_Surface_Driver - platform image surface #if defined(__APPLE__) // PORTME: Fl_Surface_Driver - platform image surface
driver()->set_gc(offscreen); driver()->gc(offscreen);
fl_window = 0; fl_window = 0;
Fl_Surface_Device::set_current(); Fl_Surface_Device::set_current();
Fl_X::set_high_resolution( CGBitmapContextGetWidth(offscreen) > width ); Fl_X::set_high_resolution( CGBitmapContextGetWidth(offscreen) > width );
#elif defined(WIN32) #elif defined(WIN32)
_sw = fl_window; _sw = fl_window;
_ss = Fl_Surface_Device::surface(); _ss = Fl_Surface_Device::surface();
_sgc = (HDC)_ss->driver()->get_gc(); _sgc = (HDC)_ss->driver()->gc();
HDC gc = fl_makeDC(offscreen); HDC gc = fl_makeDC(offscreen);
Fl_Surface_Device::set_current(); Fl_Surface_Device::set_current();
driver()->set_gc(gc); driver()->gc(gc);
_savedc = SaveDC(gc); _savedc = SaveDC(gc);
fl_window=(HWND)offscreen; fl_window=(HWND)offscreen;
fl_push_no_clip(); fl_push_no_clip();
@@ -187,7 +187,7 @@ Fl_Quartz_Flipped_Surface_::Fl_Quartz_Flipped_Surface_(int w, int h) : Fl_Quartz
} }
void Fl_Quartz_Flipped_Surface_::translate(int x, int y) { void Fl_Quartz_Flipped_Surface_::translate(int x, int y) {
CGContextRef gc = (CGContextRef)driver()->get_gc(); CGContextRef gc = (CGContextRef)driver()->gc();
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextSaveGState(gc); CGContextSaveGState(gc);
CGContextTranslateCTM(gc, x, -y); CGContextTranslateCTM(gc, x, -y);
@@ -197,7 +197,7 @@ void Fl_Quartz_Flipped_Surface_::translate(int x, int y) {
} }
void Fl_Quartz_Flipped_Surface_::untranslate() { void Fl_Quartz_Flipped_Surface_::untranslate() {
CGContextRestoreGState((CGContextRef)driver()->get_gc()); CGContextRestoreGState((CGContextRef)driver()->gc());
} }
const char *Fl_Quartz_Flipped_Surface_::class_id = "Fl_Quartz_Flipped_Surface_"; const char *Fl_Quartz_Flipped_Surface_::class_id = "Fl_Quartz_Flipped_Surface_";
+1 -1
View File
@@ -60,7 +60,7 @@ void Fl_Menu_Window::flush() {
fl_window = myi->xid; fl_window = myi->xid;
# if defined(FLTK_USE_CAIRO) # if defined(FLTK_USE_CAIRO)
// capture gc changes automatically to update the cairo context adequately // capture gc changes automatically to update the cairo context adequately
if(Fl::autolink_context()) Fl::cairo_make_current(fl_graphics_driver->get_gc()); if(Fl::autolink_context()) Fl::cairo_make_current(fl_graphics_driver->gc());
# endif # endif
fl_overlay = 1; fl_overlay = 1;
fl_clip_region(myi->region); myi->region = 0; current_ = this; fl_clip_region(myi->region); myi->region = 0; current_ = this;
+2 -2
View File
@@ -65,7 +65,7 @@ void Fl_Paged_Device::print_widget(Fl_Widget* widget, int delta_x, int delta_y)
fl_push_clip(0, 0, widget->w(), widget->h() ); fl_push_clip(0, 0, widget->w(), widget->h() );
#ifdef __APPLE__ // for Mac OS X 10.6 and above, make window with rounded bottom corners #ifdef __APPLE__ // for Mac OS X 10.6 and above, make window with rounded bottom corners
if ( fl_mac_os_version >= 100600 && driver()->has_feature(Fl_Graphics_Driver::NATIVE) ) { if ( fl_mac_os_version >= 100600 && driver()->has_feature(Fl_Graphics_Driver::NATIVE) ) {
Fl_X::clip_to_rounded_corners((CGContextRef)driver()->get_gc(), widget->w(), widget->h()); Fl_X::clip_to_rounded_corners((CGContextRef)driver()->gc(), widget->w(), widget->h());
} }
#endif #endif
} }
@@ -150,7 +150,7 @@ void Fl_Paged_Device::print_window_part(Fl_Window *win, int x, int y, int w, int
delete[] image_data; delete[] image_data;
#ifdef WIN32 #ifdef WIN32
HDC gc = GetDC(fl_xid(win)); HDC gc = GetDC(fl_xid(win));
fl_graphics_driver->set_gc(gc); fl_graphics_driver->gc(gc);
ReleaseDC(fl_xid(win), gc); ReleaseDC(fl_xid(win), gc);
#endif #endif
} }
+8 -8
View File
@@ -188,7 +188,7 @@ void Fl_System_Printer::origin(int x, int y)
{ {
x_offset = x; x_offset = x;
y_offset = y; y_offset = y;
CGContextRef gc = (CGContextRef)driver()->get_gc(); CGContextRef gc = (CGContextRef)driver()->gc();
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextSaveGState(gc); CGContextSaveGState(gc);
@@ -203,7 +203,7 @@ void Fl_System_Printer::scale (float s_x, float s_y)
if (s_y == 0.) s_y = s_x; if (s_y == 0.) s_y = s_x;
scale_x = s_x; scale_x = s_x;
scale_y = s_y; scale_y = s_y;
CGContextRef gc = (CGContextRef)driver()->get_gc(); CGContextRef gc = (CGContextRef)driver()->gc();
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextSaveGState(gc); CGContextSaveGState(gc);
@@ -216,7 +216,7 @@ void Fl_System_Printer::scale (float s_x, float s_y)
void Fl_System_Printer::rotate (float rot_angle) void Fl_System_Printer::rotate (float rot_angle)
{ {
angle = - rot_angle * M_PI / 180.; angle = - rot_angle * M_PI / 180.;
CGContextRef gc = (CGContextRef)driver()->get_gc(); CGContextRef gc = (CGContextRef)driver()->gc();
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextSaveGState(gc); CGContextSaveGState(gc);
@@ -228,7 +228,7 @@ void Fl_System_Printer::rotate (float rot_angle)
void Fl_System_Printer::translate(int x, int y) void Fl_System_Printer::translate(int x, int y)
{ {
CGContextRef gc = (CGContextRef)driver()->get_gc(); CGContextRef gc = (CGContextRef)driver()->gc();
CGContextSaveGState(gc); CGContextSaveGState(gc);
CGContextTranslateCTM(gc, x, y ); CGContextTranslateCTM(gc, x, y );
CGContextSaveGState(gc); CGContextSaveGState(gc);
@@ -236,7 +236,7 @@ void Fl_System_Printer::translate(int x, int y)
void Fl_System_Printer::untranslate(void) void Fl_System_Printer::untranslate(void)
{ {
CGContextRef gc = (CGContextRef)driver()->get_gc(); CGContextRef gc = (CGContextRef)driver()->gc();
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
} }
@@ -258,7 +258,7 @@ int Fl_System_Printer::start_page (void)
status = PMSessionGetGraphicsContext(printSession, NULL, (void **)&gc); status = PMSessionGetGraphicsContext(printSession, NULL, (void **)&gc);
#endif #endif
} }
driver()->set_gc(gc); driver()->gc(gc);
PMRect pmRect; PMRect pmRect;
float win_scale_x, win_scale_y; float win_scale_x, win_scale_y;
@@ -293,7 +293,7 @@ int Fl_System_Printer::start_page (void)
int Fl_System_Printer::end_page (void) int Fl_System_Printer::end_page (void)
{ {
CGContextRef gc = (CGContextRef)driver()->get_gc(); CGContextRef gc = (CGContextRef)driver()->gc();
CGContextFlush(gc); CGContextFlush(gc);
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
@@ -319,7 +319,7 @@ void Fl_System_Printer::end_job (void)
} }
#endif #endif
Fl_Display_Device::display_device()->set_current(); Fl_Display_Device::display_device()->set_current();
driver()->set_gc(0); driver()->gc(0);
Fl_Window *w = Fl::first_window(); Fl_Window *w = Fl::first_window();
if (w) w->show(); if (w) w->show();
} }
+1 -1
View File
@@ -343,7 +343,7 @@ void Fl_Window::shape(const Fl_Image* img) {
void Fl_Window::draw() { void Fl_Window::draw() {
#if defined(__APPLE__) #if defined(__APPLE__)
CGContextRef gc = (CGContextRef)Fl_Display_Device::display_device()->driver()->get_gc(); CGContextRef gc = (CGContextRef)Fl_Display_Device::display_device()->driver()->gc();
#endif #endif
if (shape_data_) { if (shape_data_) {
# if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 # if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+5 -5
View File
@@ -3276,7 +3276,7 @@ void Fl_Window::make_current()
#endif #endif
nsgc = through_Fl_X_flush ? [NSGraphicsContext currentContext] : [NSGraphicsContext graphicsContextWithWindow:fl_window]; nsgc = through_Fl_X_flush ? [NSGraphicsContext currentContext] : [NSGraphicsContext graphicsContextWithWindow:fl_window];
i->gc = (CGContextRef)[nsgc graphicsPort]; i->gc = (CGContextRef)[nsgc graphicsPort];
Fl_Display_Device::display_device()->driver()->set_gc(i->gc); Fl_Display_Device::display_device()->driver()->gc(i->gc);
CGContextSaveGState(i->gc); // native context CGContextSaveGState(i->gc); // native context
// antialiasing must be deactivated because it applies to rectangles too // antialiasing must be deactivated because it applies to rectangles too
// and escapes even clipping!!! // and escapes even clipping!!!
@@ -3304,14 +3304,14 @@ void Fl_Window::make_current()
// Give the Quartz context back to the system // Give the Quartz context back to the system
void Fl_X::q_release_context(Fl_X *x) { void Fl_X::q_release_context(Fl_X *x) {
CGContextRef gc = (CGContextRef)Fl_Display_Device::display_device()->driver()->get_gc(); CGContextRef gc = (CGContextRef)Fl_Display_Device::display_device()->driver()->gc();
if (x && x->gc!=gc) return; if (x && x->gc!=gc) return;
if (!gc) return; if (!gc) return;
CGContextRestoreGState(gc); // match the CGContextSaveGState's of make_current CGContextRestoreGState(gc); // match the CGContextSaveGState's of make_current
CGContextRestoreGState(gc); CGContextRestoreGState(gc);
Fl_X::set_high_resolution(false); Fl_X::set_high_resolution(false);
CGContextFlush(gc); CGContextFlush(gc);
Fl_Display_Device::display_device()->driver()->set_gc(0); Fl_Display_Device::display_device()->driver()->gc(0);
#if defined(FLTK_USE_CAIRO) #if defined(FLTK_USE_CAIRO)
if (Fl::cairo_autolink_context()) Fl::cairo_make_current((Fl_Window*) 0); // capture gc changes automatically to update the cairo context adequately if (Fl::cairo_autolink_context()) Fl::cairo_make_current((Fl_Window*) 0); // capture gc changes automatically to update the cairo context adequately
#endif #endif
@@ -4378,7 +4378,7 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
CALayer *layer = get_titlebar_layer(win); CALayer *layer = get_titlebar_layer(win);
if (layer) { // if title bar uses a layer if (layer) { // if title bar uses a layer
if (to_quartz) { // to Quartz printer if (to_quartz) { // to Quartz printer
CGContextRef gc = (CGContextRef)driver()->get_gc(); CGContextRef gc = (CGContextRef)driver()->gc();
CGContextSaveGState(gc); CGContextSaveGState(gc);
CGContextTranslateCTM(gc, x_offset - 0.5, y_offset + bt - 0.5); CGContextTranslateCTM(gc, x_offset - 0.5, y_offset + bt - 0.5);
CGContextScaleCTM(gc, 1, -1); CGContextScaleCTM(gc, 1, -1);
@@ -4424,7 +4424,7 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
if (fl_mac_os_version >= 100400 && to_quartz) { // use Cocoa string drawing with exact title bar font if (fl_mac_os_version >= 100400 && to_quartz) { // use Cocoa string drawing with exact title bar font
// the exact font is LucidaGrande 13 pts (and HelveticaNeueDeskInterface-Regular with 10.10) // the exact font is LucidaGrande 13 pts (and HelveticaNeueDeskInterface-Regular with 10.10)
NSGraphicsContext *current = [NSGraphicsContext currentContext]; NSGraphicsContext *current = [NSGraphicsContext currentContext];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:driver()->get_gc() flipped:YES]];//10.4 [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:driver()->gc() flipped:YES]];//10.4
NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSFont titleBarFontOfSize:0] NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSFont titleBarFontOfSize:0]
forKey:NSFontAttributeName]; forKey:NSFontAttributeName];
NSString *title_s = [fl_xid(win) title]; NSString *title_s = [fl_xid(win) title];
+9 -9
View File
@@ -740,7 +740,7 @@ void Fl::paste(Fl_Widget &receiver, int clipboard, const char *type) {
else if (lpBI->bmiHeader.biClrUsed > 0) pDIBBits = (void*)(lpBI->bmiColors + lpBI->bmiHeader.biClrUsed); else if (lpBI->bmiHeader.biClrUsed > 0) pDIBBits = (void*)(lpBI->bmiColors + lpBI->bmiHeader.biClrUsed);
Fl_Offscreen off = fl_create_offscreen(width, height); Fl_Offscreen off = fl_create_offscreen(width, height);
fl_begin_offscreen(off); fl_begin_offscreen(off);
SetDIBitsToDevice((HDC)fl_graphics_driver->get_gc(), 0, 0, width, height, 0, 0, 0, height, pDIBBits, lpBI, DIB_RGB_COLORS); SetDIBitsToDevice((HDC)fl_graphics_driver->gc(), 0, 0, width, height, 0, 0, 0, height, pDIBBits, lpBI, DIB_RGB_COLORS);
rgb = fl_read_image(NULL, 0, 0, width, height); rgb = fl_read_image(NULL, 0, 0, width, height);
depth = 3; depth = 3;
fl_end_offscreen(); fl_end_offscreen();
@@ -766,7 +766,7 @@ void Fl::paste(Fl_Widget &receiver, int clipboard, const char *type) {
Fl_Offscreen off = fl_create_offscreen(width, height); Fl_Offscreen off = fl_create_offscreen(width, height);
fl_begin_offscreen(off); fl_begin_offscreen(off);
fl_color(FL_WHITE); fl_rectf(0,0,width, height); // draw white background fl_color(FL_WHITE); fl_rectf(0,0,width, height); // draw white background
PlayEnhMetaFile((HDC)fl_graphics_driver->get_gc(), (HENHMETAFILE)h, &rect); // draw metafile to offscreen buffer PlayEnhMetaFile((HDC)fl_graphics_driver->gc(), (HENHMETAFILE)h, &rect); // draw metafile to offscreen buffer
rgb = fl_read_image(NULL, 0, 0, width, height); // read pixels from offscreen buffer rgb = fl_read_image(NULL, 0, 0, width, height); // read pixels from offscreen buffer
depth = 3; depth = 3;
fl_end_offscreen(); fl_end_offscreen();
@@ -2528,13 +2528,13 @@ HWND fl_window = NULL;
// Here we ensure only one GetDC is ever in place. // Here we ensure only one GetDC is ever in place.
HDC fl_GetDC(HWND w) { HDC fl_GetDC(HWND w) {
HDC gc = (HDC)Fl_Display_Device::display_device()->driver()->get_gc(); HDC gc = (HDC)Fl_Display_Device::display_device()->driver()->gc();
if (gc) { if (gc) {
if (w == fl_window && fl_window != NULL) return gc; if (w == fl_window && fl_window != NULL) return gc;
if (fl_window) fl_release_dc(fl_window, gc); // ReleaseDC if (fl_window) fl_release_dc(fl_window, gc); // ReleaseDC
} }
gc = GetDC(w); gc = GetDC(w);
Fl_Display_Device::display_device()->driver()->set_gc(gc); Fl_Display_Device::display_device()->driver()->gc(gc);
fl_save_dc(w, gc); fl_save_dc(w, gc);
fl_window = w; fl_window = w;
// calling GetDC seems to always reset these: (?) // calling GetDC seems to always reset these: (?)
@@ -2662,7 +2662,7 @@ Fl_Region XRectangleRegion(int x, int y, int w, int h) {
if (Fl_Surface_Device::surface() == Fl_Display_Device::display_device()) return CreateRectRgn(x,y,x+w,y+h); if (Fl_Surface_Device::surface() == Fl_Display_Device::display_device()) return CreateRectRgn(x,y,x+w,y+h);
// because rotation may apply, the rectangle becomes a polygon in device coords // because rotation may apply, the rectangle becomes a polygon in device coords
POINT pt[4] = { {x, y}, {x + w, y}, {x + w, y + h}, {x, y + h} }; POINT pt[4] = { {x, y}, {x + w, y}, {x + w, y + h}, {x, y + h} };
LPtoDP((HDC)fl_graphics_driver->get_gc(), pt, 4); LPtoDP((HDC)fl_graphics_driver->gc(), pt, 4);
return CreatePolygonRgn(pt, 4, ALTERNATE); return CreatePolygonRgn(pt, 4, ALTERNATE);
} }
@@ -2728,8 +2728,8 @@ void Fl_Window::capture_titlebar_and_borders(Fl_Shared_Image*& top, Fl_Shared_Im
Fl_Display_Device::display_device()->set_current(); Fl_Display_Device::display_device()->set_current();
show(); show();
Fl::check(); Fl::check();
void* save_gc = fl_graphics_driver->get_gc(); void* save_gc = fl_graphics_driver->gc();
fl_graphics_driver->set_gc(GetDC(NULL)); fl_graphics_driver->gc(GetDC(NULL));
int ww = w() + 2 * wsides; int ww = w() + 2 * wsides;
// capture the 4 window sides from screen // capture the 4 window sides from screen
fl_window = NULL; // force use of read_win_rectangle() by fl_read_image() fl_window = NULL; // force use of read_win_rectangle() by fl_read_image()
@@ -2754,9 +2754,9 @@ void Fl_Window::capture_titlebar_and_borders(Fl_Shared_Image*& top, Fl_Shared_Im
r_bottom->alloc_array = 1; r_bottom->alloc_array = 1;
bottom = Fl_Shared_Image::get(r_bottom); bottom = Fl_Shared_Image::get(r_bottom);
} }
ReleaseDC(NULL, (HDC)fl_graphics_driver->get_gc()); ReleaseDC(NULL, (HDC)fl_graphics_driver->gc());
fl_window = save_win; fl_window = save_win;
fl_graphics_driver->set_gc(save_gc); fl_graphics_driver->gc(save_gc);
previous->Fl_Surface_Device::set_current(); previous->Fl_Surface_Device::set_current();
} }
+1 -1
View File
@@ -121,7 +121,7 @@ void Fl_Cocoa_Screen_Driver::beep(int type) {
void Fl_Cocoa_Screen_Driver::flush() { void Fl_Cocoa_Screen_Driver::flush() {
CGContextRef gc = (CGContextRef)Fl_Display_Device::display_device()->driver()->get_gc(); CGContextRef gc = (CGContextRef)Fl_Display_Device::display_device()->driver()->gc();
if (gc) if (gc)
CGContextFlush(gc); CGContextFlush(gc);
} }
+8 -8
View File
@@ -29,13 +29,13 @@ const char *Fl_GDI_Printer_Graphics_Driver::class_id = "Fl_GDI_Printer_Graphics_
/* Reference to the current device context /* Reference to the current device context
For back-compatibility only. The preferred procedure to get this reference is For back-compatibility only. The preferred procedure to get this reference is
Fl_Surface_Device::surface()->driver()->get_gc(). Fl_Surface_Device::surface()->driver()->gc().
*/ */
HDC fl_gc = 0; HDC fl_gc = 0;
void Fl_Graphics_Driver::global_gc() void Fl_Graphics_Driver::global_gc()
{ {
fl_gc = (HDC)get_gc(); fl_gc = (HDC)gc();
} }
/* /*
@@ -98,7 +98,7 @@ char Fl_GDI_Graphics_Driver::can_do_alpha_blending() {
} }
HDC fl_makeDC(HBITMAP bitmap) { HDC fl_makeDC(HBITMAP bitmap) {
HDC new_gc = CreateCompatibleDC((HDC)fl_graphics_driver->get_gc()); HDC new_gc = CreateCompatibleDC((HDC)fl_graphics_driver->gc());
SetTextAlign(new_gc, TA_BASELINE|TA_LEFT); SetTextAlign(new_gc, TA_BASELINE|TA_LEFT);
SetBkMode(new_gc, TRANSPARENT); SetBkMode(new_gc, TRANSPARENT);
#if USE_COLORMAP #if USE_COLORMAP
@@ -109,26 +109,26 @@ HDC fl_makeDC(HBITMAP bitmap) {
} }
void Fl_GDI_Graphics_Driver::copy_offscreen(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) { void Fl_GDI_Graphics_Driver::copy_offscreen(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) {
HDC new_gc = CreateCompatibleDC(gc); HDC new_gc = CreateCompatibleDC(gc_);
int save = SaveDC(new_gc); int save = SaveDC(new_gc);
SelectObject(new_gc, bitmap); SelectObject(new_gc, bitmap);
BitBlt(gc, x, y, w, h, new_gc, srcx, srcy, SRCCOPY); BitBlt(gc_, x, y, w, h, new_gc, srcx, srcy, SRCCOPY);
RestoreDC(new_gc, save); RestoreDC(new_gc, save);
DeleteDC(new_gc); DeleteDC(new_gc);
} }
void Fl_GDI_Graphics_Driver::copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) { void Fl_GDI_Graphics_Driver::copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) {
HDC new_gc = CreateCompatibleDC(gc); HDC new_gc = CreateCompatibleDC(gc_);
int save = SaveDC(new_gc); int save = SaveDC(new_gc);
SelectObject(new_gc, bitmap); SelectObject(new_gc, bitmap);
BOOL alpha_ok = 0; BOOL alpha_ok = 0;
// first try to alpha blend // first try to alpha blend
if ( can_do_alpha_blending() ) { if ( can_do_alpha_blending() ) {
alpha_ok = fl_alpha_blend(gc, x, y, w, h, new_gc, srcx, srcy, w, h, blendfunc); alpha_ok = fl_alpha_blend(gc_, x, y, w, h, new_gc, srcx, srcy, w, h, blendfunc);
} }
// if that failed (it shouldn't), still copy the bitmap over, but now alpha is 1 // if that failed (it shouldn't), still copy the bitmap over, but now alpha is 1
if (!alpha_ok) { if (!alpha_ok) {
BitBlt(gc, x, y, w, h, new_gc, srcx, srcy, SRCCOPY); BitBlt(gc_, x, y, w, h, new_gc, srcx, srcy, SRCCOPY);
} }
RestoreDC(new_gc, save); RestoreDC(new_gc, save);
DeleteDC(new_gc); DeleteDC(new_gc);
+3 -3
View File
@@ -35,7 +35,7 @@
*/ */
class FL_EXPORT Fl_GDI_Graphics_Driver : public Fl_Graphics_Driver { class FL_EXPORT Fl_GDI_Graphics_Driver : public Fl_Graphics_Driver {
protected: protected:
HDC gc; HDC gc_;
int numcount; int numcount;
int counts[20]; int counts[20];
public: public:
@@ -43,8 +43,8 @@ public:
const char *class_name() {return class_id;}; const char *class_name() {return class_id;};
virtual int has_feature(driver_feature mask) { return mask & NATIVE; } virtual int has_feature(driver_feature mask) { return mask & NATIVE; }
char can_do_alpha_blending(); char can_do_alpha_blending();
virtual void set_gc(void *ctxt) {if (ctxt != gc) global_gc(); gc = (HDC)ctxt;} virtual void gc(void *ctxt) {if (ctxt != gc_) global_gc(); gc_ = (HDC)ctxt;}
virtual void *get_gc() {return gc;} virtual void *gc() {return gc_;}
// --- bitmap stuff // --- bitmap stuff
Fl_Bitmask create_bitmask(int w, int h, const uchar *array); Fl_Bitmask create_bitmask(int w, int h, const uchar *array);
@@ -41,9 +41,9 @@ void Fl_GDI_Graphics_Driver::arc(int x,int y,int w,int h,double a1,double a2) {
int xb = x+w/2+int(w*cos(a2/180.0*M_PI)); int xb = x+w/2+int(w*cos(a2/180.0*M_PI));
int yb = y+h/2-int(h*sin(a2/180.0*M_PI)); int yb = y+h/2-int(h*sin(a2/180.0*M_PI));
if (fabs(a1 - a2) < 90) { if (fabs(a1 - a2) < 90) {
if (xa == xb && ya == yb) SetPixel(gc, xa, ya, fl_RGB()); if (xa == xb && ya == yb) SetPixel(gc_, xa, ya, fl_RGB());
else Arc(gc, x, y, x+w, y+h, xa, ya, xb, yb); else Arc(gc_, x, y, x+w, y+h, xa, ya, xb, yb);
} else Arc(gc, x, y, x+w, y+h, xa, ya, xb, yb); } else Arc(gc_, x, y, x+w, y+h, xa, ya, xb, yb);
} }
void Fl_GDI_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2) { void Fl_GDI_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2) {
@@ -53,14 +53,14 @@ void Fl_GDI_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2) {
int ya = y+h/2-int(h*sin(a1/180.0*M_PI)); int ya = y+h/2-int(h*sin(a1/180.0*M_PI));
int xb = x+w/2+int(w*cos(a2/180.0*M_PI)); int xb = x+w/2+int(w*cos(a2/180.0*M_PI));
int yb = y+h/2-int(h*sin(a2/180.0*M_PI)); int yb = y+h/2-int(h*sin(a2/180.0*M_PI));
SelectObject(gc, fl_brush()); SelectObject(gc_, fl_brush());
if (fabs(a1 - a2) < 90) { if (fabs(a1 - a2) < 90) {
if (xa == xb && ya == yb) { if (xa == xb && ya == yb) {
MoveToEx(gc, x+w/2, y+h/2, 0L); MoveToEx(gc_, x+w/2, y+h/2, 0L);
LineTo(gc, xa, ya); LineTo(gc_, xa, ya);
SetPixel(gc, xa, ya, fl_RGB()); SetPixel(gc_, xa, ya, fl_RGB());
} else Pie(gc, x, y, x+w, y+h, xa, ya, xb, yb); } else Pie(gc_, x, y, x+w, y+h, xa, ya, xb, yb);
} else Pie(gc, x, y, x+w, y+h, xa, ya, xb, yb); } else Pie(gc_, x, y, x+w, y+h, xa, ya, xb, yb);
} }
#endif // FL_CFG_GFX_GDI_ARCI_CXX #endif // FL_CFG_GFX_GDI_ARCI_CXX
@@ -53,11 +53,11 @@ void fl_cleanup_pens(void) {
void fl_save_pen(void) { void fl_save_pen(void) {
if(!tmppen) tmppen = CreatePen(PS_SOLID, 1, 0); if(!tmppen) tmppen = CreatePen(PS_SOLID, 1, 0);
savepen = (HPEN)SelectObject((HDC)fl_graphics_driver->get_gc(), tmppen); savepen = (HPEN)SelectObject((HDC)fl_graphics_driver->gc(), tmppen);
} }
void fl_restore_pen(void) { void fl_restore_pen(void) {
if (savepen) SelectObject((HDC)fl_graphics_driver->get_gc(), savepen); if (savepen) SelectObject((HDC)fl_graphics_driver->gc(), savepen);
DeleteObject(tmppen); DeleteObject(tmppen);
tmppen = 0; tmppen = 0;
savepen = 0; savepen = 0;
@@ -65,7 +65,7 @@ void fl_restore_pen(void) {
static void clear_xmap(Fl_XMap& xmap) { static void clear_xmap(Fl_XMap& xmap) {
if (xmap.pen) { if (xmap.pen) {
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
HGDIOBJ tmppen = GetStockObject(BLACK_PEN); HGDIOBJ tmppen = GetStockObject(BLACK_PEN);
HGDIOBJ oldpen = SelectObject(gc, tmppen); // Push out the current pen of the gc HGDIOBJ oldpen = SelectObject(gc, tmppen); // Push out the current pen of the gc
if(oldpen != xmap.pen) SelectObject(gc, oldpen); // Put it back if it is not the one we are about to delete if(oldpen != xmap.pen) SelectObject(gc, oldpen); // Put it back if it is not the one we are about to delete
@@ -78,7 +78,7 @@ static void clear_xmap(Fl_XMap& xmap) {
static void set_xmap(Fl_XMap& xmap, COLORREF c) { static void set_xmap(Fl_XMap& xmap, COLORREF c) {
xmap.rgb = c; xmap.rgb = c;
if (xmap.pen) { if (xmap.pen) {
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
HGDIOBJ oldpen = SelectObject(gc,GetStockObject(BLACK_PEN)); // replace current pen with safe one HGDIOBJ oldpen = SelectObject(gc,GetStockObject(BLACK_PEN)); // replace current pen with safe one
if (oldpen != xmap.pen)SelectObject(gc,oldpen); // if old one not xmap.pen, need to put it back if (oldpen != xmap.pen)SelectObject(gc,oldpen); // if old one not xmap.pen, need to put it back
DeleteObject(xmap.pen); // delete pen DeleteObject(xmap.pen); // delete pen
@@ -107,7 +107,7 @@ void Fl_GDI_Graphics_Driver::color(Fl_Color i) {
#endif #endif
} }
fl_current_xmap = &xmap; fl_current_xmap = &xmap;
SelectObject(gc, (HGDIOBJ)(xmap.pen)); SelectObject(gc_, (HGDIOBJ)(xmap.pen));
} }
} }
@@ -120,7 +120,7 @@ void Fl_GDI_Graphics_Driver::color(uchar r, uchar g, uchar b) {
set_xmap(xmap, c); set_xmap(xmap, c);
} }
fl_current_xmap = &xmap; fl_current_xmap = &xmap;
SelectObject(gc, (HGDIOBJ)(xmap.pen)); SelectObject(gc_, (HGDIOBJ)(xmap.pen));
} }
HBRUSH fl_brush() { HBRUSH fl_brush() {
@@ -129,7 +129,7 @@ HBRUSH fl_brush() {
HBRUSH fl_brush_action(int action) { HBRUSH fl_brush_action(int action) {
Fl_XMap *xmap = fl_current_xmap; Fl_XMap *xmap = fl_current_xmap;
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
// Wonko: we use some statistics to cache only a limited number // Wonko: we use some statistics to cache only a limited number
// of brushes: // of brushes:
#define FL_N_BRUSH 16 #define FL_N_BRUSH 16
@@ -206,7 +206,7 @@ HPALETTE
fl_select_palette(void) fl_select_palette(void)
{ {
static char beenhere; static char beenhere;
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
if (!beenhere) { if (!beenhere) {
beenhere = 1; beenhere = 1;
+27 -27
View File
@@ -113,7 +113,7 @@ enumcbw(CONST LOGFONTW *lpelf,
} /* enumcbw */ } /* enumcbw */
Fl_Font Fl::set_fonts(const char* xstarname) { Fl_Font Fl::set_fonts(const char* xstarname) {
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
if (fl_free_font == FL_FREE_FONT) {// if not already been called if (fl_free_font == FL_FREE_FONT) {// if not already been called
if (!gc) gc = fl_GetDC(0); if (!gc) gc = fl_GetDC(0);
@@ -169,7 +169,7 @@ Fl::get_font_sizes(Fl_Font fnum, int*& sizep) {
Fl_Fontdesc *s = fl_fonts+fnum; Fl_Fontdesc *s = fl_fonts+fnum;
if (!s->name) s = fl_fonts; // empty slot in table, use entry 0 if (!s->name) s = fl_fonts; // empty slot in table, use entry 0
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
if (!gc) gc = fl_GetDC(0); if (!gc) gc = fl_GetDC(0);
cyPerInch = GetDeviceCaps(gc, LOGPIXELSY); cyPerInch = GetDeviceCaps(gc, LOGPIXELSY);
if (cyPerInch < 1) cyPerInch = 1; if (cyPerInch < 1) cyPerInch = 1;
@@ -244,7 +244,7 @@ Fl_Font_Descriptor::Fl_Font_Descriptor(const char* name, Fl_Fontsize fsize) {
name // pointer to typeface name string name // pointer to typeface name string
); );
angle = fl_angle_; angle = fl_angle_;
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
if (!gc) gc = fl_GetDC(0); if (!gc) gc = fl_GetDC(0);
SelectObject(gc, fid); SelectObject(gc, fid);
GetTextMetrics(gc, &metr); GetTextMetrics(gc, &metr);
@@ -383,7 +383,7 @@ double Fl_GDI_Graphics_Driver::width(unsigned int c) {
// This code assumes that these glyphs are rarely used and simply // This code assumes that these glyphs are rarely used and simply
// measures them explicitly if they occur - This will be slow... // measures them explicitly if they occur - This will be slow...
if(c > 0x0000FFFF) { // UTF16 surrogate pair is needed if(c > 0x0000FFFF) { // UTF16 surrogate pair is needed
if (!gc) { // We have no valid gc, so nothing to measure - bail out if (!gc_) { // We have no valid gc, so nothing to measure - bail out
return 0.0; return 0.0;
} }
int cc; // cell count int cc; // cell count
@@ -391,9 +391,9 @@ double Fl_GDI_Graphics_Driver::width(unsigned int c) {
// Creates a UTF16 string from a UCS code point. // Creates a UTF16 string from a UCS code point.
cc = fl_ucs_to_Utf16(c, u16, 4); cc = fl_ucs_to_Utf16(c, u16, 4);
// Make sure the current font is selected before we make the measurement // Make sure the current font is selected before we make the measurement
SelectObject(gc, fl_fontsize->fid); SelectObject(gc_, fl_fontsize->fid);
// measure the glyph width // measure the glyph width
GetTextExtentPoint32W(gc, (WCHAR*)u16, cc, &s); GetTextExtentPoint32W(gc_, (WCHAR*)u16, cc, &s);
return (double)s.cx; return (double)s.cx;
} }
// else - this falls through to the lookup-table for glyph widths // else - this falls through to the lookup-table for glyph widths
@@ -414,7 +414,7 @@ double Fl_GDI_Graphics_Driver::width(unsigned int c) {
// If that is null then we attempt to obtain the gc from the current screen // If that is null then we attempt to obtain the gc from the current screen
// using (GetDC(NULL)). // using (GetDC(NULL)).
// This should resolve STR #2086 // This should resolve STR #2086
HDC gc2 = gc; HDC gc2 = gc_;
HWND hWnd = 0; HWND hWnd = 0;
if (!gc2) { // We have no valid gc, try and obtain one if (!gc2) { // We have no valid gc, try and obtain one
// Use our first fltk window, or fallback to using the screen via GetDC(NULL) // Use our first fltk window, or fallback to using the screen via GetDC(NULL)
@@ -426,7 +426,7 @@ double Fl_GDI_Graphics_Driver::width(unsigned int c) {
ii += c &0x03FF; ii += c &0x03FF;
GetTextExtentPoint32W(gc2, (WCHAR*)&ii, 1, &s); GetTextExtentPoint32W(gc2, (WCHAR*)&ii, 1, &s);
fl_fontsize->width[r][c&0x03FF] = s.cx; fl_fontsize->width[r][c&0x03FF] = s.cx;
if (gc2 && gc2 != gc) ReleaseDC(hWnd, gc2); if (gc2 && gc2 != gc_) ReleaseDC(hWnd, gc2);
return (double) fl_fontsize->width[r][c & 0x03FF]; return (double) fl_fontsize->width[r][c & 0x03FF];
} }
@@ -486,7 +486,7 @@ void Fl_GDI_Graphics_Driver::text_extents(const char *c, int n, int &dx, int &dy
int minx = 0, miny = -999999; int minx = 0, miny = -999999;
unsigned len = 0, idx = 0; unsigned len = 0, idx = 0;
HWND hWnd = 0; HWND hWnd = 0;
HDC gc2 = gc; // local copy of current gc - make a copy in case we change it... HDC gc2 = gc_; // local copy of current gc - make a copy in case we change it...
int has_surrogates; // will be set if the string contains surrogate pairs int has_surrogates; // will be set if the string contains surrogate pairs
// Have we loaded the GetGlyphIndicesW function yet? // Have we loaded the GetGlyphIndicesW function yet?
@@ -543,7 +543,7 @@ void Fl_GDI_Graphics_Driver::text_extents(const char *c, int n, int &dx, int &dy
len = gcp_res.nGlyphs; len = gcp_res.nGlyphs;
} else goto exit_error; } else goto exit_error;
} else { } else {
if (fl_GetGlyphIndices(gc, (WCHAR*)ext_buff, len, w_buff, GGI_MARK_NONEXISTING_GLYPHS) == GDI_ERROR) { if (fl_GetGlyphIndices(gc_, (WCHAR*)ext_buff, len, w_buff, GGI_MARK_NONEXISTING_GLYPHS) == GDI_ERROR) {
// some error occured here - just return fl_measure values // some error occured here - just return fl_measure values
goto exit_error; goto exit_error;
} }
@@ -567,7 +567,7 @@ void Fl_GDI_Graphics_Driver::text_extents(const char *c, int n, int &dx, int &dy
h = maxh + miny; h = maxh + miny;
dx = minx; dx = minx;
dy = -miny; dy = -miny;
EXTENTS_UPDATE(dx, dy, w, h, gc); EXTENTS_UPDATE(dx, dy, w, h, gc_);
return; // normal exit return; // normal exit
exit_error: exit_error:
@@ -576,38 +576,38 @@ exit_error:
h = height(); h = height();
dx = 0; dx = 0;
dy = descent() - h; dy = descent() - h;
EXTENTS_UPDATE(dx, dy, w, h, gc); EXTENTS_UPDATE(dx, dy, w, h, gc_);
return; return;
} // fl_text_extents } // fl_text_extents
void Fl_GDI_Graphics_Driver::draw(const char* str, int n, int x, int y) { void Fl_GDI_Graphics_Driver::draw(const char* str, int n, int x, int y) {
COLORREF oldColor = SetTextColor(gc, fl_RGB()); COLORREF oldColor = SetTextColor(gc_, fl_RGB());
// avoid crash if no font has been set yet // avoid crash if no font has been set yet
if (!font_descriptor()) this->font(FL_HELVETICA, FL_NORMAL_SIZE); if (!font_descriptor()) this->font(FL_HELVETICA, FL_NORMAL_SIZE);
SelectObject(gc, font_descriptor()->fid); SelectObject(gc_, font_descriptor()->fid);
int wn = fl_utf8toUtf16(str, n, wstr, wstr_len); int wn = fl_utf8toUtf16(str, n, wstr, wstr_len);
if(wn >= wstr_len) { if(wn >= wstr_len) {
wstr = (unsigned short*) realloc(wstr, sizeof(unsigned short) * (wn + 1)); wstr = (unsigned short*) realloc(wstr, sizeof(unsigned short) * (wn + 1));
wstr_len = wn + 1; wstr_len = wn + 1;
wn = fl_utf8toUtf16(str, n, wstr, wstr_len); wn = fl_utf8toUtf16(str, n, wstr, wstr_len);
} }
TextOutW(gc, x, y, (WCHAR*)wstr, wn); TextOutW(gc_, x, y, (WCHAR*)wstr, wn);
SetTextColor(gc, oldColor); // restore initial state SetTextColor(gc_, oldColor); // restore initial state
} }
void Fl_GDI_Graphics_Driver::draw(int angle, const char* str, int n, int x, int y) { void Fl_GDI_Graphics_Driver::draw(int angle, const char* str, int n, int x, int y) {
fl_font(this, Fl_Graphics_Driver::font(), size(), angle); fl_font(this, Fl_Graphics_Driver::font(), size(), angle);
int wn = 0; // count of UTF16 cells to render full string int wn = 0; // count of UTF16 cells to render full string
COLORREF oldColor = SetTextColor(gc, fl_RGB()); COLORREF oldColor = SetTextColor(gc_, fl_RGB());
SelectObject(gc, font_descriptor()->fid); SelectObject(gc_, font_descriptor()->fid);
wn = fl_utf8toUtf16(str, n, wstr, wstr_len); wn = fl_utf8toUtf16(str, n, wstr, wstr_len);
if(wn >= wstr_len) { // Array too small if(wn >= wstr_len) { // Array too small
wstr = (unsigned short*) realloc(wstr, sizeof(unsigned short) * (wn + 1)); wstr = (unsigned short*) realloc(wstr, sizeof(unsigned short) * (wn + 1));
wstr_len = wn + 1; wstr_len = wn + 1;
wn = fl_utf8toUtf16(str, n, wstr, wstr_len); // respin the translation wn = fl_utf8toUtf16(str, n, wstr, wstr_len); // respin the translation
} }
TextOutW(gc, x, y, (WCHAR*)wstr, wn); TextOutW(gc_, x, y, (WCHAR*)wstr, wn);
SetTextColor(gc, oldColor); SetTextColor(gc_, oldColor);
fl_font(this, Fl_Graphics_Driver::font(), size(), 0); fl_font(this, Fl_Graphics_Driver::font(), size(), 0);
} }
@@ -620,26 +620,26 @@ void Fl_GDI_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) {
wn = fl_utf8toUtf16(c, n, wstr, wstr_len); wn = fl_utf8toUtf16(c, n, wstr, wstr_len);
} }
COLORREF oldColor = SetTextColor(gc, fl_RGB()); COLORREF oldColor = SetTextColor(gc_, fl_RGB());
SelectObject(gc, font_descriptor()->fid); SelectObject(gc_, font_descriptor()->fid);
#ifdef RTL_CHAR_BY_CHAR #ifdef RTL_CHAR_BY_CHAR
int i = 0; int i = 0;
int lx = 0; int lx = 0;
while (i < wn) { // output char by char is very bad for Arabic but coherent with fl_width() while (i < wn) { // output char by char is very bad for Arabic but coherent with fl_width()
lx = (int) width(wstr[i]); lx = (int) width(wstr[i]);
x -= lx; x -= lx;
TextOutW(gc, x, y, (WCHAR*)wstr + i, 1); TextOutW(gc_, x, y, (WCHAR*)wstr + i, 1);
if (fl_nonspacing(wstr[i])) { if (fl_nonspacing(wstr[i])) {
x += lx; x += lx;
} }
i++; i++;
} }
#else #else
UINT old_align = SetTextAlign(gc, TA_RIGHT | TA_RTLREADING); UINT old_align = SetTextAlign(gc_, TA_RIGHT | TA_RTLREADING);
TextOutW(gc, x, y - height() + descent(), (WCHAR*)wstr, wn); TextOutW(gc_, x, y - height() + descent(), (WCHAR*)wstr, wn);
SetTextAlign(gc, old_align); SetTextAlign(gc_, old_align);
#endif #endif
SetTextColor(gc, oldColor); SetTextColor(gc_, oldColor);
} }
#endif #endif
// //
@@ -286,9 +286,9 @@ static int fl_abs(int v) { return v<0 ? -v : v; }
void Fl_GDI_Graphics_Driver::draw_image(const uchar* buf, int x, int y, int w, int h, int d, int l){ void Fl_GDI_Graphics_Driver::draw_image(const uchar* buf, int x, int y, int w, int h, int d, int l){
if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) { if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) {
d ^= FL_IMAGE_WITH_ALPHA; d ^= FL_IMAGE_WITH_ALPHA;
innards(buf,x,y,w,h,d,l,fl_abs(d),0,0, gc); innards(buf,x,y,w,h,d,l,fl_abs(d),0,0, gc_);
} else { } else {
innards(buf,x,y,w,h,d,l,(d<3&&d>-3),0,0, gc); innards(buf,x,y,w,h,d,l,(d<3&&d>-3),0,0, gc_);
} }
} }
@@ -296,18 +296,18 @@ void Fl_GDI_Graphics_Driver::draw_image(Fl_Draw_Image_Cb cb, void* data,
int x, int y, int w, int h,int d) { int x, int y, int w, int h,int d) {
if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) { if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) {
d ^= FL_IMAGE_WITH_ALPHA; d ^= FL_IMAGE_WITH_ALPHA;
innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data, gc); innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data, gc_);
} else { } else {
innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data, gc); innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data, gc_);
} }
} }
void Fl_GDI_Graphics_Driver::draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){ void Fl_GDI_Graphics_Driver::draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){
if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) { if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) {
d ^= FL_IMAGE_WITH_ALPHA; d ^= FL_IMAGE_WITH_ALPHA;
innards(buf,x,y,w,h,d,l,1,0,0, gc); innards(buf,x,y,w,h,d,l,1,0,0, gc_);
} else { } else {
innards(buf,x,y,w,h,d,l,1,0,0, gc); innards(buf,x,y,w,h,d,l,1,0,0, gc_);
} }
} }
@@ -315,9 +315,9 @@ void Fl_GDI_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb cb, void* data,
int x, int y, int w, int h,int d) { int x, int y, int w, int h,int d) {
if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) { if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) {
d ^= FL_IMAGE_WITH_ALPHA; d ^= FL_IMAGE_WITH_ALPHA;
innards(0,x,y,w,h,d,0,1,cb,data, gc); innards(0,x,y,w,h,d,0,1,cb,data, gc_);
} else { } else {
innards(0,x,y,w,h,d,0,1,cb,data, gc); innards(0,x,y,w,h,d,0,1,cb,data, gc_);
} }
} }
@@ -327,7 +327,7 @@ void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
if (fl_palette) { if (fl_palette) {
uchar c[3]; uchar c[3];
c[0] = r; c[1] = g; c[2] = b; c[0] = r; c[1] = g; c[2] = b;
innards(c,x,y,w,h,0,0,0,0,0,(HDC)fl_graphics_driver->get_gc()); innards(c,x,y,w,h,0,0,0,0,0,(HDC)fl_graphics_driver->gc());
return; return;
} }
#endif #endif
@@ -346,8 +346,8 @@ Fl_Bitmask Fl_GDI_Graphics_Driver::create_bitmask(int w, int h, const uchar *dat
static uchar loNibble[16] = static uchar loNibble[16] =
{ 0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e, { 0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e,
0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f }; 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f };
int np = GetDeviceCaps(gc, PLANES); //: was always one on sample machines int np = GetDeviceCaps(gc_, PLANES); //: was always one on sample machines
int bpp = GetDeviceCaps(gc, BITSPIXEL);//: 1,4,8,16,24,32 and more odd stuff? int bpp = GetDeviceCaps(gc_, BITSPIXEL);//: 1,4,8,16,24,32 and more odd stuff?
int Bpr = (bpp*w+7)/8; //: bytes per row int Bpr = (bpp*w+7)/8; //: bytes per row
int pad = Bpr&1, w1 = (w+7)/8, shr = ((w-1)&7)+1; int pad = Bpr&1, w1 = (w+7)/8, shr = ((w-1)&7)+1;
if (bpp==4) shr = (shr+1)/2; if (bpp==4) shr = (shr+1)/2;
@@ -404,12 +404,12 @@ void Fl_GDI_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP,
return; return;
} }
HDC tempdc = CreateCompatibleDC(gc); HDC tempdc = CreateCompatibleDC(gc_);
int save = SaveDC(tempdc); int save = SaveDC(tempdc);
SelectObject(tempdc, (HGDIOBJ)bm->id_); SelectObject(tempdc, (HGDIOBJ)bm->id_);
SelectObject(gc, fl_brush()); SelectObject(gc_, fl_brush());
// secret bitblt code found in old MSWindows reference manual: // secret bitblt code found in old MSWindows reference manual:
BitBlt(gc, X, Y, W, H, tempdc, cx, cy, 0xE20746L); BitBlt(gc_, X, Y, W, H, tempdc, cx, cy, 0xE20746L);
RestoreDC(tempdc, save); RestoreDC(tempdc, save);
DeleteDC(tempdc); DeleteDC(tempdc);
} }
@@ -447,7 +447,7 @@ void Fl_GDI_Printer_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP,
fl_color(background); fl_color(background);
fl_rectf(0,0,W,H); // use this color as offscreen background fl_rectf(0,0,W,H); // use this color as offscreen background
fl_color(save_c); // back to bitmap's color fl_color(save_c); // back to bitmap's color
HDC off_gc = (HDC)fl_graphics_driver->get_gc(); HDC off_gc = (HDC)fl_graphics_driver->gc();
tempdc = CreateCompatibleDC(off_gc); tempdc = CreateCompatibleDC(off_gc);
save = SaveDC(tempdc); save = SaveDC(tempdc);
SelectObject(tempdc, (HGDIOBJ)bm->id_); SelectObject(tempdc, (HGDIOBJ)bm->id_);
@@ -456,7 +456,7 @@ void Fl_GDI_Printer_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP,
fl_end_offscreen(); // offscreen data is in tmp_id fl_end_offscreen(); // offscreen data is in tmp_id
SelectObject(tempdc, (HGDIOBJ)tmp_id); // use offscreen data SelectObject(tempdc, (HGDIOBJ)tmp_id); // use offscreen data
// draw it to printer context with background color as transparent // draw it to printer context with background color as transparent
fl_TransparentBlt(gc, X,Y,W,H, tempdc, cx, cy, bm->w(), bm->h(), RGB(r, g, b) ); fl_TransparentBlt(gc_, X,Y,W,H, tempdc, cx, cy, bm->w(), bm->h(), RGB(r, g, b) );
fl_delete_offscreen(tmp_id); fl_delete_offscreen(tmp_id);
RestoreDC(tempdc, save); RestoreDC(tempdc, save);
DeleteDC(tempdc); DeleteDC(tempdc);
@@ -511,12 +511,12 @@ void Fl_GDI_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int
} }
if (!img->id_) img->id_ = (fl_uintptr_t)build_id(img, (void**)&(img->mask_)); if (!img->id_) img->id_ = (fl_uintptr_t)build_id(img, (void**)&(img->mask_));
if (img->mask_) { if (img->mask_) {
HDC new_gc = CreateCompatibleDC(gc); HDC new_gc = CreateCompatibleDC(gc_);
int save = SaveDC(new_gc); int save = SaveDC(new_gc);
SelectObject(new_gc, (void*)img->mask_); SelectObject(new_gc, (void*)img->mask_);
BitBlt(gc, X, Y, W, H, new_gc, cx, cy, SRCAND); BitBlt(gc_, X, Y, W, H, new_gc, cx, cy, SRCAND);
SelectObject(new_gc, (void*)img->id_); SelectObject(new_gc, (void*)img->id_);
BitBlt(gc, X, Y, W, H, new_gc, cx, cy, SRCPAINT); BitBlt(gc_, X, Y, W, H, new_gc, cx, cy, SRCPAINT);
RestoreDC(new_gc,save); RestoreDC(new_gc,save);
DeleteDC(new_gc); DeleteDC(new_gc);
} else if (img->d()==2 || img->d()==4) { } else if (img->d()==2 || img->d()==4) {
@@ -528,15 +528,15 @@ void Fl_GDI_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int
int Fl_GDI_Printer_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) { int Fl_GDI_Printer_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) {
XFORM old_tr, tr; XFORM old_tr, tr;
GetWorldTransform(gc, &old_tr); // storing old transform GetWorldTransform(gc_, &old_tr); // storing old transform
tr.eM11 = float(WP)/float(img->w()); tr.eM11 = float(WP)/float(img->w());
tr.eM22 = float(HP)/float(img->h()); tr.eM22 = float(HP)/float(img->h());
tr.eM12 = tr.eM21 = 0; tr.eM12 = tr.eM21 = 0;
tr.eDx = float(XP); tr.eDx = float(XP);
tr.eDy = float(YP); tr.eDy = float(YP);
ModifyWorldTransform(gc, &tr, MWT_LEFTMULTIPLY); ModifyWorldTransform(gc_, &tr, MWT_LEFTMULTIPLY);
img->draw(0, 0, img->w(), img->h(), 0, 0); img->draw(0, 0, img->w(), img->h(), 0, 0);
SetWorldTransform(gc, &old_tr); SetWorldTransform(gc_, &old_tr);
return 1; return 1;
} }
@@ -593,12 +593,12 @@ void Fl_GDI_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP
int X, Y, W, H; int X, Y, W, H;
if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return; if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return;
if (pxm->mask_) { if (pxm->mask_) {
HDC new_gc = CreateCompatibleDC(gc); HDC new_gc = CreateCompatibleDC(gc_);
int save = SaveDC(new_gc); int save = SaveDC(new_gc);
SelectObject(new_gc, (void*)pxm->mask_); SelectObject(new_gc, (void*)pxm->mask_);
BitBlt(gc, X, Y, W, H, new_gc, cx, cy, SRCAND); BitBlt(gc_, X, Y, W, H, new_gc, cx, cy, SRCAND);
SelectObject(new_gc, (void*)pxm->id_); SelectObject(new_gc, (void*)pxm->id_);
BitBlt(gc, X, Y, W, H, new_gc, cx, cy, SRCPAINT); BitBlt(gc_, X, Y, W, H, new_gc, cx, cy, SRCPAINT);
RestoreDC(new_gc,save); RestoreDC(new_gc,save);
DeleteDC(new_gc); DeleteDC(new_gc);
} else { } else {
@@ -618,11 +618,11 @@ void Fl_GDI_Printer_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP
if(hMod) fl_TransparentBlt = (fl_transp_func)GetProcAddress(hMod, "TransparentBlt"); if(hMod) fl_TransparentBlt = (fl_transp_func)GetProcAddress(hMod, "TransparentBlt");
} }
if (fl_TransparentBlt) { if (fl_TransparentBlt) {
HDC new_gc = CreateCompatibleDC(gc); HDC new_gc = CreateCompatibleDC(gc_);
int save = SaveDC(new_gc); int save = SaveDC(new_gc);
SelectObject(new_gc, (void*)pxm->id_); SelectObject(new_gc, (void*)pxm->id_);
// print all of offscreen but its parts in background color // print all of offscreen but its parts in background color
fl_TransparentBlt(gc, X, Y, W, H, new_gc, cx, cy, W, H, pxm->pixmap_bg_color ); fl_TransparentBlt(gc_, X, Y, W, H, new_gc, cx, cy, W, H, pxm->pixmap_bg_color );
RestoreDC(new_gc,save); RestoreDC(new_gc,save);
DeleteDC(new_gc); DeleteDC(new_gc);
} }
@@ -63,7 +63,7 @@ void Fl_GDI_Graphics_Driver::line_style(int style, int width, char* dashes) {
Fl::error("fl_line_style(): Could not create GDI pen object."); Fl::error("fl_line_style(): Could not create GDI pen object.");
return; return;
} }
HPEN oldpen = (HPEN)SelectObject(gc, newpen); HPEN oldpen = (HPEN)SelectObject(gc_, newpen);
DeleteObject(oldpen); DeleteObject(oldpen);
DeleteObject(fl_current_xmap->pen); DeleteObject(fl_current_xmap->pen);
fl_current_xmap->pen = newpen; fl_current_xmap->pen = newpen;
+46 -46
View File
@@ -36,16 +36,16 @@
// --- line and polygon drawing with integer coordinates // --- line and polygon drawing with integer coordinates
void Fl_GDI_Graphics_Driver::point(int x, int y) { void Fl_GDI_Graphics_Driver::point(int x, int y) {
SetPixel(gc, x, y, fl_RGB()); SetPixel(gc_, x, y, fl_RGB());
} }
void Fl_GDI_Graphics_Driver::rect(int x, int y, int w, int h) { void Fl_GDI_Graphics_Driver::rect(int x, int y, int w, int h) {
if (w<=0 || h<=0) return; if (w<=0 || h<=0) return;
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x+w-1, y); LineTo(gc_, x+w-1, y);
LineTo(gc, x+w-1, y+h-1); LineTo(gc_, x+w-1, y+h-1);
LineTo(gc, x, y+h-1); LineTo(gc_, x, y+h-1);
LineTo(gc, x, y); LineTo(gc_, x, y);
} }
void Fl_GDI_Graphics_Driver::focus_rect(int x, int y, int w, int h) { void Fl_GDI_Graphics_Driver::focus_rect(int x, int y, int w, int h) {
@@ -64,79 +64,79 @@ void Fl_GDI_Graphics_Driver::rectf(int x, int y, int w, int h) {
RECT rect; RECT rect;
rect.left = x; rect.top = y; rect.left = x; rect.top = y;
rect.right = x + w; rect.bottom = y + h; rect.right = x + w; rect.bottom = y + h;
FillRect(gc, &rect, fl_brush()); FillRect(gc_, &rect, fl_brush());
} }
void Fl_GDI_Graphics_Driver::line(int x, int y, int x1, int y1) { void Fl_GDI_Graphics_Driver::line(int x, int y, int x1, int y1) {
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x1, y1); LineTo(gc_, x1, y1);
SetPixel(gc, x1, y1, fl_RGB()); SetPixel(gc_, x1, y1, fl_RGB());
} }
void Fl_GDI_Graphics_Driver::line(int x, int y, int x1, int y1, int x2, int y2) { void Fl_GDI_Graphics_Driver::line(int x, int y, int x1, int y1, int x2, int y2) {
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x1, y1); LineTo(gc_, x1, y1);
LineTo(gc, x2, y2); LineTo(gc_, x2, y2);
SetPixel(gc, x2, y2, fl_RGB()); SetPixel(gc_, x2, y2, fl_RGB());
} }
void Fl_GDI_Graphics_Driver::xyline(int x, int y, int x1) { void Fl_GDI_Graphics_Driver::xyline(int x, int y, int x1) {
MoveToEx(gc, x, y, 0L); LineTo(gc, x1+1, y); MoveToEx(gc_, x, y, 0L); LineTo(gc_, x1+1, y);
} }
void Fl_GDI_Graphics_Driver::xyline(int x, int y, int x1, int y2) { void Fl_GDI_Graphics_Driver::xyline(int x, int y, int x1, int y2) {
if (y2 < y) y2--; if (y2 < y) y2--;
else y2++; else y2++;
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x1, y); LineTo(gc_, x1, y);
LineTo(gc, x1, y2); LineTo(gc_, x1, y2);
} }
void Fl_GDI_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) { void Fl_GDI_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) {
if(x3 < x1) x3--; if(x3 < x1) x3--;
else x3++; else x3++;
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x1, y); LineTo(gc_, x1, y);
LineTo(gc, x1, y2); LineTo(gc_, x1, y2);
LineTo(gc, x3, y2); LineTo(gc_, x3, y2);
} }
void Fl_GDI_Graphics_Driver::yxline(int x, int y, int y1) { void Fl_GDI_Graphics_Driver::yxline(int x, int y, int y1) {
if (y1 < y) y1--; if (y1 < y) y1--;
else y1++; else y1++;
MoveToEx(gc, x, y, 0L); LineTo(gc, x, y1); MoveToEx(gc_, x, y, 0L); LineTo(gc_, x, y1);
} }
void Fl_GDI_Graphics_Driver::yxline(int x, int y, int y1, int x2) { void Fl_GDI_Graphics_Driver::yxline(int x, int y, int y1, int x2) {
if (x2 > x) x2++; if (x2 > x) x2++;
else x2--; else x2--;
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x, y1); LineTo(gc_, x, y1);
LineTo(gc, x2, y1); LineTo(gc_, x2, y1);
} }
void Fl_GDI_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) { void Fl_GDI_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) {
if(y3<y1) y3--; if(y3<y1) y3--;
else y3++; else y3++;
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x, y1); LineTo(gc_, x, y1);
LineTo(gc, x2, y1); LineTo(gc_, x2, y1);
LineTo(gc, x2, y3); LineTo(gc_, x2, y3);
} }
void Fl_GDI_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2) { void Fl_GDI_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2) {
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x1, y1); LineTo(gc_, x1, y1);
LineTo(gc, x2, y2); LineTo(gc_, x2, y2);
LineTo(gc, x, y); LineTo(gc_, x, y);
} }
void Fl_GDI_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) { void Fl_GDI_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {
MoveToEx(gc, x, y, 0L); MoveToEx(gc_, x, y, 0L);
LineTo(gc, x1, y1); LineTo(gc_, x1, y1);
LineTo(gc, x2, y2); LineTo(gc_, x2, y2);
LineTo(gc, x3, y3); LineTo(gc_, x3, y3);
LineTo(gc, x, y); LineTo(gc_, x, y);
} }
void Fl_GDI_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2) { void Fl_GDI_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2) {
@@ -144,8 +144,8 @@ void Fl_GDI_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y
p[0].x = x; p[0].y = y; p[0].x = x; p[0].y = y;
p[1].x = x1; p[1].y = y1; p[1].x = x1; p[1].y = y1;
p[2].x = x2; p[2].y = y2; p[2].x = x2; p[2].y = y2;
SelectObject(gc, fl_brush()); SelectObject(gc_, fl_brush());
Polygon(gc, p, 3); Polygon(gc_, p, 3);
} }
void Fl_GDI_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) { void Fl_GDI_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {
@@ -154,8 +154,8 @@ void Fl_GDI_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y
p[1].x = x1; p[1].y = y1; p[1].x = x1; p[1].y = y1;
p[2].x = x2; p[2].y = y2; p[2].x = x2; p[2].y = y2;
p[3].x = x3; p[3].y = y3; p[3].x = x3; p[3].y = y3;
SelectObject(gc, fl_brush()); SelectObject(gc_, fl_brush());
Polygon(gc, p, 4); Polygon(gc_, p, 4);
} }
// --- clipping // --- clipping
@@ -197,7 +197,7 @@ int Fl_GDI_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y,
GetRgnBox(temp, &rect); GetRgnBox(temp, &rect);
if (Fl_Surface_Device::surface() != Fl_Display_Device::display_device()) { // if print context, convert coords from device to logical if (Fl_Surface_Device::surface() != Fl_Display_Device::display_device()) { // if print context, convert coords from device to logical
POINT pt[2] = { {rect.left, rect.top}, {rect.right, rect.bottom} }; POINT pt[2] = { {rect.left, rect.top}, {rect.right, rect.bottom} };
DPtoLP(gc, pt, 2); DPtoLP(gc_, pt, 2);
X = pt[0].x; Y = pt[0].y; W = pt[1].x - X; H = pt[1].y - Y; X = pt[0].x; Y = pt[0].y; W = pt[1].x - X; H = pt[1].y - Y;
} }
else { else {
@@ -217,7 +217,7 @@ int Fl_GDI_Graphics_Driver::not_clipped(int x, int y, int w, int h) {
RECT rect; RECT rect;
if (Fl_Surface_Device::surface() != Fl_Display_Device::display_device()) { // in case of print context, convert coords from logical to device if (Fl_Surface_Device::surface() != Fl_Display_Device::display_device()) { // in case of print context, convert coords from logical to device
POINT pt[2] = { {x, y}, {x + w, y + h} }; POINT pt[2] = { {x, y}, {x + w, y + h} };
LPtoDP(gc, pt, 2); LPtoDP(gc_, pt, 2);
rect.left = pt[0].x; rect.top = pt[0].y; rect.right = pt[1].x; rect.bottom = pt[1].y; rect.left = pt[0].x; rect.top = pt[0].y; rect.right = pt[1].x; rect.bottom = pt[1].y;
} else { } else {
rect.left = x; rect.top = y; rect.right = x+w; rect.bottom = y+h; rect.left = x; rect.top = y; rect.right = x+w; rect.bottom = y+h;
@@ -244,7 +244,7 @@ void Fl_GDI_Graphics_Driver::pop_clip() {
void Fl_GDI_Graphics_Driver::restore_clip() { void Fl_GDI_Graphics_Driver::restore_clip() {
fl_clip_state_number++; fl_clip_state_number++;
Fl_Region r = rstack[rstackptr]; Fl_Region r = rstack[rstackptr];
SelectClipRgn(gc, r); //if r is NULL, clip is automatically cleared SelectClipRgn(gc_, r); //if r is NULL, clip is automatically cleared
} }
@@ -41,7 +41,7 @@ void Fl_GDI_Graphics_Driver::vertex(double x,double y) {
} }
void Fl_GDI_Graphics_Driver::end_points() { void Fl_GDI_Graphics_Driver::end_points() {
for (int i=0; i<n; i++) SetPixel(gc, p[i].x, p[i].y, fl_RGB()); for (int i=0; i<n; i++) SetPixel(gc_, p[i].x, p[i].y, fl_RGB());
} }
void Fl_GDI_Graphics_Driver::end_line() { void Fl_GDI_Graphics_Driver::end_line() {
@@ -49,7 +49,7 @@ void Fl_GDI_Graphics_Driver::end_line() {
end_points(); end_points();
return; return;
} }
if (n>1) Polyline(gc, p, n); if (n>1) Polyline(gc_, p, n);
} }
void Fl_GDI_Graphics_Driver::end_loop() { void Fl_GDI_Graphics_Driver::end_loop() {
@@ -65,8 +65,8 @@ void Fl_GDI_Graphics_Driver::end_polygon() {
return; return;
} }
if (n>2) { if (n>2) {
SelectObject(gc, fl_brush()); SelectObject(gc_, fl_brush());
Polygon(gc, p, n); Polygon(gc_, p, n);
} }
} }
@@ -94,8 +94,8 @@ void Fl_GDI_Graphics_Driver::end_complex_polygon() {
return; return;
} }
if (n>2) { if (n>2) {
SelectObject(gc, fl_brush()); SelectObject(gc_, fl_brush());
PolyPolygon(gc, p, counts, numcount); PolyPolygon(gc_, p, counts, numcount);
} }
} }
@@ -114,10 +114,10 @@ void Fl_GDI_Graphics_Driver::circle(double x, double y,double r) {
int h = (int)rint(yt+ry)-lly; int h = (int)rint(yt+ry)-lly;
if (what==POLYGON) { if (what==POLYGON) {
SelectObject(gc, fl_brush()); SelectObject(gc_, fl_brush());
Pie(gc, llx, lly, llx+w, lly+h, 0,0, 0,0); Pie(gc_, llx, lly, llx+w, lly+h, 0,0, 0,0);
} else } else
Arc(gc, llx, lly, llx+w, lly+h, 0,0, 0,0); Arc(gc_, llx, lly, llx+w, lly+h, 0,0, 0,0);
} }
#endif // FL_CFG_GFX_GDI_VERTEX_CXX #endif // FL_CFG_GFX_GDI_VERTEX_CXX
@@ -25,13 +25,13 @@ const char *Fl_Quartz_Graphics_Driver::class_id = "Fl_Quartz_Graphics_Driver";
/* Reference to the current CGContext /* Reference to the current CGContext
For back-compatibility only. The preferred procedure to get this reference is For back-compatibility only. The preferred procedure to get this reference is
Fl_Surface_Device::surface()->driver()->get_gc(). Fl_Surface_Device::surface()->driver()->gc().
*/ */
CGContextRef fl_gc = 0; CGContextRef fl_gc = 0;
void Fl_Graphics_Driver::global_gc() void Fl_Graphics_Driver::global_gc()
{ {
fl_gc = (CGContextRef)get_gc(); fl_gc = (CGContextRef)gc();
} }
/* /*
@@ -128,13 +128,13 @@ void fl_begin_offscreen(Fl_Offscreen ctx) {
_ss = Fl_Surface_Device::surface(); _ss = Fl_Surface_Device::surface();
Fl_Display_Device::display_device()->set_current(); Fl_Display_Device::display_device()->set_current();
if (stack_ix<stack_max) { if (stack_ix<stack_max) {
stack_gc[stack_ix] = (CGContextRef)fl_graphics_driver->get_gc(); stack_gc[stack_ix] = (CGContextRef)fl_graphics_driver->gc();
stack_window[stack_ix] = fl_window; stack_window[stack_ix] = fl_window;
} else } else
fprintf(stderr, "FLTK CGContext Stack overflow error\n"); fprintf(stderr, "FLTK CGContext Stack overflow error\n");
stack_ix++; stack_ix++;
fl_graphics_driver->set_gc(ctx); fl_graphics_driver->gc(ctx);
fl_window = 0; fl_window = 0;
CGContextSaveGState(ctx); CGContextSaveGState(ctx);
fl_graphics_driver->push_no_clip(); fl_graphics_driver->push_no_clip();
@@ -145,7 +145,7 @@ void fl_begin_offscreen(Fl_Offscreen ctx) {
*/ */
void fl_end_offscreen() { void fl_end_offscreen() {
fl_graphics_driver->pop_clip(); fl_graphics_driver->pop_clip();
CGContextRef gc = (CGContextRef)fl_graphics_driver->get_gc(); CGContextRef gc = (CGContextRef)fl_graphics_driver->gc();
CGContextRestoreGState(gc); // matches CGContextSaveGState in fl_begin_offscreen() CGContextRestoreGState(gc); // matches CGContextSaveGState in fl_begin_offscreen()
CGContextFlush(gc); CGContextFlush(gc);
@@ -154,7 +154,7 @@ void fl_end_offscreen() {
else else
fprintf(stderr, "FLTK CGContext Stack underflow error\n"); fprintf(stderr, "FLTK CGContext Stack underflow error\n");
if (stack_ix<stack_max) { if (stack_ix<stack_max) {
fl_graphics_driver->set_gc(stack_gc[stack_ix]); fl_graphics_driver->gc(stack_gc[stack_ix]);
fl_window = stack_window[stack_ix]; fl_window = stack_window[stack_ix];
} }
_ss->set_current(); _ss->set_current();
@@ -39,13 +39,14 @@
This class is implemented only on the Mac OS X platform. This class is implemented only on the Mac OS X platform.
*/ */
class Fl_Quartz_Graphics_Driver : public Fl_Graphics_Driver { class Fl_Quartz_Graphics_Driver : public Fl_Graphics_Driver {
CGContextRef gc; protected:
CGContextRef gc_;
public: public:
static const char *class_id; static const char *class_id;
const char *class_name() {return class_id;}; const char *class_name() {return class_id;};
virtual int has_feature(driver_feature mask) { return mask & NATIVE; } virtual int has_feature(driver_feature mask) { return mask & NATIVE; }
virtual void set_gc(void *ctxt) {if (ctxt != gc) global_gc(); gc = (CGContextRef)ctxt; } virtual void gc(void *ctxt) {if (ctxt != gc_) global_gc(); gc_ = (CGContextRef)ctxt; }
virtual void *get_gc() {return gc;} virtual void *gc() {return gc_;}
char can_do_alpha_blending(); char can_do_alpha_blending();
// --- bitmap stuff // --- bitmap stuff
@@ -30,42 +30,42 @@ void Fl_Quartz_Graphics_Driver::arc(int x,int y,int w,int h,double a1,double a2)
if (w <= 0 || h <= 0) return; if (w <= 0 || h <= 0) return;
a1 = (-a1)/180.0f*M_PI; a2 = (-a2)/180.0f*M_PI; a1 = (-a1)/180.0f*M_PI; a2 = (-a2)/180.0f*M_PI;
float cx = x + 0.5f*w - 0.5f, cy = y + 0.5f*h - 0.5f; float cx = x + 0.5f*w - 0.5f, cy = y + 0.5f*h - 0.5f;
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
if (w!=h) { if (w!=h) {
CGContextSaveGState(gc); CGContextSaveGState(gc_);
CGContextTranslateCTM(gc, cx, cy); CGContextTranslateCTM(gc_, cx, cy);
CGContextScaleCTM(gc, w-1.0f, h-1.0f); CGContextScaleCTM(gc_, w-1.0f, h-1.0f);
CGContextAddArc(gc, 0, 0, 0.5, a1, a2, 1); CGContextAddArc(gc_, 0, 0, 0.5, a1, a2, 1);
CGContextRestoreGState(gc); CGContextRestoreGState(gc_);
} else { } else {
float r = (w+h)*0.25f-0.5f; float r = (w+h)*0.25f-0.5f;
CGContextAddArc(gc, cx, cy, r, a1, a2, 1); CGContextAddArc(gc_, cx, cy, r, a1, a2, 1);
} }
CGContextStrokePath(gc); CGContextStrokePath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2) { void Fl_Quartz_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2) {
if (w <= 0 || h <= 0) return; if (w <= 0 || h <= 0) return;
a1 = (-a1)/180.0f*M_PI; a2 = (-a2)/180.0f*M_PI; a1 = (-a1)/180.0f*M_PI; a2 = (-a2)/180.0f*M_PI;
float cx = x + 0.5f*w - 0.5f, cy = y + 0.5f*h - 0.5f; float cx = x + 0.5f*w - 0.5f, cy = y + 0.5f*h - 0.5f;
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
if (w!=h) { if (w!=h) {
CGContextSaveGState(gc); CGContextSaveGState(gc_);
CGContextTranslateCTM(gc, cx, cy); CGContextTranslateCTM(gc_, cx, cy);
CGContextScaleCTM(gc, w, h); CGContextScaleCTM(gc_, w, h);
CGContextAddArc(gc, 0, 0, 0.5, a1, a2, 1); CGContextAddArc(gc_, 0, 0, 0.5, a1, a2, 1);
CGContextAddLineToPoint(gc, 0, 0); CGContextAddLineToPoint(gc_, 0, 0);
CGContextClosePath(gc); CGContextClosePath(gc_);
CGContextRestoreGState(gc); CGContextRestoreGState(gc_);
} else { } else {
float r = (w+h)*0.25f; float r = (w+h)*0.25f;
CGContextAddArc(gc, cx, cy, r, a1, a2, 1); CGContextAddArc(gc_, cx, cy, r, a1, a2, 1);
CGContextAddLineToPoint(gc, cx, cy); CGContextAddLineToPoint(gc_, cx, cy);
CGContextClosePath(gc); CGContextClosePath(gc_);
} }
CGContextFillPath(gc); CGContextFillPath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
#endif // FL_CFG_GFX_QUARTZ #endif // FL_CFG_GFX_QUARTZ
@@ -53,12 +53,12 @@ void Fl_Quartz_Graphics_Driver::color(Fl_Color i) {
g = c>>16; g = c>>16;
b = c>> 8; b = c>> 8;
} }
if (!gc) return; // no context yet? We will assign the color later. if (!gc_) return; // no context yet? We will assign the color later.
float fr = r/255.0f; float fr = r/255.0f;
float fg = g/255.0f; float fg = g/255.0f;
float fb = b/255.0f; float fb = b/255.0f;
CGContextSetRGBFillColor(gc, fr, fg, fb, 1.0f); CGContextSetRGBFillColor(gc_, fr, fg, fb, 1.0f);
CGContextSetRGBStrokeColor(gc, fr, fg, fb, 1.0f); CGContextSetRGBStrokeColor(gc_, fr, fg, fb, 1.0f);
} }
void Fl_Quartz_Graphics_Driver::color(uchar r, uchar g, uchar b) { void Fl_Quartz_Graphics_Driver::color(uchar r, uchar g, uchar b) {
@@ -66,9 +66,9 @@ void Fl_Quartz_Graphics_Driver::color(uchar r, uchar g, uchar b) {
float fr = r/255.0f; float fr = r/255.0f;
float fg = g/255.0f; float fg = g/255.0f;
float fb = b/255.0f; float fb = b/255.0f;
if (!gc) return; // no context yet? We will assign the color later. if (!gc_) return; // no context yet? We will assign the color later.
CGContextSetRGBFillColor(gc, fr, fg, fb, 1.0f); CGContextSetRGBFillColor(gc_, fr, fg, fb, 1.0f);
CGContextSetRGBStrokeColor(gc, fr, fg, fb, 1.0f); CGContextSetRGBStrokeColor(gc_, fr, fg, fb, 1.0f);
} }
// FIXME: this function should not be here! It's not part of the driver. // FIXME: this function should not be here! It's not part of the driver.
@@ -580,7 +580,7 @@ if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
// activate the current GC // activate the current GC
iSize = sizeof(CGContextRef); iSize = sizeof(CGContextRef);
iTag = kATSUCGContextTag; iTag = kATSUCGContextTag;
iValuePtr = &gc; iValuePtr = &gc_;
ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr); ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr);
// now measure the bounding box // now measure the bounding box
err = ATSUSetTextPointerLocation(layout, txt, kATSUFromTextBeginning, n, n); err = ATSUSetTextPointerLocation(layout, txt, kATSUFromTextBeginning, n, n);
@@ -632,10 +632,10 @@ if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
CFRelease(str16); CFRelease(str16);
CTLineRef ctline = CTLineCreateWithAttributedString(mastr); CTLineRef ctline = CTLineCreateWithAttributedString(mastr);
CFRelease(mastr); CFRelease(mastr);
CGContextSetTextPosition(gc, 0, 0); CGContextSetTextPosition(gc_, 0, 0);
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGRect rect = CTLineGetImageBounds(ctline, gc); CGRect rect = CTLineGetImageBounds(ctline, gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
CFRelease(ctline); CFRelease(ctline);
dx = floor(rect.origin.x + 0.5); dx = floor(rect.origin.x + 0.5);
dy = floor(- rect.origin.y - rect.size.height + 0.5); dy = floor(- rect.origin.y - rect.size.height + 0.5);
@@ -657,7 +657,7 @@ else {
// activate the current GC // activate the current GC
iSize = sizeof(CGContextRef); iSize = sizeof(CGContextRef);
iTag = kATSUCGContextTag; iTag = kATSUCGContextTag;
iValuePtr = &gc; iValuePtr = &gc_;
ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr); ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr);
// now measure the bounding box // now measure the bounding box
err = ATSUSetTextPointerLocation(layout, txt, kATSUFromTextBeginning, n, n); err = ATSUSetTextPointerLocation(layout, txt, kATSUFromTextBeginning, n, n);
@@ -692,6 +692,7 @@ static CGColorRef flcolortocgcolor(Fl_Color i)
static void fl_mac_draw(const char *str, int n, float x, float y, Fl_Graphics_Driver *driver) { static void fl_mac_draw(const char *str, int n, float x, float y, Fl_Graphics_Driver *driver) {
// convert to UTF-16 first // convert to UTF-16 first
UniChar *uniStr = mac_Utf8_to_Utf16(str, n, &n); UniChar *uniStr = mac_Utf8_to_Utf16(str, n, &n);
CGContextRef gc = (CGContextRef)driver->gc();
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
if (fl_mac_os_version >= Fl_X::CoreText_threshold) { if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
CFMutableStringRef str16 = CFStringCreateMutableWithExternalCharactersNoCopy(NULL, uniStr, n, n, kCFAllocatorNull); CFMutableStringRef str16 = CFStringCreateMutableWithExternalCharactersNoCopy(NULL, uniStr, n, n, kCFAllocatorNull);
@@ -704,7 +705,6 @@ static void fl_mac_draw(const char *str, int n, float x, float y, Fl_Graphics_Dr
CFRelease(color); CFRelease(color);
CTLineRef ctline = CTLineCreateWithAttributedString(mastr); CTLineRef ctline = CTLineCreateWithAttributedString(mastr);
CFRelease(mastr); CFRelease(mastr);
CGContextRef gc = (CGContextRef)driver->get_gc();
CGContextSetTextMatrix(gc, font_mx); CGContextSetTextMatrix(gc, font_mx);
CGContextSetTextPosition(gc, x, y); CGContextSetTextPosition(gc, x, y);
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc, true);
@@ -746,11 +746,11 @@ void Fl_Quartz_Graphics_Driver::draw(const char* str, int n, int x, int y) {
} }
void Fl_Quartz_Graphics_Driver::draw(int angle, const char *str, int n, int x, int y) { void Fl_Quartz_Graphics_Driver::draw(int angle, const char *str, int n, int x, int y) {
CGContextSaveGState(gc); CGContextSaveGState(gc_);
CGContextTranslateCTM(gc, x, y); CGContextTranslateCTM(gc_, x, y);
CGContextRotateCTM(gc, - angle*(M_PI/180) ); CGContextRotateCTM(gc_, - angle*(M_PI/180) );
draw(str, n, 0, 0); draw(str, n, 0, 0);
CGContextRestoreGState(gc); CGContextRestoreGState(gc_);
} }
void Fl_Quartz_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) { void Fl_Quartz_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) {
@@ -3,7 +3,7 @@
// //
// MacOS image drawing code for the Fast Light Tool Kit (FLTK). // MacOS image drawing code for the Fast Light Tool Kit (FLTK).
// //
// Copyright 1998-2012 by Bill Spitzak and others. // Copyright 1998-2016 by Bill Spitzak and others.
// //
// This library is free software. Distribution and use rights are outlined in // 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 // the file "COPYING" which should have been included with this file. If this
@@ -142,18 +142,18 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
} }
void Fl_Quartz_Graphics_Driver::draw_image(const uchar* buf, int x, int y, int w, int h, int d, int l){ void Fl_Quartz_Graphics_Driver::draw_image(const uchar* buf, int x, int y, int w, int h, int d, int l){
innards(buf,x,y,w,h,d,l,(d<3&&d>-3),0,0,gc); innards(buf,x,y,w,h,d,l,(d<3&&d>-3),0,0,gc_);
} }
void Fl_Quartz_Graphics_Driver::draw_image(Fl_Draw_Image_Cb cb, void* data, void Fl_Quartz_Graphics_Driver::draw_image(Fl_Draw_Image_Cb cb, void* data,
int x, int y, int w, int h,int d) { int x, int y, int w, int h,int d) {
innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data,gc); innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data,gc_);
} }
void Fl_Quartz_Graphics_Driver::draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){ void Fl_Quartz_Graphics_Driver::draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){
innards(buf,x,y,w,h,d,l,1,0,0,gc); innards(buf,x,y,w,h,d,l,1,0,0,gc_);
} }
void Fl_Quartz_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb cb, void* data, void Fl_Quartz_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb cb, void* data,
int x, int y, int w, int h,int d) { int x, int y, int w, int h,int d) {
innards(0,x,y,w,h,d,0,1,cb,data,gc); innards(0,x,y,w,h,d,0,1,cb,data,gc_);
} }
void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) { void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
@@ -166,7 +166,7 @@ void Fl_Quartz_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP, int
if (bm->start(XP, YP, WP, HP, cx, cy, X, Y, W, H)) { if (bm->start(XP, YP, WP, HP, cx, cy, X, Y, W, H)) {
return; return;
} }
if (bm->id_ && gc) { if (bm->id_ && gc_) {
draw_CGImage((CGImageRef)bm->id_, X,Y,W,H, cx, cy, bm->w(), bm->h()); draw_CGImage((CGImageRef)bm->id_, X,Y,W,H, cx, cy, bm->w(), bm->h());
} }
} }
@@ -223,7 +223,7 @@ void Fl_Quartz_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP,
CGColorSpaceRelease(lut); CGColorSpaceRelease(lut);
CGDataProviderRelease(src); CGDataProviderRelease(src);
} }
if (img->id_ && gc) { if (img->id_ && gc_) {
if (!img->alloc_array && has_feature(PRINTER) && !CGImageGetShouldInterpolate((CGImageRef)img->id_)) { 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. // 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: // If the image has alloc_array = 0, we must protect against image data being freed before it is used:
@@ -252,12 +252,12 @@ int Fl_Quartz_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP
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 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; if (W == 0 || H == 0) return 1;
fl_push_no_clip(); // remove the FLTK clip that can't be rescaled fl_push_no_clip(); // remove the FLTK clip that can't be rescaled
CGContextSaveGState(gc); CGContextSaveGState(gc_);
CGContextClipToRect(gc, CGRectMake(X, Y, W, H)); // this clip path will be rescaled & translated CGContextClipToRect(gc_, CGRectMake(X, Y, W, H)); // this clip path will be rescaled & translated
CGContextTranslateCTM(gc, XP, YP); CGContextTranslateCTM(gc_, XP, YP);
CGContextScaleCTM(gc, float(WP)/img->w(), float(HP)/img->h()); CGContextScaleCTM(gc_, float(WP)/img->w(), float(HP)/img->h());
img->draw(0, 0, img->w(), img->h(), 0, 0); img->draw(0, 0, img->w(), img->h(), 0, 0);
CGContextRestoreGState(gc); CGContextRestoreGState(gc_);
fl_pop_clip(); // restore FLTK's clip fl_pop_clip(); // restore FLTK's clip
return 1; return 1;
} }
@@ -317,14 +317,14 @@ fl_uintptr_t Fl_Quartz_Graphics_Driver::cache(Fl_Pixmap *img, int w, int h, cons
void Fl_Quartz_Graphics_Driver::draw_CGImage(CGImageRef cgimg, int x, int y, int w, int h, int srcx, int srcy, int sw, int sh) void Fl_Quartz_Graphics_Driver::draw_CGImage(CGImageRef cgimg, int x, int y, int w, int h, int srcx, int srcy, int sw, int sh)
{ {
CGRect rect = CGRectMake(x, y, w, h); CGRect rect = CGRectMake(x, y, w, h);
CGContextSaveGState(gc); CGContextSaveGState(gc_);
CGContextClipToRect(gc, CGRectOffset(rect, -0.5, -0.5 )); CGContextClipToRect(gc_, CGRectOffset(rect, -0.5, -0.5 ));
// move graphics context to origin of vertically reversed image // move graphics context to origin of vertically reversed image
// The 0.5 here cancels the 0.5 offset present in Quartz graphics contexts. // The 0.5 here cancels the 0.5 offset present in Quartz graphics contexts.
// Thus, image and surface pixels are in phase if there's no scaling. // Thus, image and surface pixels are in phase if there's no scaling.
CGContextTranslateCTM(gc, rect.origin.x - srcx - 0.5, rect.origin.y - srcy + sh - 0.5); CGContextTranslateCTM(gc_, rect.origin.x - srcx - 0.5, rect.origin.y - srcy + sh - 0.5);
CGContextScaleCTM(gc, 1, -1); CGContextScaleCTM(gc_, 1, -1);
CGAffineTransform at = CGContextGetCTM(gc); CGAffineTransform at = CGContextGetCTM(gc_);
if (at.a == at.d && at.b == 0 && at.c == 0) { // proportional scaling, no rotation if (at.a == at.d && at.b == 0 && at.c == 0) { // proportional scaling, no rotation
// We handle x2 and /2 scalings that occur when drawing to // We handle x2 and /2 scalings that occur when drawing to
// a double-resolution bitmap, and when drawing a double-resolution bitmap to display. // a double-resolution bitmap, and when drawing a double-resolution bitmap to display.
@@ -345,10 +345,10 @@ void Fl_Quartz_Graphics_Driver::draw_CGImage(CGImageRef cgimg, int x, int y, int
deltay = (at.ty - round(at.ty))*2; deltay = (at.ty - round(at.ty))*2;
} }
} }
if (doit) CGContextTranslateCTM(gc, -deltax, -deltay); if (doit) CGContextTranslateCTM(gc_, -deltax, -deltay);
} }
CGContextDrawImage(gc, CGRectMake(0, 0, sw, sh), cgimg); CGContextDrawImage(gc_, CGRectMake(0, 0, sw, sh), cgimg);
CGContextRestoreGState(gc); CGContextRestoreGState(gc_);
} }
// //
@@ -94,7 +94,7 @@ void Fl_Quartz_Graphics_Driver::line_style(int style, int width, char* dashes) {
fl_quartz_line_pattern = 0; fl_quartz_line_pattern = 0;
fl_quartz_line_pattern_size = 0; fl_quartz_line_pattern_size = 0;
} }
fl_quartz_restore_line_style_((CGContextRef)get_gc()); fl_quartz_restore_line_style_((CGContextRef)gc());
} }
#endif // FL_CFG_GFX_QUARTZ #endif // FL_CFG_GFX_QUARTZ
@@ -38,162 +38,162 @@ extern float fl_quartz_line_width_;
// --- line and polygon drawing with integer coordinates // --- line and polygon drawing with integer coordinates
void Fl_Quartz_Graphics_Driver::point(int x, int y) { void Fl_Quartz_Graphics_Driver::point(int x, int y) {
CGContextFillRect(gc, CGRectMake(x - 0.5, y - 0.5, 1, 1) ); CGContextFillRect(gc_, CGRectMake(x - 0.5, y - 0.5, 1, 1) );
} }
void Fl_Quartz_Graphics_Driver::rect(int x, int y, int w, int h) { void Fl_Quartz_Graphics_Driver::rect(int x, int y, int w, int h) {
if (w<=0 || h<=0) return; if (w<=0 || h<=0) return;
if ( (!has_feature(PRINTER)) && fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if ( (!has_feature(PRINTER)) && fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGRect rect = CGRectMake(x, y, w-1, h-1); CGRect rect = CGRectMake(x, y, w-1, h-1);
CGContextStrokeRect(gc, rect); CGContextStrokeRect(gc_, rect);
if ( (!has_feature(PRINTER)) && fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if ( (!has_feature(PRINTER)) && fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::rectf(int x, int y, int w, int h) { void Fl_Quartz_Graphics_Driver::rectf(int x, int y, int w, int h) {
if (w<=0 || h<=0) return; if (w<=0 || h<=0) return;
CGRect rect = CGRectMake(x - 0.5, y - 0.5, w , h); CGRect rect = CGRectMake(x - 0.5, y - 0.5, w , h);
CGContextFillRect(gc, rect); CGContextFillRect(gc_, rect);
} }
void Fl_Quartz_Graphics_Driver::line(int x, int y, int x1, int y1) { void Fl_Quartz_Graphics_Driver::line(int x, int y, int x1, int y1) {
if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y1); CGContextAddLineToPoint(gc_, x1, y1);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::line(int x, int y, int x1, int y1, int x2, int y2) { void Fl_Quartz_Graphics_Driver::line(int x, int y, int x1, int y1, int x2, int y2) {
if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y1); CGContextAddLineToPoint(gc_, x1, y1);
CGContextAddLineToPoint(gc, x2, y2); CGContextAddLineToPoint(gc_, x2, y2);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1) { void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1) {
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y); CGContextAddLineToPoint(gc_, x1, y);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
if (Fl_Display_Device::high_resolution()) { if (Fl_Display_Device::high_resolution()) {
/* On retina displays, all xyline() and yxline() functions produce lines that are half-unit /* On retina displays, all xyline() and yxline() functions produce lines that are half-unit
(or one pixel) too short at both ends. This is corrected by filling at both ends rectangles (or one pixel) too short at both ends. This is corrected by filling at both ends rectangles
of size one unit by line-width. of size one unit by line-width.
*/ */
CGContextFillRect(gc, CGRectMake(x-0.5 , y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_)); CGContextFillRect(gc_, CGRectMake(x-0.5 , y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
CGContextFillRect(gc, CGRectMake(x1-0.5 , y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_)); CGContextFillRect(gc_, CGRectMake(x1-0.5 , y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
} }
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1, int y2) { void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1, int y2) {
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y); CGContextAddLineToPoint(gc_, x1, y);
CGContextAddLineToPoint(gc, x1, y2); CGContextAddLineToPoint(gc_, x1, y2);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
if (Fl_Display_Device::high_resolution()) { if (Fl_Display_Device::high_resolution()) {
CGContextFillRect(gc, CGRectMake(x-0.5, y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_)); CGContextFillRect(gc_, CGRectMake(x-0.5, y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
CGContextFillRect(gc, CGRectMake(x1 - fl_quartz_line_width_/2, y2-0.5, fl_quartz_line_width_, 1)); CGContextFillRect(gc_, CGRectMake(x1 - fl_quartz_line_width_/2, y2-0.5, fl_quartz_line_width_, 1));
} }
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) { void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) {
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y); CGContextAddLineToPoint(gc_, x1, y);
CGContextAddLineToPoint(gc, x1, y2); CGContextAddLineToPoint(gc_, x1, y2);
CGContextAddLineToPoint(gc, x3, y2); CGContextAddLineToPoint(gc_, x3, y2);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
if (Fl_Display_Device::high_resolution()) { if (Fl_Display_Device::high_resolution()) {
CGContextFillRect(gc, CGRectMake(x-0.5, y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_)); CGContextFillRect(gc_, CGRectMake(x-0.5, y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
CGContextFillRect(gc, CGRectMake(x3-0.5, y2 - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_)); CGContextFillRect(gc_, CGRectMake(x3-0.5, y2 - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
} }
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1) { void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1) {
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x, y1); CGContextAddLineToPoint(gc_, x, y1);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
if (Fl_Display_Device::high_resolution()) { if (Fl_Display_Device::high_resolution()) {
CGContextFillRect(gc, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1)); CGContextFillRect(gc_, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
CGContextFillRect(gc, CGRectMake(x - fl_quartz_line_width_/2, y1-0.5, fl_quartz_line_width_, 1)); CGContextFillRect(gc_, CGRectMake(x - fl_quartz_line_width_/2, y1-0.5, fl_quartz_line_width_, 1));
} }
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1, int x2) { void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1, int x2) {
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x, y1); CGContextAddLineToPoint(gc_, x, y1);
CGContextAddLineToPoint(gc, x2, y1); CGContextAddLineToPoint(gc_, x2, y1);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
if (Fl_Display_Device::high_resolution()) { if (Fl_Display_Device::high_resolution()) {
CGContextFillRect(gc, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1)); CGContextFillRect(gc_, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
CGContextFillRect(gc, CGRectMake(x2-0.5, y1 - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_)); CGContextFillRect(gc_, CGRectMake(x2-0.5, y1 - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
} }
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) { void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) {
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x, y1); CGContextAddLineToPoint(gc_, x, y1);
CGContextAddLineToPoint(gc, x2, y1); CGContextAddLineToPoint(gc_, x2, y1);
CGContextAddLineToPoint(gc, x2, y3); CGContextAddLineToPoint(gc_, x2, y3);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
if (Fl_Display_Device::high_resolution()) { if (Fl_Display_Device::high_resolution()) {
CGContextFillRect(gc, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1)); CGContextFillRect(gc_, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
CGContextFillRect(gc, CGRectMake(x2 - fl_quartz_line_width_/2, y3-0.5, fl_quartz_line_width_, 1)); CGContextFillRect(gc_, CGRectMake(x2 - fl_quartz_line_width_/2, y3-0.5, fl_quartz_line_width_, 1));
} }
if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (has_feature(PRINTER) || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2) { void Fl_Quartz_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2) {
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y1); CGContextAddLineToPoint(gc_, x1, y1);
CGContextAddLineToPoint(gc, x2, y2); CGContextAddLineToPoint(gc_, x2, y2);
CGContextClosePath(gc); CGContextClosePath(gc_);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) { void Fl_Quartz_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y1); CGContextAddLineToPoint(gc_, x1, y1);
CGContextAddLineToPoint(gc, x2, y2); CGContextAddLineToPoint(gc_, x2, y2);
CGContextAddLineToPoint(gc, x3, y3); CGContextAddLineToPoint(gc_, x3, y3);
CGContextClosePath(gc); CGContextClosePath(gc_);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2) { void Fl_Quartz_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2) {
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y1); CGContextAddLineToPoint(gc_, x1, y1);
CGContextAddLineToPoint(gc, x2, y2); CGContextAddLineToPoint(gc_, x2, y2);
CGContextClosePath(gc); CGContextClosePath(gc_);
CGContextFillPath(gc); CGContextFillPath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) { void Fl_Quartz_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, x, y); CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc, x1, y1); CGContextAddLineToPoint(gc_, x1, y1);
CGContextAddLineToPoint(gc, x2, y2); CGContextAddLineToPoint(gc_, x2, y2);
CGContextAddLineToPoint(gc, x3, y3); CGContextAddLineToPoint(gc_, x3, y3);
CGContextClosePath(gc); CGContextClosePath(gc_);
CGContextFillPath(gc); CGContextFillPath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
// --- clipping // --- clipping
@@ -271,28 +271,28 @@ extern void fl_quartz_restore_line_style_(CGContextRef gc);
void Fl_Quartz_Graphics_Driver::restore_clip() { void Fl_Quartz_Graphics_Driver::restore_clip() {
fl_clip_state_number++; fl_clip_state_number++;
Fl_Region r = rstack[rstackptr]; Fl_Region r = rstack[rstackptr];
if ( fl_window || gc ) { // clipping for a true window or an offscreen buffer if ( fl_window || gc_ ) { // clipping for a true window or an offscreen buffer
if (gc) { if (gc_) {
CGContextRestoreGState(gc); CGContextRestoreGState(gc_);
CGContextSaveGState(gc); CGContextSaveGState(gc_);
} }
// FLTK has only one global graphics state. // FLTK has only one global graphics state.
// This copies the FLTK state into the current Quartz context // This copies the FLTK state into the current Quartz context
if ( ! fl_window ) { // a bitmap context if ( ! fl_window ) { // a bitmap context
CGFloat hgt = CGBitmapContextGetHeight(gc); CGFloat hgt = CGBitmapContextGetHeight(gc_);
CGAffineTransform at = CGContextGetCTM(gc); CGAffineTransform at = CGContextGetCTM(gc_);
CGFloat offset = 0.5; CGFloat offset = 0.5;
if (at.a != 1 && at.a == at.d && at.b == 0 && at.c == 0) { // proportional scaling, no rotation if (at.a != 1 && at.a == at.d && at.b == 0 && at.c == 0) { // proportional scaling, no rotation
hgt /= at.a; hgt /= at.a;
offset /= at.a; offset /= at.a;
} }
CGContextTranslateCTM(gc, offset, hgt-offset); CGContextTranslateCTM(gc_, offset, hgt-offset);
CGContextScaleCTM(gc, 1.0f, -1.0f); // now 0,0 is top-left point of the context CGContextScaleCTM(gc_, 1.0f, -1.0f); // now 0,0 is top-left point of the context
} }
color(color()); color(color());
fl_quartz_restore_line_style_(gc); fl_quartz_restore_line_style_(gc_);
if (r) { //apply program clip if (r) { //apply program clip
CGContextClipToRects(gc, r->rects, r->count); CGContextClipToRects(gc_, r->rects, r->count);
} }
} }
} }
@@ -41,13 +41,13 @@ void Fl_Quartz_Graphics_Driver::vertex(double x,double y) {
} }
void Fl_Quartz_Graphics_Driver::end_points() { void Fl_Quartz_Graphics_Driver::end_points() {
if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, true); if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, true);
for (int i=0; i<n; i++) { for (int i=0; i<n; i++) {
CGContextMoveToPoint(gc, p[i].x, p[i].y); CGContextMoveToPoint(gc_, p[i].x, p[i].y);
CGContextAddLineToPoint(gc, p[i].x, p[i].y); CGContextAddLineToPoint(gc_, p[i].x, p[i].y);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
} }
if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc, false); if (fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::end_line() { void Fl_Quartz_Graphics_Driver::end_line() {
@@ -56,12 +56,12 @@ void Fl_Quartz_Graphics_Driver::end_line() {
return; return;
} }
if (n<=1) return; if (n<=1) return;
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, p[0].x, p[0].y); CGContextMoveToPoint(gc_, p[0].x, p[0].y);
for (int i=1; i<n; i++) for (int i=1; i<n; i++)
CGContextAddLineToPoint(gc, p[i].x, p[i].y); CGContextAddLineToPoint(gc_, p[i].x, p[i].y);
CGContextStrokePath(gc); CGContextStrokePath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::end_loop() { void Fl_Quartz_Graphics_Driver::end_loop() {
@@ -77,13 +77,13 @@ void Fl_Quartz_Graphics_Driver::end_polygon() {
return; return;
} }
if (n<=1) return; if (n<=1) return;
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, p[0].x, p[0].y); CGContextMoveToPoint(gc_, p[0].x, p[0].y);
for (int i=1; i<n; i++) for (int i=1; i<n; i++)
CGContextAddLineToPoint(gc, p[i].x, p[i].y); CGContextAddLineToPoint(gc_, p[i].x, p[i].y);
CGContextClosePath(gc); CGContextClosePath(gc_);
CGContextFillPath(gc); CGContextFillPath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::begin_complex_polygon() { void Fl_Quartz_Graphics_Driver::begin_complex_polygon() {
@@ -108,13 +108,13 @@ void Fl_Quartz_Graphics_Driver::end_complex_polygon() {
return; return;
} }
if (n<=1) return; if (n<=1) return;
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc, p[0].x, p[0].y); CGContextMoveToPoint(gc_, p[0].x, p[0].y);
for (int i=1; i<n; i++) for (int i=1; i<n; i++)
CGContextAddLineToPoint(gc, p[i].x, p[i].y); CGContextAddLineToPoint(gc_, p[i].x, p[i].y);
CGContextClosePath(gc); CGContextClosePath(gc_);
CGContextFillPath(gc); CGContextFillPath(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
void Fl_Quartz_Graphics_Driver::circle(double x, double y,double r) { void Fl_Quartz_Graphics_Driver::circle(double x, double y,double r) {
@@ -129,10 +129,10 @@ void Fl_Quartz_Graphics_Driver::circle(double x, double y,double r) {
// Quartz warning: circle won't scale to current matrix! // Quartz warning: circle won't scale to current matrix!
// Last argument must be 0 (counter-clockwise) or it draws nothing under __LP64__ !!!! // Last argument must be 0 (counter-clockwise) or it draws nothing under __LP64__ !!!!
CGContextSetShouldAntialias(gc, true); CGContextSetShouldAntialias(gc_, true);
CGContextAddArc(gc, xt, yt, (w+h)*0.25f, 0, 2.0f*M_PI, 0); CGContextAddArc(gc_, xt, yt, (w+h)*0.25f, 0, 2.0f*M_PI, 0);
(what == POLYGON ? CGContextFillPath : CGContextStrokePath)(gc); (what == POLYGON ? CGContextFillPath : CGContextStrokePath)(gc_);
CGContextSetShouldAntialias(gc, false); CGContextSetShouldAntialias(gc_, false);
} }
#endif // FL_CFG_GFX_QUARTZ #endif // FL_CFG_GFX_QUARTZ
@@ -59,7 +59,7 @@ int Fl_WinAPI_Screen_Driver::visual(int flags)
{ {
fl_GetDC(0); fl_GetDC(0);
if (flags & FL_DOUBLE) return 0; if (flags & FL_DOUBLE) return 0;
HDC gc = (HDC)Fl_Display_Device::display_device()->driver()->get_gc(); HDC gc = (HDC)Fl_Display_Device::display_device()->driver()->gc();
if (!(flags & FL_INDEX) && if (!(flags & FL_INDEX) &&
GetDeviceCaps(gc,BITSPIXEL) <= 8) return 0; GetDeviceCaps(gc,BITSPIXEL) <= 8) return 0;
if ((flags & FL_RGB8) && GetDeviceCaps(gc,BITSPIXEL)<24) return 0; if ((flags & FL_RGB8) && GetDeviceCaps(gc,BITSPIXEL)<24) return 0;
+6 -6
View File
@@ -31,7 +31,7 @@ const char *Fl_Xlib_Graphics_Driver::class_id = "Fl_Xlib_Graphics_Driver";
/* Reference to the current graphics context /* Reference to the current graphics context
For back-compatibility only. The preferred procedure to get this pointer is For back-compatibility only. The preferred procedure to get this pointer is
Fl_Surface_Device::surface()->driver()->get_gc(). Fl_Surface_Device::surface()->driver()->gc().
*/ */
GC fl_gc = 0; GC fl_gc = 0;
@@ -49,14 +49,14 @@ Fl_Graphics_Driver *Fl_Graphics_Driver::newMainGraphicsDriver()
return new Fl_Xlib_Graphics_Driver(); return new Fl_Xlib_Graphics_Driver();
} }
GC Fl_Xlib_Graphics_Driver::gc = NULL; GC Fl_Xlib_Graphics_Driver::gc_ = NULL;
Fl_Xlib_Graphics_Driver::Fl_Xlib_Graphics_Driver(void) { Fl_Xlib_Graphics_Driver::Fl_Xlib_Graphics_Driver(void) {
if (!gc) { if (!gc_) {
fl_open_display(); fl_open_display();
// the unique GC used by all X windows // the unique GC used by all X windows
gc = XCreateGC(fl_display, RootWindow(fl_display, fl_screen), 0, 0); gc_ = XCreateGC(fl_display, RootWindow(fl_display, fl_screen), 0, 0);
fl_gc = gc; fl_gc = gc_;
} }
} }
@@ -66,7 +66,7 @@ char Fl_Xlib_Graphics_Driver::can_do_alpha_blending() {
void Fl_Xlib_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy) { void Fl_Xlib_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy) {
XCopyArea(fl_display, pixmap, fl_window, gc, srcx, srcy, w, h, x, y); XCopyArea(fl_display, pixmap, fl_window, gc_, srcx, srcy, w, h, x, y);
} }
void Fl_Xlib_Graphics_Driver::copy_offscreen_with_alpha(int x, int y, int w, int h, void Fl_Xlib_Graphics_Driver::copy_offscreen_with_alpha(int x, int y, int w, int h,
+2 -2
View File
@@ -34,13 +34,13 @@
*/ */
class FL_EXPORT Fl_Xlib_Graphics_Driver : public Fl_Graphics_Driver { class FL_EXPORT Fl_Xlib_Graphics_Driver : public Fl_Graphics_Driver {
protected: protected:
static GC gc; static GC gc_;
public: public:
static const char *class_id; static const char *class_id;
Fl_Xlib_Graphics_Driver(void); Fl_Xlib_Graphics_Driver(void);
const char *class_name() {return class_id;}; const char *class_name() {return class_id;};
virtual int has_feature(driver_feature mask) { return mask & NATIVE; } virtual int has_feature(driver_feature mask) { return mask & NATIVE; }
virtual void *get_gc() { return gc; } virtual void *gc() { return gc_; }
char can_do_alpha_blending(); char can_do_alpha_blending();
// --- bitmap stuff // --- bitmap stuff
@@ -3,7 +3,7 @@
// //
// Arc (integer) drawing functions for the Fast Light Tool Kit (FLTK). // Arc (integer) drawing functions for the Fast Light Tool Kit (FLTK).
// //
// Copyright 1998-2010 by Bill Spitzak and others. // Copyright 1998-2016 by Bill Spitzak and others.
// //
// This library is free software. Distribution and use rights are outlined in // 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 // the file "COPYING" which should have been included with this file. If this
@@ -26,13 +26,13 @@
void Fl_Xlib_Graphics_Driver::arc(int x,int y,int w,int h,double a1,double a2) { void Fl_Xlib_Graphics_Driver::arc(int x,int y,int w,int h,double a1,double a2) {
if (w <= 0 || h <= 0) return; if (w <= 0 || h <= 0) return;
XDrawArc(fl_display, fl_window, gc, x,y,w-1,h-1, int(a1*64),int((a2-a1)*64)); XDrawArc(fl_display, fl_window, gc_, x,y,w-1,h-1, int(a1*64),int((a2-a1)*64));
} }
void Fl_Xlib_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2) { void Fl_Xlib_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2) {
if (w <= 0 || h <= 0) return; if (w <= 0 || h <= 0) return;
XDrawArc(fl_display, fl_window, gc, x,y,w-1,h-1, int(a1*64),int((a2-a1)*64)); XDrawArc(fl_display, fl_window, gc_, x,y,w-1,h-1, int(a1*64),int((a2-a1)*64));
XFillArc(fl_display, fl_window, gc, x,y,w-1,h-1, int(a1*64),int((a2-a1)*64)); XFillArc(fl_display, fl_window, gc_, x,y,w-1,h-1, int(a1*64),int((a2-a1)*64));
} }
// //
@@ -3,7 +3,7 @@
// //
// Color functions for the Fast Light Tool Kit (FLTK). // Color functions for the Fast Light Tool Kit (FLTK).
// //
// Copyright 1998-2010 by Bill Spitzak and others. // Copyright 1998-2016 by Bill Spitzak and others.
// //
// This library is free software. Distribution and use rights are outlined in // 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 // the file "COPYING" which should have been included with this file. If this
@@ -115,15 +115,15 @@ void Fl_Xlib_Graphics_Driver::color(Fl_Color i) {
fl_color((uchar)(rgb >> 24), (uchar)(rgb >> 16), (uchar)(rgb >> 8)); fl_color((uchar)(rgb >> 24), (uchar)(rgb >> 16), (uchar)(rgb >> 8));
} else { } else {
Fl_Graphics_Driver::color(i); Fl_Graphics_Driver::color(i);
if(!gc) return; // don't get a default gc if current window is not yet created/valid if(!gc_) return; // don't get a default gc if current window is not yet created/valid
XSetForeground(fl_display, gc, fl_xpixel(i)); XSetForeground(fl_display, gc_, fl_xpixel(i));
} }
} }
void Fl_Xlib_Graphics_Driver::color(uchar r,uchar g,uchar b) { void Fl_Xlib_Graphics_Driver::color(uchar r,uchar g,uchar b) {
Fl_Graphics_Driver::color( fl_rgb_color(r, g, b) ); Fl_Graphics_Driver::color( fl_rgb_color(r, g, b) );
if(!gc) return; // don't get a default gc if current window is not yet created/valid if(!gc_) return; // don't get a default gc if current window is not yet created/valid
XSetForeground(fl_display, gc, fl_xpixel(r,g,b)); XSetForeground(fl_display, gc_, fl_xpixel(r,g,b));
} }
/** \addtogroup fl_attributes /** \addtogroup fl_attributes
@@ -3,7 +3,7 @@
// //
// X11 font utilities for the Fast Light Tool Kit (FLTK). // X11 font utilities for the Fast Light Tool Kit (FLTK).
// //
// Copyright 1998-2010 by Bill Spitzak and others. // Copyright 1998-2016 by Bill Spitzak and others.
// //
// This library is free software. Distribution and use rights are outlined in // 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 // the file "COPYING" which should have been included with this file. If this
@@ -642,14 +642,14 @@ double Fl_Xlib_Graphics_Driver::width(unsigned int c) {
} }
void Fl_Xlib_Graphics_Driver::text_extents(const char *c, int n, int &dx, int &dy, int &W, int &H) { void Fl_Xlib_Graphics_Driver::text_extents(const char *c, int n, int &dx, int &dy, int &W, int &H) {
if (font_gc != gc) { if (font_gc != gc_) {
if (!font_descriptor()) font(FL_HELVETICA, FL_NORMAL_SIZE); if (!font_descriptor()) font(FL_HELVETICA, FL_NORMAL_SIZE);
font_gc = gc; font_gc = gc_;
XSetFont(fl_display, gc, font_descriptor()->font->fid); XSetFont(fl_display, gc_, font_descriptor()->font->fid);
} }
int xx, yy, ww, hh; int xx, yy, ww, hh;
xx = yy = ww = hh = 0; xx = yy = ww = hh = 0;
if (gc) XUtf8_measure_extents(fl_display, fl_window, font_descriptor()->font, gc, &xx, &yy, &ww, &hh, c, n); if (gc_) XUtf8_measure_extents(fl_display, fl_window, font_descriptor()->font, gc_, &xx, &yy, &ww, &hh, c, n);
W = ww; H = hh; dx = xx; dy = yy; W = ww; H = hh; dx = xx; dy = yy;
// This is the safe but mostly wrong thing we used to do... // This is the safe but mostly wrong thing we used to do...
@@ -660,12 +660,12 @@ void Fl_Xlib_Graphics_Driver::text_extents(const char *c, int n, int &dx, int &d
} }
void Fl_Xlib_Graphics_Driver::draw(const char* c, int n, int x, int y) { void Fl_Xlib_Graphics_Driver::draw(const char* c, int n, int x, int y) {
if (font_gc != gc) { if (font_gc != gc_) {
if (!font_descriptor()) this->font(FL_HELVETICA, FL_NORMAL_SIZE); if (!font_descriptor()) this->font(FL_HELVETICA, FL_NORMAL_SIZE);
font_gc = gc; font_gc = gc_;
XSetFont(fl_display, gc, font_descriptor()->font->fid); XSetFont(fl_display, gc_, font_descriptor()->font->fid);
} }
if (gc) XUtf8DrawString(fl_display, fl_window, font_descriptor()->font, gc, x, y, c, n); if (gc_) XUtf8DrawString(fl_display, fl_window, font_descriptor()->font, gc_, x, y, c, n);
} }
void Fl_Xlib_Graphics_Driver::draw(int angle, const char *str, int n, int x, int y) { void Fl_Xlib_Graphics_Driver::draw(int angle, const char *str, int n, int x, int y) {
@@ -674,11 +674,11 @@ void Fl_Xlib_Graphics_Driver::draw(int angle, const char *str, int n, int x, int
} }
void Fl_Xlib_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) { void Fl_Xlib_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) {
if (font_gc != gc) { if (font_gc != gc_) {
if (!font_descriptor()) this->font(FL_HELVETICA, FL_NORMAL_SIZE); if (!font_descriptor()) this->font(FL_HELVETICA, FL_NORMAL_SIZE);
font_gc = gc; font_gc = gc_;
} }
if (gc) XUtf8DrawRtlString(fl_display, fl_window, font_descriptor()->font, gc, x, y, c, n); if (gc_) XUtf8DrawRtlString(fl_display, fl_window, font_descriptor()->font, gc_, x, y, c, n);
} }
#endif // FL_DOXYGEN #endif // FL_DOXYGEN
// //
@@ -3,7 +3,7 @@
// //
// Image drawing routines for the Fast Light Tool Kit (FLTK). // Image drawing routines for the Fast Light Tool Kit (FLTK).
// //
// Copyright 1998-2010 by Bill Spitzak and others. // Copyright 1998-2016 by Bill Spitzak and others.
// //
// This library is free software. Distribution and use rights are outlined in // 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 // the file "COPYING" which should have been included with this file. If this
@@ -568,7 +568,7 @@ void Fl_Xlib_Graphics_Driver::draw_image(const uchar* buf, int x, int y, int w,
const bool alpha = !!(d & FL_IMAGE_WITH_ALPHA); const bool alpha = !!(d & FL_IMAGE_WITH_ALPHA);
d &= ~FL_IMAGE_WITH_ALPHA; d &= ~FL_IMAGE_WITH_ALPHA;
innards(buf,x,y,w,h,d,l,(d<3&&d>-3),0,0,alpha,gc); innards(buf,x,y,w,h,d,l,(d<3&&d>-3),0,0,alpha,gc_);
} }
void Fl_Xlib_Graphics_Driver::draw_image(Fl_Draw_Image_Cb cb, void* data, void Fl_Xlib_Graphics_Driver::draw_image(Fl_Draw_Image_Cb cb, void* data,
int x, int y, int w, int h,int d) { int x, int y, int w, int h,int d) {
@@ -576,14 +576,14 @@ void Fl_Xlib_Graphics_Driver::draw_image(Fl_Draw_Image_Cb cb, void* data,
const bool alpha = !!(d & FL_IMAGE_WITH_ALPHA); const bool alpha = !!(d & FL_IMAGE_WITH_ALPHA);
d &= ~FL_IMAGE_WITH_ALPHA; d &= ~FL_IMAGE_WITH_ALPHA;
innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data,alpha,gc); innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data,alpha,gc_);
} }
void Fl_Xlib_Graphics_Driver::draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){ void Fl_Xlib_Graphics_Driver::draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){
innards(buf,x,y,w,h,d,l,1,0,0,0,gc); innards(buf,x,y,w,h,d,l,1,0,0,0,gc_);
} }
void Fl_Xlib_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb cb, void* data, void Fl_Xlib_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb cb, void* data,
int x, int y, int w, int h,int d) { int x, int y, int w, int h,int d) {
innards(0,x,y,w,h,d,0,1,cb,data,0,gc); innards(0,x,y,w,h,d,0,1,cb,data,0,gc_);
} }
void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) { void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
@@ -593,7 +593,7 @@ void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
} else { } else {
uchar c[3]; uchar c[3];
c[0] = r; c[1] = g; c[2] = b; c[0] = r; c[1] = g; c[2] = b;
innards(c,x,y,w,h,0,0,0,0,0,0,(GC)fl_graphics_driver->get_gc()); innards(c,x,y,w,h,0,0,0,0,0,0,(GC)fl_graphics_driver->gc());
} }
} }
@@ -612,13 +612,13 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP
return; return;
} }
XSetStipple(fl_display, gc, bm->id_); XSetStipple(fl_display, gc_, bm->id_);
int ox = X-cx; if (ox < 0) ox += bm->w(); int ox = X-cx; if (ox < 0) ox += bm->w();
int oy = Y-cy; if (oy < 0) oy += bm->h(); int oy = Y-cy; if (oy < 0) oy += bm->h();
XSetTSOrigin(fl_display, gc, ox, oy); XSetTSOrigin(fl_display, gc_, ox, oy);
XSetFillStyle(fl_display, gc, FillStippled); XSetFillStyle(fl_display, gc_, FillStippled);
XFillRectangle(fl_display, fl_window, gc, X, Y, W, H); XFillRectangle(fl_display, fl_window, gc_, X, Y, W, H);
XSetFillStyle(fl_display, gc, FillSolid); XSetFillStyle(fl_display, gc_, FillSolid);
} }
@@ -729,10 +729,10 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, in
cx += nx-X; X = nx; cx += nx-X; X = nx;
cy += ny-Y; Y = ny; cy += ny-Y; Y = ny;
// make X use the bitmap as a mask: // make X use the bitmap as a mask:
XSetClipMask(fl_display, gc, img->mask_); XSetClipMask(fl_display, gc_, img->mask_);
int ox = X-cx; if (ox < 0) ox += img->w(); int ox = X-cx; if (ox < 0) ox += img->w();
int oy = Y-cy; if (oy < 0) oy += img->h(); int oy = Y-cy; if (oy < 0) oy += img->h();
XSetClipOrigin(fl_display, gc, X-cx, Y-cy); XSetClipOrigin(fl_display, gc_, X-cx, Y-cy);
} }
if (img->d() == 4 && fl_can_do_alpha_blending()) if (img->d() == 4 && fl_can_do_alpha_blending())
@@ -742,7 +742,7 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, in
if (img->mask_) { if (img->mask_) {
// put the old clip region back // put the old clip region back
XSetClipOrigin(fl_display, gc, 0, 0); XSetClipOrigin(fl_display, gc_, 0, 0);
fl_restore_clip(); fl_restore_clip();
} }
} else { } else {
@@ -778,8 +778,8 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int H
if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return; if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return;
if (pxm->mask_) { if (pxm->mask_) {
// make X use the bitmap as a mask: // make X use the bitmap as a mask:
XSetClipMask(fl_display, gc, pxm->mask_); XSetClipMask(fl_display, gc_, pxm->mask_);
XSetClipOrigin(fl_display, gc, X-cx, Y-cy); XSetClipOrigin(fl_display, gc_, X-cx, Y-cy);
if (clip_region()) { if (clip_region()) {
// At this point, XYWH is the bounding box of the intersection between // At this point, XYWH is the bounding box of the intersection between
// the current clip region and the (portion of the) pixmap we have to draw. // the current clip region and the (portion of the) pixmap we have to draw.
@@ -805,7 +805,7 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int H
copy_offscreen(X, Y, W, H, pxm->id_, cx, cy); copy_offscreen(X, Y, W, H, pxm->id_, cx, cy);
} }
// put the old clip region back // put the old clip region back
XSetClipOrigin(fl_display, gc, 0, 0); XSetClipOrigin(fl_display, gc_, 0, 0);
restore_clip(); restore_clip();
} }
else copy_offscreen(X, Y, W, H, pxm->id_, cx, cy); else copy_offscreen(X, Y, W, H, pxm->id_, cx, cy);
@@ -71,10 +71,10 @@ void Fl_Xlib_Graphics_Driver::line_style(int style, int width, char* dashes) {
} }
static int Cap[4] = {CapButt, CapButt, CapRound, CapProjecting}; static int Cap[4] = {CapButt, CapButt, CapRound, CapProjecting};
static int Join[4] = {JoinMiter, JoinMiter, JoinRound, JoinBevel}; static int Join[4] = {JoinMiter, JoinMiter, JoinRound, JoinBevel};
XSetLineAttributes(fl_display, gc, width, XSetLineAttributes(fl_display, gc_, width,
ndashes ? LineOnOffDash : LineSolid, ndashes ? LineOnOffDash : LineSolid,
Cap[(style>>8)&3], Join[(style>>12)&3]); Cap[(style>>8)&3], Join[(style>>12)&3]);
if (ndashes) XSetDashes(fl_display, gc, 0, dashes, ndashes); if (ndashes) XSetDashes(fl_display, gc_, 0, dashes, ndashes);
} }
#endif // FL_CFG_GFX_XLIB_LINE_STYLE_CXX #endif // FL_CFG_GFX_XLIB_LINE_STYLE_CXX
@@ -3,7 +3,7 @@
// //
// Rectangle drawing routines for the Fast Light Tool Kit (FLTK). // Rectangle drawing routines for the Fast Light Tool Kit (FLTK).
// //
// Copyright 1998-2012 by Bill Spitzak and others. // Copyright 1998-2016 by Bill Spitzak and others.
// //
// This library is free software. Distribution and use rights are outlined in // 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 // the file "COPYING" which should have been included with this file. If this
@@ -162,23 +162,23 @@ Fl_Region XRectangleRegion(int x, int y, int w, int h) {
// --- line and polygon drawing with integer coordinates // --- line and polygon drawing with integer coordinates
void Fl_Xlib_Graphics_Driver::point(int x, int y) { void Fl_Xlib_Graphics_Driver::point(int x, int y) {
XDrawPoint(fl_display, fl_window, gc, clip_x(x), clip_x(y)); XDrawPoint(fl_display, fl_window, gc_, clip_x(x), clip_x(y));
} }
void Fl_Xlib_Graphics_Driver::rect(int x, int y, int w, int h) { void Fl_Xlib_Graphics_Driver::rect(int x, int y, int w, int h) {
if (w<=0 || h<=0) return; if (w<=0 || h<=0) return;
if (!clip_to_short(x, y, w, h)) if (!clip_to_short(x, y, w, h))
XDrawRectangle(fl_display, fl_window, gc, x, y, w-1, h-1); XDrawRectangle(fl_display, fl_window, gc_, x, y, w-1, h-1);
} }
void Fl_Xlib_Graphics_Driver::rectf(int x, int y, int w, int h) { void Fl_Xlib_Graphics_Driver::rectf(int x, int y, int w, int h) {
if (w<=0 || h<=0) return; if (w<=0 || h<=0) return;
if (!clip_to_short(x, y, w, h)) if (!clip_to_short(x, y, w, h))
XFillRectangle(fl_display, fl_window, gc, x, y, w, h); XFillRectangle(fl_display, fl_window, gc_, x, y, w, h);
} }
void Fl_Xlib_Graphics_Driver::line(int x, int y, int x1, int y1) { void Fl_Xlib_Graphics_Driver::line(int x, int y, int x1, int y1) {
XDrawLine(fl_display, fl_window, gc, x, y, x1, y1); XDrawLine(fl_display, fl_window, gc_, x, y, x1, y1);
} }
void Fl_Xlib_Graphics_Driver::line(int x, int y, int x1, int y1, int x2, int y2) { void Fl_Xlib_Graphics_Driver::line(int x, int y, int x1, int y1, int x2, int y2) {
@@ -186,18 +186,18 @@ void Fl_Xlib_Graphics_Driver::line(int x, int y, int x1, int y1, int x2, int y2)
p[0].x = x; p[0].y = y; p[0].x = x; p[0].y = y;
p[1].x = x1; p[1].y = y1; p[1].x = x1; p[1].y = y1;
p[2].x = x2; p[2].y = y2; p[2].x = x2; p[2].y = y2;
XDrawLines(fl_display, fl_window, gc, p, 3, 0); XDrawLines(fl_display, fl_window, gc_, p, 3, 0);
} }
void Fl_Xlib_Graphics_Driver::xyline(int x, int y, int x1) { void Fl_Xlib_Graphics_Driver::xyline(int x, int y, int x1) {
XDrawLine(fl_display, fl_window, gc, clip_x(x), clip_x(y), clip_x(x1), clip_x(y)); XDrawLine(fl_display, fl_window, gc_, clip_x(x), clip_x(y), clip_x(x1), clip_x(y));
} }
void Fl_Xlib_Graphics_Driver::xyline(int x, int y, int x1, int y2) { void Fl_Xlib_Graphics_Driver::xyline(int x, int y, int x1, int y2) {
XPoint p[3]; XPoint p[3];
p[0].x = clip_x(x); p[0].y = p[1].y = clip_x(y); p[0].x = clip_x(x); p[0].y = p[1].y = clip_x(y);
p[1].x = p[2].x = clip_x(x1); p[2].y = clip_x(y2); p[1].x = p[2].x = clip_x(x1); p[2].y = clip_x(y2);
XDrawLines(fl_display, fl_window, gc, p, 3, 0); XDrawLines(fl_display, fl_window, gc_, p, 3, 0);
} }
void Fl_Xlib_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) { void Fl_Xlib_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) {
@@ -205,18 +205,18 @@ void Fl_Xlib_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) {
p[0].x = clip_x(x); p[0].y = p[1].y = clip_x(y); p[0].x = clip_x(x); p[0].y = p[1].y = clip_x(y);
p[1].x = p[2].x = clip_x(x1); p[2].y = p[3].y = clip_x(y2); p[1].x = p[2].x = clip_x(x1); p[2].y = p[3].y = clip_x(y2);
p[3].x = clip_x(x3); p[3].x = clip_x(x3);
XDrawLines(fl_display, fl_window, gc, p, 4, 0); XDrawLines(fl_display, fl_window, gc_, p, 4, 0);
} }
void Fl_Xlib_Graphics_Driver::yxline(int x, int y, int y1) { void Fl_Xlib_Graphics_Driver::yxline(int x, int y, int y1) {
XDrawLine(fl_display, fl_window, gc, clip_x(x), clip_x(y), clip_x(x), clip_x(y1)); XDrawLine(fl_display, fl_window, gc_, clip_x(x), clip_x(y), clip_x(x), clip_x(y1));
} }
void Fl_Xlib_Graphics_Driver::yxline(int x, int y, int y1, int x2) { void Fl_Xlib_Graphics_Driver::yxline(int x, int y, int y1, int x2) {
XPoint p[3]; XPoint p[3];
p[0].x = p[1].x = clip_x(x); p[0].y = clip_x(y); p[0].x = p[1].x = clip_x(x); p[0].y = clip_x(y);
p[1].y = p[2].y = clip_x(y1); p[2].x = clip_x(x2); p[1].y = p[2].y = clip_x(y1); p[2].x = clip_x(x2);
XDrawLines(fl_display, fl_window, gc, p, 3, 0); XDrawLines(fl_display, fl_window, gc_, p, 3, 0);
} }
void Fl_Xlib_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) { void Fl_Xlib_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) {
@@ -224,7 +224,7 @@ void Fl_Xlib_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) {
p[0].x = p[1].x = clip_x(x); p[0].y = clip_x(y); p[0].x = p[1].x = clip_x(x); p[0].y = clip_x(y);
p[1].y = p[2].y = clip_x(y1); p[2].x = p[3].x = clip_x(x2); p[1].y = p[2].y = clip_x(y1); p[2].x = p[3].x = clip_x(x2);
p[3].y = clip_x(y3); p[3].y = clip_x(y3);
XDrawLines(fl_display, fl_window, gc, p, 4, 0); XDrawLines(fl_display, fl_window, gc_, p, 4, 0);
} }
void Fl_Xlib_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2) { void Fl_Xlib_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2) {
@@ -233,7 +233,7 @@ void Fl_Xlib_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2)
p[1].x = x1; p[1].y = y1; p[1].x = x1; p[1].y = y1;
p[2].x = x2; p[2].y = y2; p[2].x = x2; p[2].y = y2;
p[3].x = x; p[3].y = y; p[3].x = x; p[3].y = y;
XDrawLines(fl_display, fl_window, gc, p, 4, 0); XDrawLines(fl_display, fl_window, gc_, p, 4, 0);
} }
void Fl_Xlib_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) { void Fl_Xlib_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {
@@ -243,7 +243,7 @@ void Fl_Xlib_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y2,
p[2].x = x2; p[2].y = y2; p[2].x = x2; p[2].y = y2;
p[3].x = x3; p[3].y = y3; p[3].x = x3; p[3].y = y3;
p[4].x = x; p[4].y = y; p[4].x = x; p[4].y = y;
XDrawLines(fl_display, fl_window, gc, p, 5, 0); XDrawLines(fl_display, fl_window, gc_, p, 5, 0);
} }
void Fl_Xlib_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2) { void Fl_Xlib_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2) {
@@ -252,8 +252,8 @@ void Fl_Xlib_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int
p[1].x = x1; p[1].y = y1; p[1].x = x1; p[1].y = y1;
p[2].x = x2; p[2].y = y2; p[2].x = x2; p[2].y = y2;
p[3].x = x; p[3].y = y; p[3].x = x; p[3].y = y;
XFillPolygon(fl_display, fl_window, gc, p, 3, Convex, 0); XFillPolygon(fl_display, fl_window, gc_, p, 3, Convex, 0);
XDrawLines(fl_display, fl_window, gc, p, 4, 0); XDrawLines(fl_display, fl_window, gc_, p, 4, 0);
} }
void Fl_Xlib_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) { void Fl_Xlib_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {
@@ -263,8 +263,8 @@ void Fl_Xlib_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int
p[2].x = x2; p[2].y = y2; p[2].x = x2; p[2].y = y2;
p[3].x = x3; p[3].y = y3; p[3].x = x3; p[3].y = y3;
p[4].x = x; p[4].y = y; p[4].x = x; p[4].y = y;
XFillPolygon(fl_display, fl_window, gc, p, 4, Convex, 0); XFillPolygon(fl_display, fl_window, gc_, p, 4, Convex, 0);
XDrawLines(fl_display, fl_window, gc, p, 5, 0); XDrawLines(fl_display, fl_window, gc_, p, 5, 0);
} }
// --- clipping // --- clipping
@@ -340,8 +340,8 @@ void Fl_Xlib_Graphics_Driver::pop_clip() {
void Fl_Xlib_Graphics_Driver::restore_clip() { void Fl_Xlib_Graphics_Driver::restore_clip() {
fl_clip_state_number++; fl_clip_state_number++;
Fl_Region r = rstack[rstackptr]; Fl_Region r = rstack[rstackptr];
if (r) XSetRegion(fl_display, gc, r); if (r) XSetRegion(fl_display, gc_, r);
else XSetClipMask(fl_display, gc, 0); else XSetClipMask(fl_display, gc_, 0);
} }
#endif // FL_CFG_GFX_XLIB_RECT_CXX #endif // FL_CFG_GFX_XLIB_RECT_CXX
@@ -41,7 +41,7 @@ void Fl_Xlib_Graphics_Driver::vertex(double x,double y) {
} }
void Fl_Xlib_Graphics_Driver::end_points() { void Fl_Xlib_Graphics_Driver::end_points() {
if (n>1) XDrawPoints(fl_display, fl_window, gc, p, n, 0); if (n>1) XDrawPoints(fl_display, fl_window, gc_, p, n, 0);
} }
void Fl_Xlib_Graphics_Driver::end_line() { void Fl_Xlib_Graphics_Driver::end_line() {
@@ -49,7 +49,7 @@ void Fl_Xlib_Graphics_Driver::end_line() {
end_points(); end_points();
return; return;
} }
if (n>1) XDrawLines(fl_display, fl_window, gc, p, n, 0); if (n>1) XDrawLines(fl_display, fl_window, gc_, p, n, 0);
} }
void Fl_Xlib_Graphics_Driver::end_loop() { void Fl_Xlib_Graphics_Driver::end_loop() {
@@ -64,7 +64,7 @@ void Fl_Xlib_Graphics_Driver::end_polygon() {
end_line(); end_line();
return; return;
} }
if (n>2) XFillPolygon(fl_display, fl_window, gc, p, n, Convex, 0); if (n>2) XFillPolygon(fl_display, fl_window, gc_, p, n, Convex, 0);
} }
void Fl_Xlib_Graphics_Driver::begin_complex_polygon() { void Fl_Xlib_Graphics_Driver::begin_complex_polygon() {
@@ -88,7 +88,7 @@ void Fl_Xlib_Graphics_Driver::end_complex_polygon() {
end_line(); end_line();
return; return;
} }
if (n>2) XFillPolygon(fl_display, fl_window, gc, p, n, 0, 0); if (n>2) XFillPolygon(fl_display, fl_window, gc_, p, n, 0, 0);
} }
// shortcut the closed circles so they use XDrawArc: // shortcut the closed circles so they use XDrawArc:
@@ -106,7 +106,7 @@ void Fl_Xlib_Graphics_Driver::circle(double x, double y,double r) {
int h = (int)rint(yt+ry)-lly; int h = (int)rint(yt+ry)-lly;
(what == POLYGON ? XFillArc : XDrawArc) (what == POLYGON ? XFillArc : XDrawArc)
(fl_display, fl_window, gc, llx, lly, w, h, 0, 360*64); (fl_display, fl_window, gc_, llx, lly, w, h, 0, 360*64);
} }
#endif // FL_CFG_GFX_XLIB_VERTEX_CXX #endif // FL_CFG_GFX_XLIB_VERTEX_CXX
+3 -3
View File
@@ -40,15 +40,15 @@ static int bgx, bgy, bgw, bgh;
static void draw_current_rect() { static void draw_current_rect() {
#ifdef USE_XOR #ifdef USE_XOR
# if defined(USE_X11) # if defined(USE_X11)
GC gc = (GC)fl_graphics_driver->get_gc(); GC gc = (GC)fl_graphics_driver->gc();
XSetFunction(fl_display, gc, GXxor); XSetFunction(fl_display, gc, GXxor);
XSetForeground(fl_display, gc, 0xffffffff); XSetForeground(fl_display, gc, 0xffffffff);
XDrawRectangle(fl_display, fl_window, gc, px, py, pw, ph); XDrawRectangle(fl_display, fl_window, gc, px, py, pw, ph);
XSetFunction(fl_display, gc, GXcopy); XSetFunction(fl_display, gc, GXcopy);
# elif defined(WIN32) # elif defined(WIN32)
int old = SetROP2(fl_graphics_driver->get_gc(), R2_NOT); int old = SetROP2(fl_graphics_driver->gc(), R2_NOT);
fl_rect(px, py, pw, ph); fl_rect(px, py, pw, ph);
SetROP2(fl_graphics_driver->get_gc(), old); SetROP2(fl_graphics_driver->gc(), old);
# elif defined(__APPLE_QUARTZ__) // PORTME: Fl_Window_Driver - platform overlay # elif defined(__APPLE_QUARTZ__) // PORTME: Fl_Window_Driver - platform overlay
// warning: Quartz does not support xor drawing // warning: Quartz does not support xor drawing
// Use the Fl_Overlay_Window instead. // Use the Fl_Overlay_Window instead.
+1 -1
View File
@@ -32,7 +32,7 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
uchar *base; uchar *base;
int rowBytes, delta; int rowBytes, delta;
if(fl_window == NULL) { // reading from an offscreen buffer if(fl_window == NULL) { // reading from an offscreen buffer
CGContextRef src = (CGContextRef)Fl_Surface_Device::surface()->driver()->get_gc(); // get bitmap context CGContextRef src = (CGContextRef)Fl_Surface_Device::surface()->driver()->gc(); // get bitmap context
base = (uchar *)CGBitmapContextGetData(src); // get data base = (uchar *)CGBitmapContextGetData(src); // get data
if(!base) return NULL; if(!base) return NULL;
int sw = CGBitmapContextGetWidth(src); int sw = CGBitmapContextGetWidth(src);
+1 -1
View File
@@ -77,7 +77,7 @@ read_win_rectangle(uchar *p, // I - Pixel buffer or NULL to allocate
bi.bmiHeader.biClrImportant = 0; bi.bmiHeader.biClrImportant = 0;
// copy bitmap from original DC (Window, Fl_Offscreen, ...) // copy bitmap from original DC (Window, Fl_Offscreen, ...)
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
HDC hdc = CreateCompatibleDC(gc); HDC hdc = CreateCompatibleDC(gc);
HBITMAP hbm = CreateCompatibleBitmap(gc,w,h); HBITMAP hbm = CreateCompatibleBitmap(gc,w,h);
+2 -2
View File
@@ -79,7 +79,7 @@ void fl_scroll(int X, int Y, int W, int H, int dx, int dy,
} }
#if defined(USE_X11) #if defined(USE_X11)
XCopyArea(fl_display, fl_window, fl_window, (GC)fl_graphics_driver->get_gc(), XCopyArea(fl_display, fl_window, fl_window, (GC)fl_graphics_driver->gc(),
src_x, src_y, src_w, src_h, dest_x, dest_y); src_x, src_y, src_w, src_h, dest_x, dest_y);
// we have to sync the display and get the GraphicsExpose events! (sigh) // we have to sync the display and get the GraphicsExpose events! (sigh)
for (;;) { for (;;) {
@@ -117,7 +117,7 @@ void fl_scroll(int X, int Y, int W, int H, int dx, int dy,
// multi-screen solutions, it will not solve issues scrolling // multi-screen solutions, it will not solve issues scrolling
// from a different resolution screen onto another. // from a different resolution screen onto another.
// Note 3: this has been tested with image maps, too. // Note 3: this has been tested with image maps, too.
HDC gc = (HDC)fl_graphics_driver->get_gc(); HDC gc = (HDC)fl_graphics_driver->gc();
if (fl_GetRandomRgn) { if (fl_GetRandomRgn) {
// get the DC region minus all overlapping windows // get the DC region minus all overlapping windows
HRGN sys_rgn = CreateRectRgn(0, 0, 0, 0); HRGN sys_rgn = CreateRectRgn(0, 0, 0, 0);
+9 -9
View File
@@ -101,10 +101,10 @@ void gl_font(int fontid, int size) {
// this is unused because USE_OksiD_style_GL_font_selection == 1 // this is unused because USE_OksiD_style_GL_font_selection == 1
int base = fl_fontsize->metr.tmFirstChar; int base = fl_fontsize->metr.tmFirstChar;
int count = fl_fontsize->metr.tmLastChar-base+1; int count = fl_fontsize->metr.tmLastChar-base+1;
HFONT oldFid = (HFONT)SelectObject((HDC)fl_graphics_driver->get_gc(), fl_fontsize->fid); HFONT oldFid = (HFONT)SelectObject((HDC)fl_graphics_driver->gc(), fl_fontsize->fid);
fl_fontsize->listbase = glGenLists(256); fl_fontsize->listbase = glGenLists(256);
wglUseFontBitmaps((HDC)fl_graphics_driver->get_gc(), base, count, fl_fontsize->listbase+base); wglUseFontBitmaps((HDC)fl_graphics_driver->gc(), base, count, fl_fontsize->listbase+base);
SelectObject((HDC)fl_graphics_driver->get_gc(), oldFid); SelectObject((HDC)fl_graphics_driver->gc(), oldFid);
# endif # endif
#endif // USE_OksiD_style_GL_font_selection #endif // USE_OksiD_style_GL_font_selection
@@ -132,9 +132,9 @@ static void get_list(int r) {
# endif # endif
#elif defined(WIN32) #elif defined(WIN32)
unsigned int ii = r * 0x400; unsigned int ii = r * 0x400;
HFONT oldFid = (HFONT)SelectObject((HDC)fl_graphics_driver->get_gc(), gl_fontsize->fid); HFONT oldFid = (HFONT)SelectObject((HDC)fl_graphics_driver->gc(), gl_fontsize->fid);
wglUseFontBitmapsW((HDC)fl_graphics_driver->get_gc(), ii, ii + 0x03ff, gl_fontsize->listbase+ii); wglUseFontBitmapsW((HDC)fl_graphics_driver->gc(), ii, ii + 0x03ff, gl_fontsize->listbase+ii);
SelectObject((HDC)fl_graphics_driver->get_gc(), oldFid); SelectObject((HDC)fl_graphics_driver->gc(), oldFid);
#else #else
# error unsupported platform # error unsupported platform
#endif #endif
@@ -491,10 +491,10 @@ int gl_texture_fifo::compute_texture(const char* str, int n)
CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
void *base = NULL; void *base = NULL;
if (fl_mac_os_version < 100600) base = calloc(4*fifo[current].width, h); if (fl_mac_os_version < 100600) base = calloc(4*fifo[current].width, h);
void* save_gc = fl_graphics_driver->get_gc(); void* save_gc = fl_graphics_driver->gc();
CGContextRef gc = CGBitmapContextCreate(base, fifo[current].width, h, 8, fifo[current].width*4, lut, CGContextRef gc = CGBitmapContextCreate(base, fifo[current].width, h, 8, fifo[current].width*4, lut,
(CGBitmapInfo)(kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host)); (CGBitmapInfo)(kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host));
fl_graphics_driver->set_gc(gc); fl_graphics_driver->gc(gc);
CGColorSpaceRelease(lut); CGColorSpaceRelease(lut);
GLfloat colors[4]; GLfloat colors[4];
glGetFloatv(GL_CURRENT_COLOR, colors); glGetFloatv(GL_CURRENT_COLOR, colors);
@@ -510,7 +510,7 @@ int gl_texture_fifo::compute_texture(const char* str, int n)
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, fifo[current].width, h, 0, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, CGBitmapContextGetData(gc)); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, fifo[current].width, h, 0, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, CGBitmapContextGetData(gc));
glPopAttrib(); glPopAttrib();
CGContextRelease(gc); CGContextRelease(gc);
fl_graphics_driver->set_gc(save_gc); fl_graphics_driver->gc(save_gc);
if (base) free(base); if (base) free(base);
} else { } else {
fifo[current].ratio = float(fifo[current].width)/glutStrokeLength(GLUT_STROKE_ROMAN, (uchar*)fifo[current].utf8); fifo[current].ratio = float(fifo[current].width)/glutStrokeLength(GLUT_STROKE_ROMAN, (uchar*)fifo[current].utf8);