racket/src/wxcommon/Region.h
Matthew Flatt 62d6db95c2 support cairo 0.5
svn: r459
2005-07-27 15:14:17 +00:00

257 lines
6.5 KiB
C++

#ifndef wb_rgnh
#define wb_rgnh
#include "wx_dc.h"
/************************************************************/
/* We start with wxPSStream, because we need it to output region
paths. */
class wxPSStream : public wxObject {
public:
void *f;
int int_width;
wxPSStream(char *file);
~wxPSStream(void);
int good(void);
void Out(char s);
void Out(const char *s);
void Out(double n);
void Out(long l);
void Out(int i);
long tellp(void);
void seekp(long pos);
void width(int w);
};
class wxPostScriptDC;
/************************************************************/
#ifdef UseXtRegions
typedef Region XtRegion;
#else
typedef void *XtRegion;
#endif
class wxPathRgn;
class wxPath;
class wxRegion : public wxObject
{
public:
#ifdef wx_msw
HRGN rgn;
#endif
#ifdef wx_x
XtRegion rgn;
#endif
#ifdef wx_mac
RgnHandle rgn;
#endif
wxPathRgn *prgn;
wxDC *dc;
char is_ps, locked, no_prgn;
wxRegion(wxDC *dc, wxRegion *r = NULL, Bool no_prgn = FALSE);
~wxRegion();
inline wxDC *GetDC() { return dc; }
void SetRectangle(double x, double y, double width, double height);
void SetRoundedRectangle(double x, double y, double width, double height, double radius = 20.0);
void SetEllipse(double x, double y, double width, double height);
void SetPolygon(int n, wxPoint points[], double xoffset = 0, double yoffset = 0,
int fillStyle=wxODDEVEN_RULE, int delta = 0);
void SetPath(wxPath *p, double xoffset = 0, double yoffset = 0,
int fillStyle=wxODDEVEN_RULE);
void SetArc(double x, double y, double w, double h, double start, double end);
void Union(wxRegion *);
void Intersect(wxRegion *);
void Subtract(wxRegion *);
void Xor(wxRegion *r);
void BoundingBox(double *x, double *y, double *w, double *h);
Bool Empty();
Bool ReallyEmpty();
Bool IsInRegion(double x, double y);
void Cleanup();
void Install(long target, Bool align);
void InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
/************************************************************/
class wxPathRgn : public wxObject
{
public:
double ox, oy, sx, sy;
wxPathRgn(wxDC *dc_for_scale);
~wxPathRgn();
virtual Bool Install(long target, Bool reverse, Bool align) = 0;
void PrepareScale(long target, Bool oe, Bool align, void *m);
void RestoreScale(long target, Bool align, void *m);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s) = 0;
double XFormX(double x, Bool align);
double XFormY(double x, Bool align);
double XFormXB(double x, Bool align);
double XFormYB(double x, Bool align);
double XFormW(double w, double x, Bool align);
double XFormH(double h, double y, Bool align);
};
class wxRectanglePathRgn : public wxPathRgn
{
public:
double x;
double y;
double width;
double height;
wxRectanglePathRgn(wxDC *dc_for_scale, double x, double y, double width, double height);
virtual Bool Install(long target, Bool reverse, Bool align);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
class wxRoundedRectanglePathRgn : public wxPathRgn
{
public:
double x;
double y;
double width;
double height;
double radius;
wxRoundedRectanglePathRgn(wxDC *dc_for_scale, double x, double y, double width, double height, double radius);
virtual Bool Install(long target, Bool reverse, Bool align);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
class wxPolygonPathRgn : public wxPathRgn
{
public:
int n;
wxPoint *points;
double xoffset;
double yoffset;
int fillStyle;
wxPolygonPathRgn(wxDC *dc_for_scale, int n, wxPoint points[], double xoffset, double yoffset, int fillStyle);
virtual Bool Install(long target, Bool reverse, Bool align);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
class wxArcPathRgn : public wxPathRgn
{
public:
double x;
double y;
double w;
double h;
double start;
double end;
wxArcPathRgn(wxDC *dc_for_scale, double x, double y, double w, double h, double start, double end);
virtual Bool Install(long target, Bool reverse, Bool align);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
class wxPathPathRgn : public wxPathRgn
{
public:
wxPath *p;
int fillStyle;
wxPathPathRgn(wxDC *dc_for_scale, wxPath *p, double xoffset, double yoffset, int fillStyle);
virtual Bool Install(long target, Bool reverse, Bool align);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
class wxUnionPathRgn : public wxPathRgn
{
public:
wxPathRgn *a, *b;
wxUnionPathRgn(wxPathRgn *f, wxPathRgn *s);
virtual Bool Install(long target, Bool reverse, Bool align);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
class wxIntersectPathRgn : public wxPathRgn
{
public:
wxPathRgn *a, *b;
wxIntersectPathRgn(wxPathRgn *f, wxPathRgn *s);
virtual Bool Install(long target, Bool reverse, Bool align);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
class wxDiffPathRgn : public wxPathRgn
{
public:
wxPathRgn *a, *b;
wxDiffPathRgn(wxPathRgn *f, wxPathRgn *s);
virtual Bool Install(long target, Bool reverse, Bool align);
virtual Bool InstallPS(wxPostScriptDC *dc, wxPSStream *s);
};
/************************************************************/
class wxPath : public wxObject
{
public:
long cmd_size, alloc_cmd_size, last_cmd;
double *cmds;
int num_polys;
double **poly_pts;
wxPath();
~wxPath();
void Reset();
Bool IsOpen();
void Close();
void MoveTo(double x, double y);
void LineTo(double x, double y);
void Arc(double x, double y, double w, double h, double start, double end, Bool ccw);
void CurveTo(double x1, double y1, double x2, double y2, double x3, double y3);
void Rectangle(double x, double y, double width, double height);
void RoundedRectangle(double x, double y, double width, double height, double radius = 20.0);
void Ellipse(double x, double y, double width, double height);
void Lines(int n, wxPoint points[], double xoffset = 0, double yoffset = 0);
void Translate(double x, double y);
void Scale(double x, double y);
void Rotate(double a);
void Reverse(int start_cmd = 0, Bool start_with_line = 0);
void AddPath(wxPath *p);
void Install(long target, double dx, double dy,
double ox, double oy, double sx, double sy,
Bool align, double pox, double poy);
void InstallPS(wxPostScriptDC *dc, wxPSStream *s, double dx, double dy);
int ToPolygons(int **_lens, double ***_pts, double sx, double sy);
void BoundingBox(double *x1, double *y1, double *x2, double *y2);
private:
void MakeRoom(int n);
void ClearCache();
};
#endif