racket/src/wxxt/src/DeviceContexts/WindowDC.h
Eli Barzilay 8ecd7a93c9 fix FSF address
svn: r5911
2007-04-10 17:59:38 +00:00

273 lines
7.8 KiB
C++

/* -*- C++ -*-
*
* Purpose: device context to draw drawables
* (windows and pixmaps, even if pixmaps are covered by wxMemoryDC)
*
* Authors: Markus Holzem and Julian Smart
*
* Copyright: (C) 2004-2007 PLT Scheme Inc.
* Copyright: (C) 1995, AIAI, University of Edinburgh (Julian)
* Copyright: (C) 1995, GNU (Markus)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
#ifndef WindowDC_h
#define WindowDC_h
// wxWindowDC is applyable to ALL from wxWindow derived classes!
// wxCanvasDC and wxPanelDC are aliases for compatibility
#define wxCanvasDC wxWindowDC
#define wxPanelDC wxWindowDC
#ifdef __GNUG__
#pragma interface
#endif
class wxBitmap;
class wxBrush;
class wxColour;
class wxColourMap;
class wxFont;
class wxIcon;
class wxList;
class wxPen;
#ifdef USE_GL
class wxGL;
class wxGLConfig;
#endif
#ifdef Have_X_Types
class wxWindowDC_Xinit : public gc {
public:
Display* dpy; // display of drawable
Screen* scn; // screen of drawable
Drawable drawable; // init to 0 if drawable is not created
wxWindow *owner;
};
class wxWindowDC_Xintern : public gc { // X GDI data
public:
GC pen_gc, brush_gc, text_gc, bg_gc;
Region user_reg, expose_reg, current_reg;
Display *dpy;
Screen *scn;
Drawable drawable;
#ifdef WX_USE_XRENDER
long picture; /* If WX_USE_XFT, picture is actually an XftDraw* */
#endif
#ifdef WX_USE_CAIRO
long cairo_dev;
char reset_cairo_clip;
#endif
Window draw_window;
unsigned int width, height, depth;
wxWindow *owner;
#ifdef USE_GL
wxGL *wx_gl;
wxGLConfig *gl_cfg;
#endif
/* Implement GetPixel */
XImage *get_pixel_image_cache;
int get_pixel_cache_pos;
XColor *get_pixel_color_cache;
short get_pixel_cache_full, set_a_pixel;
Bool is_window;
int cache_dx, cache_dy;
};
// easier access to private data
#define PEN_GC (X->pen_gc)
#define BRUSH_GC (X->brush_gc)
#define TEXT_GC (X->text_gc)
#define BG_GC (X->bg_gc)
#define USER_REG (X->user_reg)
#define EXPOSE_REG (X->expose_reg)
#define CURRENT_REG (X->current_reg)
#define DPY (X->dpy)
#define SCN (X->scn)
#define DRAWABLE (X->drawable)
#define DRAW_WINDOW (X->draw_window)
#define WIDTH (X->width)
#define HEIGHT (X->height)
#define DEPTH (X->depth)
#define CMAP GETCOLORMAP(current_cmap)
# ifdef WX_USE_XFT
# define XFTDRAW ((XftDraw *)X->picture)
# define TO_PICTURE(x) XftDrawPicture((XftDraw *)x)
# define PICTURE TO_PICTURE(XFTDRAW)
# else
# define TO_PICTURE(x) ((Picture)x)
# define PICTURE ((Picture)X->picture)
# endif
#define CAIRO_DEV ((cairo_t *)X->cairo_dev)
#else // not implementation but use!
class wxWindowDC_Xinit;
class wxWindowDC_Xintern;
#endif
class wxWindowDC : public wxDC {
public:
wxWindowDC(void);
~wxWindowDC(void);
// virtual methods, declared in wxDC
Bool Blit(double xdest, double ydest, double w, double h, wxBitmap *bm,
double xsrc, double ysrc, int rop=wxSOLID, wxColour *c=NULL, wxBitmap *mask=NULL);
Bool GCBlit(double xdest, double ydest, double w, double h, wxBitmap *bm,
double xsrc, double ysrc, wxBitmap *mask=NULL);
Bool CanGetTextExtent(void) { return TRUE; }
Bool CanDrawBitmap(void) { return TRUE; }
void Clear(void);
void DrawArc(double x1, double y1, double x2, double y2, double xc, double yc);
void DrawEllipse(double x, double y, double w, double h);
void DrawLine(double x1, double y1, double x2, double y2);
void DrawLines(int n, wxPoint pts[], double xoff=0, double yoff=0);
void DrawPoint(double x, double y);
void DrawPolygon(int n, wxPoint pts[], double xoff=0, double yoff=0, int fill=wxODDEVEN_RULE);
void DrawRectangle(double x, double y, double w, double h);
void DrawRoundedRectangle(double x, double y, double w, double h, double radius=20);
void DrawPath(wxPath *p, double dx, double dy, int fill=wxODDEVEN_RULE);
void DrawText(char *text, double x, double y, Bool combine = FALSE, Bool use16 = FALSE, int dt = 0, double angle = 0.0);
double GetCharHeight(void);
double GetCharWidth(void);
void GetTextExtent(const char *s, double *w, double *h, double *descent = 0,
double *ext_leading = 0, wxFont *font=NULL,
Bool combine=FALSE, Bool use16bit=FALSE, int dt=0,
int len=-1);
void SetBackground(wxColour *c);
void SetBrush(wxBrush *brush);
void ResetBrush(wxBrush *brush);
void SetClippingRect(double x, double y, double w, double h);
void SetClippingRegion(wxRegion*);
wxRegion* GetClippingRegion();
void SetColourMap(wxColourMap *cmap);
void SetFont(wxFont *font);
void SetPen(wxPen *pen);
void ResetPen(wxPen *pen);
void SetTextBackground(wxColour *col);
void SetTextForeground(wxColour *col);
// methods unique to wxWindowDC
void SetCanvasClipping(void);
virtual void GetSize(double *w, double *h);
void TryColour(wxColour *src, wxColour *dest);
Bool GetPixel(double x, double y, wxColour *col);
void BeginSetPixel(int mini, int near_i, int near_j);
void EndSetPixel();
void SetPixel(double x, double y, wxColour *col);
Bool BeginSetPixelFast(int x, int y, int w, int h);
void EndSetPixelFast();
void SetPixelFast(int x, int y, int r, int g, int b);
Bool BeginGetPixelFast(int x, int y, int w, int h);
void EndGetPixelFast();
void GetPixelFast(int x, int y, int *r, int *g, int *b);
void FillPrivateColor(wxColour *c);
virtual Bool GlyphAvailable(int c, wxFont *f = NULL);
virtual Bool Ok(void);
#ifdef WX_USE_XRENDER
virtual void InitPicture();
void InitPictureClip();
#endif
#ifdef USE_GL
virtual wxGL *GetGL();
void SetGLConfig(wxGLConfig *cfg);
#endif
#ifdef WX_USE_CAIRO
void InitCairoDev();
void ReleaseCairoDev();
Bool SetCairoPen();
Bool SetCairoBrush();
void SetAntiAlias(int v);
Bool AlignSmoothing();
double GetPenSmoothingOffset();
double SmoothingXFormX(double x);
double SmoothingXFormY(double y);
double SmoothingXFormW(double w, double x);
double SmoothingXFormH(double h, double y);
double SmoothingXFormXB(double x);
double SmoothingXFormYB(double y);
double SmoothingXFormWL(double w, double x);
double SmoothingXFormHL(double h, double y);
#endif
protected:
friend class wxWindow;
friend class wxPostScriptDC;
char need_x_set_font;
void Initialize(wxWindowDC_Xinit* init);
void Destroy(void);
virtual void FreeGetPixelCache(void);
wxWindowDC_Xintern* X;
};
#ifdef WX_USE_XRENDER
# ifdef Have_X_Types
extern int wxXRenderHere(void);
extern long wxMakePicture(Drawable d, int color); // returns Picture or XftDraw*
extern void wxFreePicture(long);
# endif
#endif
#ifdef USE_GL
class wxGL : public wxObject {
public:
wxGL();
virtual ~wxGL();
int Ok();
void Reset(wxGLConfig *_cfg, long d, Bool offscreen);
long draw_to; /* really a Drawable */
long GLctx; /* really a GLXContext */
long glx_pm; /* really a GLXPixmap */
void SwapBuffers(void);
void ThisContextCurrent(void);
};
#endif
#ifdef Have_X_Types
void wxGetTextExtent(Display *dpy, double scale_x, double scale_y,
const char *orig_s, double *_w, double *_h, double *_descent,
double *_topspace, wxFont *font_to_use,
Bool combine, Bool isUnicode, int dt, int len);
#endif
#endif // WindowDC_hh