mirror of
https://github.com/fltk/fltk.git
synced 2026-05-29 20:45:33 +08:00
Improve drawing of rounded box (STR #2943).
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@11814 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
@@ -46,6 +46,7 @@ CHANGES IN FLTK 1.3.4 RELEASED: ??? ?? 2016
|
|||||||
|
|
||||||
Other improvements
|
Other improvements
|
||||||
|
|
||||||
|
- Improved drawing of rounded box (STR #2943).
|
||||||
- Full support of Apple 'retina' displays for which one drawing unit
|
- Full support of Apple 'retina' displays for which one drawing unit
|
||||||
corresponds to two pixels.
|
corresponds to two pixels.
|
||||||
- The Mac OS X platform no longer uses the deprecated AGL
|
- The Mac OS X platform no longer uses the deprecated AGL
|
||||||
|
|||||||
+20
-9
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// Rounded box drawing routines for the Fast Light Tool Kit (FLTK).
|
// Rounded box 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
|
||||||
@@ -19,29 +19,40 @@
|
|||||||
#include <FL/Fl.H>
|
#include <FL/Fl.H>
|
||||||
#include <FL/fl_draw.H>
|
#include <FL/fl_draw.H>
|
||||||
|
|
||||||
|
// Constants for rounded corner drawing algorithm:
|
||||||
|
//
|
||||||
|
// RN = number of segments per corner (must match offset array size)
|
||||||
|
// RS = max. corner radius
|
||||||
|
// BW = box shadow width
|
||||||
|
|
||||||
#define RN 5
|
#define RN 5
|
||||||
#define RS 15
|
#define RS 15
|
||||||
#define BW 3
|
#define BW 3
|
||||||
|
|
||||||
static double offset[RN] = { 0.0, 0.07612, 0.29289, 0.61732, 1.0};
|
static double offset[RN] = { 0.0, 0.07612, 0.29289, 0.61732, 1.0};
|
||||||
|
|
||||||
|
static inline void fl_vertex_r(double x, double y) {
|
||||||
|
fl_vertex(x + 0.5, y + 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
static void rbox(int fill, int x, int y, int w, int h) {
|
static void rbox(int fill, int x, int y, int w, int h) {
|
||||||
int i;
|
int i;
|
||||||
int rsx ,rsy, rs;
|
int rs, rsy;
|
||||||
rsx = w*2/5; rsy = h*2/5;
|
rs = w*2/5; rsy = h*2/5;
|
||||||
if (rsx > rsy) rs = rsy; else rs = rsx;
|
if (rs > rsy) rs = rsy; // use smaller radius
|
||||||
if (rs > RS) rs = RS;
|
if (rs > RS) rs = RS;
|
||||||
rsx = rs; rsy = rs;
|
if (rs == 5) rs = 4; // use only even sizes for small corners (STR #2943)
|
||||||
|
if (rs == 7) rs = 8; // note: 8 is better than 6 (really)
|
||||||
|
|
||||||
if (fill) fl_begin_polygon(); else fl_begin_loop();
|
if (fill) fl_begin_polygon(); else fl_begin_loop();
|
||||||
for (i=0; i<RN; i++)
|
for (i=0; i<RN; i++)
|
||||||
fl_vertex(x + offset[RN-i-1]*rsx, y + offset[i] * rsy);
|
fl_vertex_r(x + offset[RN-i-1]*rs, y + offset[i] * rs);
|
||||||
for (i=0; i<RN; i++)
|
for (i=0; i<RN; i++)
|
||||||
fl_vertex(x + offset[i]*rsx, y + h-1 - offset[RN-i-1] * rsy);
|
fl_vertex_r(x + offset[i]*rs, y + h-1 - offset[RN-i-1] * rs);
|
||||||
for (i=0; i<RN; i++)
|
for (i=0; i<RN; i++)
|
||||||
fl_vertex(x + w-1 - offset[RN-i-1]*rsx, y + h-1 - offset[i] * rsy);
|
fl_vertex_r(x + w-1 - offset[RN-i-1]*rs, y + h-1 - offset[i] * rs);
|
||||||
for (i=0; i<RN; i++)
|
for (i=0; i<RN; i++)
|
||||||
fl_vertex(x + w-1 - offset[i]*rsx, y + offset[RN-i-1] * rsy);
|
fl_vertex_r(x + w-1 - offset[i]*rs, y + offset[RN-i-1] * rs);
|
||||||
if (fill) fl_end_polygon(); else fl_end_loop();
|
if (fill) fl_end_polygon(); else fl_end_loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user