use ResetClipping() instead of simply setting m_clipping to false; added call to it to wxDCBase::DestroyClippingRegion() so that some ports don't have to define their own version of it at all

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27107 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2004-05-05 22:43:57 +00:00
parent 2e76da5450
commit d16b634fa3
12 changed files with 186 additions and 213 deletions

View File

@@ -133,6 +133,7 @@ public:
#endif // wxUSE_PALETTE
{
ResetBoundingBox();
ResetClipping();
}
~wxDCBase() { }
@@ -314,18 +315,18 @@ public:
* \param y Upper left corner of bounding box.
* \param w Width of bounding box.
* \param h Height of bounding box.
* \param sa Starting angle of arc
* \param sa Starting angle of arc
* (counterclockwise, start at 3 o'clock, 360 is full circle).
* \param ea Ending angle of arc.
* \param angle Rotation angle, the Arc will be rotated after
* \param angle Rotation angle, the Arc will be rotated after
* calculating begin and end.
*/
void DrawEllipticArcRot( wxCoord x, wxCoord y,
wxCoord width, wxCoord height,
void DrawEllipticArcRot( wxCoord x, wxCoord y,
wxCoord width, wxCoord height,
double sa = 0, double ea = 0, double angle = 0 )
{ DoDrawEllipticArcRot( x, y, width, height, sa, ea, angle ); }
void DrawEllipticArcRot( const wxPoint& pt,
void DrawEllipticArcRot( const wxPoint& pt,
const wxSize& sz,
double sa = 0, double ea = 0, double angle = 0 )
{ DoDrawEllipticArcRot( pt.x, pt.y, sz.x, sz.y, sa, ea, angle ); }
@@ -334,27 +335,27 @@ public:
double sa = 0, double ea = 0, double angle = 0 )
{ DoDrawEllipticArcRot( rect.x, rect.y, rect.width, rect.height, sa, ea, angle ); }
virtual void DoDrawEllipticArcRot( wxCoord x, wxCoord y,
wxCoord w, wxCoord h,
virtual void DoDrawEllipticArcRot( wxCoord x, wxCoord y,
wxCoord w, wxCoord h,
double sa = 0, double ea = 0, double angle = 0 );
//! Rotates points around center.
/*! This is a quite straight method, it calculates in pixels
* and so it produces rounding errors.
* \param points The points inside will be rotated.
* \param angle Rotating angle (counterclockwise, start at 3 o'clock, 360 is full circle).
* \param center Center of rotation.
*/
*/
void Rotate( wxList* points, double angle, wxPoint center = wxPoint() );
// used by DrawEllipticArcRot
// Careful: wxList gets filled with points you have to delete later.
void CalculateEllipticPoints( wxList* points,
wxCoord xStart, wxCoord yStart,
wxCoord w, wxCoord h,
void CalculateEllipticPoints( wxList* points,
wxCoord xStart, wxCoord yStart,
wxCoord w, wxCoord h,
double sa, double ea );
#endif
// global DC operations
// --------------------
@@ -390,21 +391,13 @@ public:
void SetClippingRegion(const wxRegion& region)
{ DoSetClippingRegionAsRegion(region); }
virtual void DestroyClippingRegion() = 0;
virtual void DestroyClippingRegion() { ResetClipping(); }
void GetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const
{ DoGetClippingBox(x, y, w, h); }
void GetClippingBox(wxRect& rect) const
{
#if 1
DoGetClippingBox(&rect.x, &rect.y, &rect.width, &rect.height);
#else
// Necessary to use intermediate variables for 16-bit compilation
// REMOVE ME if the above is OK for all current platforms
wxCoord x, y, w, h;
DoGetClippingBox(&x, &y, &w, &h);
rect.x = x; rect.y = y; rect.width = w; rect.height = h;
#endif
}
// text extent
@@ -432,7 +425,7 @@ public:
bool GetPartialTextExtents(const wxString& text, wxArrayInt& widths) const
{ return DoGetPartialTextExtents(text, widths); }
// size and resolution
// -------------------
@@ -699,17 +692,14 @@ protected:
virtual void DoGetClippingBox(wxCoord *x, wxCoord *y,
wxCoord *w, wxCoord *h) const
{
if ( m_clipping )
{
if ( x ) *x = m_clipX1;
if ( y ) *y = m_clipY1;
if ( w ) *w = m_clipX2 - m_clipX1;
if ( h ) *h = m_clipY2 - m_clipY1;
}
else
{
*x = *y = *w = *h = 0;
}
if ( x )
*x = m_clipX1;
if ( y )
*y = m_clipY1;
if ( w )
*w = m_clipX2 - m_clipX1;
if ( h )
*h = m_clipY2 - m_clipY1;
}
virtual void DoGetLogicalOrigin(wxCoord *x, wxCoord *y) const
@@ -729,14 +719,22 @@ protected:
wxCoord *descent = NULL,
wxCoord *externalLeading = NULL,
wxFont *theFont = NULL) const = 0;
virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const;
#if wxUSE_SPLINES
virtual void DoDrawSpline(wxList *points);
#endif
protected:
// unset clipping variables (after clipping region was destroyed)
void ResetClipping()
{
m_clipping = false;
m_clipX1 = m_clipX2 = m_clipY1 = m_clipY2 = 0;
}
// flags
bool m_colour:1;
bool m_ok:1;

View File

@@ -46,9 +46,6 @@ public:
void SetColourMap( const wxPalette& palette ) { SetPalette(palette); };
// the first two must be overridden and called
virtual void DestroyClippingRegion();
// Resolution in pixels per logical inch
virtual wxSize GetPPI() const;

View File

@@ -46,9 +46,6 @@ public:
void SetColourMap( const wxPalette& palette ) { SetPalette(palette); };
// the first two must be overridden and called
virtual void DestroyClippingRegion();
// Resolution in pixels per logical inch
virtual wxSize GetPPI() const;

View File

@@ -44,38 +44,36 @@
class WXDLLEXPORT wxDC : public wxDCBase
{
DECLARE_DYNAMIC_CLASS(wxDC)
public:
wxDC();
~wxDC() { }
// implement base class pure virtuals
// ----------------------------------
virtual void DestroyClippingRegion();
virtual wxSize GetPPI() const;
virtual void SetMapMode(int mode);
virtual void SetUserScale(double x, double y);
virtual void SetLogicalScale(double x, double y);
virtual void SetLogicalOrigin(wxCoord x, wxCoord y);
virtual void SetDeviceOrigin(wxCoord x, wxCoord y);
virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp);
protected:
virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y);
virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y,
bool useMask = FALSE);
virtual void DoSetClippingRegion(wxCoord x, wxCoord y,
wxCoord width, wxCoord height);
virtual void DoGetSize(int *width, int *height) const;
virtual void DoGetSizeMM(int* width, int* height) const;
public:
void ComputeScaleAndOrigin();
wxCoord XDEV2LOG(wxCoord x) const
{
wxCoord new_x = x - m_deviceOriginX;
@@ -154,14 +152,14 @@ public:
else
return (wxCoord)((double)(y) * m_scaleY - 0.5);
}
public:
// not sure what for, but what is a mm on a screen you don't know the size of?
double m_mm_to_pix_x,m_mm_to_pix_y;
// recompute scale?
bool m_needComputeScaleX, m_needComputeScaleY;
};
#endif

View File

@@ -46,29 +46,27 @@ class WXDLLEXPORT wxDC : public wxDCBase
public:
wxDC();
~wxDC() { }
// implement base class pure virtuals
// ----------------------------------
virtual void DestroyClippingRegion();
virtual wxSize GetPPI() const;
virtual void SetMapMode(int mode);
virtual void SetUserScale(double x, double y);
virtual void SetLogicalScale(double x, double y);
virtual void SetLogicalOrigin(wxCoord x, wxCoord y);
virtual void SetDeviceOrigin(wxCoord x, wxCoord y);
virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp);
protected:
virtual void DoSetClippingRegion(wxCoord x, wxCoord y,
wxCoord width, wxCoord height);
virtual void DoGetSizeMM(int* width, int* height) const;
public:
void ComputeScaleAndOrigin();
wxCoord XDEV2LOG(wxCoord x) const
{
wxCoord new_x = x - m_deviceOriginX;
@@ -129,14 +127,14 @@ public:
else
return (wxCoord)((double)(y) * m_scaleY - 0.5);
}
public:
// not sure what for, but what is a mm on a screen you don't know the size of?
double m_mm_to_pix_x,m_mm_to_pix_y;
// recompute scale?
bool m_needComputeScaleX, m_needComputeScaleY;
private:
DECLARE_ABSTRACT_CLASS(wxDC)

View File

@@ -65,11 +65,6 @@ void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
m_clipY2 = y + height;
}
void wxDC::DestroyClippingRegion()
{
m_clipping = FALSE;
}
// ---------------------------------------------------------------------------
// get DC capabilities
// ---------------------------------------------------------------------------

View File

@@ -65,11 +65,6 @@ void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
m_clipY2 = y + height;
}
void wxDC::DestroyClippingRegion()
{
m_clipping = FALSE;
}
// ---------------------------------------------------------------------------
// get DC capabilities
// ---------------------------------------------------------------------------

View File

@@ -512,7 +512,7 @@ void wxDC::DestroyClippingRegion()
{
wxMacFastPortSetter helper(this) ;
CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
m_clipping = FALSE;
ResetClipping();
}
void wxDC::DoGetSizeMM( int* width, int* height ) const

View File

@@ -533,7 +533,7 @@ void wxDC::DestroyClippingRegion()
{
wxMacFastPortSetter helper(this) ;
CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
m_clipping = FALSE;
ResetClipping();
}
void wxDC::DoGetSizeMM( int* width, int* height ) const

View File

@@ -68,8 +68,8 @@ const double RAD2DEG = 180.0 / M_PI;
const ushort STIPPLE_wxDOT = 0x5555/* - - - - - - - -*/;
const ushort STIPPLE_wxLONG_DASH = 0xF0F0/* ---- ----*/;
const ushort STIPPLE_wxSHORT_DASH = 0xCCCC/*-- -- -- -- */;
const ushort STIPPLE_wxDOT_DASH = 0x3939/* --- - --- -*/;
const ushort STIPPLE_wxSOLID = 0xFFFF/*----------------*/;
const ushort STIPPLE_wxDOT_DASH = 0x3939/* --- - --- -*/;
const ushort STIPPLE_wxSOLID = 0xFFFF/*----------------*/;
#define PATTERN_ROW(b7,b6,b5,b4,b3,b2,b1,b0) \
((b7 << 7) | (b6 << 6) | (b5 << 5) | (b4 << 4) | \
@@ -169,14 +169,14 @@ wxDC::wxDC()
m_penSelected = m_brushSelected = FALSE;
m_downloadedPatterns[0] = m_downloadedPatterns[1] = FALSE;
m_mglFont = NULL;
}
wxDC::~wxDC()
{
if (m_OwnsMGLDC)
if (m_OwnsMGLDC)
delete m_MGLDC;
}
@@ -186,11 +186,11 @@ void wxDC::SetMGLDC(MGLDevCtx *mgldc, bool OwnsMGLDC)
delete m_MGLDC;
m_MGLDC = mgldc;
m_OwnsMGLDC = OwnsMGLDC;
m_ok = TRUE;
m_ok = TRUE;
if ( !m_globalClippingRegion.IsNull() )
SetClippingRegion(m_globalClippingRegion);
InitializeMGLDC();
}
@@ -244,9 +244,9 @@ void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region)
DestroyClippingRegion();
return;
}
wxRegion rg(region);
// check if the DC is scaled or moved, and if yes, then
// convert rg to device coordinates:
if ( m_deviceOriginX != 0 || m_deviceOriginY != 0 ||
@@ -254,16 +254,16 @@ void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region)
XLOG2DEVREL(500) != 500 || YLOG2DEVREL(500) != 500 )
{
region_t *mrg = rg.GetMGLRegion().rgnPointer();
span_t *s;
segment_t *p;
for (s = mrg->spans; s; s = s->next)
span_t *s;
segment_t *p;
for (s = mrg->spans; s; s = s->next)
{
s->y = YLOG2DEV(s->y);
for (p = s->seg; p; p = p->next)
p->x = XLOG2DEV(p->x);
s->y = YLOG2DEV(s->y);
for (p = s->seg; p; p = p->next)
p->x = XLOG2DEV(p->x);
}
}
if ( !m_currentClippingRegion.IsNull() )
m_currentClippingRegion.Intersect(rg);
else
@@ -278,7 +278,7 @@ void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region)
void wxDC::DestroyClippingRegion()
{
wxCHECK_RET( Ok(), wxT("invalid dc") );
if ( !m_globalClippingRegion.IsNull() )
{
m_MGLDC->setClipRegion(m_globalClippingRegion.GetMGLRegion());
@@ -288,7 +288,7 @@ void wxDC::DestroyClippingRegion()
else
{
m_MGLDC->setClipRect(MGLRect(0, 0, m_MGLDC->sizex()+1, m_MGLDC->sizey()+1));
m_clipping = FALSE;
ResetClipping();
m_currentClippingRegion.Clear();
}
}
@@ -333,7 +333,7 @@ void wxDC::Clear()
}
}
extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y,
extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y,
const wxColour & col, int style);
bool wxDC::DoFloodFill(wxCoord x, wxCoord y,
@@ -347,7 +347,7 @@ bool wxDC::DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const
wxCHECK_MSG( col, FALSE, _T("NULL colour parameter in wxDC::GetPixel"));
uchar r, g, b;
m_MGLDC->unpackColorFast(m_MGLDC->getPixel(XLOG2DEV(x), YLOG2DEV(y)),
m_MGLDC->unpackColorFast(m_MGLDC->getPixel(XLOG2DEV(x), YLOG2DEV(y)),
r, g, b);
col->Set(r, g, b);
return TRUE;
@@ -363,7 +363,7 @@ void wxDC::DoCrossHair(wxCoord x, wxCoord y)
int h = 0;
GetSize(&w, &h);
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
wxCoord xx = XLOG2DEV(x);
wxCoord yy = YLOG2DEV(y);
@@ -381,9 +381,9 @@ void wxDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
if ( m_pen.GetStyle() != wxTRANSPARENT )
{
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
m_MGLDC->lineExt(XLOG2DEV(x1) + m_penOfsX, YLOG2DEV(y1) + m_penOfsY,
m_MGLDC->lineExt(XLOG2DEV(x1) + m_penOfsX, YLOG2DEV(y1) + m_penOfsY,
XLOG2DEV(x2) + m_penOfsX, YLOG2DEV(y2) + m_penOfsY,FALSE);
CalcBoundingBox(x1, y1);
CalcBoundingBox(x2, y2);
@@ -437,17 +437,17 @@ void wxDC::DoDrawArc(wxCoord x1, wxCoord y1,
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( m_brush.GetStyle() != wxTRANSPARENT )
{
if ( !m_brushSelected )
if ( !m_brushSelected )
SelectBrush();
m_MGLDC->fillEllipseArc(xxc, yyc, r, r, alpha1, alpha2);
}
}
if ( m_pen.GetStyle() != wxTRANSPARENT )
{
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
m_MGLDC->ellipseArc(xxc + m_penOfsX, yyc + m_penOfsY, r, r, alpha1, alpha2);
}
}
CalcBoundingBox(xc - r, yc - r);
CalcBoundingBox(xc + r, yc + r);
@@ -460,7 +460,7 @@ void wxDC::DoDrawPoint(wxCoord x, wxCoord y)
if ( m_pen.GetStyle() != wxTRANSPARENT )
{
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
m_MGLDC->pixel(XLOG2DEV(x), YLOG2DEV(y));
CalcBoundingBox(x, y);
@@ -471,9 +471,9 @@ void wxDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffs
{
wxCHECK_RET( Ok(), wxT("invalid dc") );
wxCoord xxoffset = XLOG2DEVREL(xoffset),
wxCoord xxoffset = XLOG2DEVREL(xoffset),
yyoffset = YLOG2DEVREL(yoffset);
MGLPoint *cpoints = new MGLPoint[n+1];
MGLPoint *cpoints = new MGLPoint[n+1];
for (int i = 0; i < n; i++)
{
CalcBoundingBox(points[i].x + xoffset, points[i].y + yoffset);
@@ -492,7 +492,7 @@ void wxDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffs
if ( m_pen.GetStyle() != wxTRANSPARENT )
{
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
if (m_penOfsX != 0 || m_penOfsY != 0)
{
@@ -516,7 +516,7 @@ void wxDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset
{
MGLPoint *cpoints = new MGLPoint[n];
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
for (int i = 0; i < n; i++)
{
@@ -540,33 +540,33 @@ void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
if ( ww == 0 || hh == 0 ) return;
if ( ww < 0 )
if ( ww < 0 )
{
ww = -ww;
ww = -ww;
xx = xx - ww;
}
if ( hh < 0 )
if ( hh < 0 )
{
hh = -hh;
yy = yy - hh;
hh = -hh;
yy = yy - hh;
}
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( m_brush.GetStyle() != wxTRANSPARENT )
{
if ( !m_brushSelected )
if ( !m_brushSelected )
SelectBrush();
m_MGLDC->fillRect(xx, yy, xx + ww, yy + hh);
}
}
if ( m_pen.GetStyle() != wxTRANSPARENT )
{
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
m_MGLDC->rect(xx + m_penOfsX, yy + m_penOfsY,
m_MGLDC->rect(xx + m_penOfsX, yy + m_penOfsY,
xx + ww + m_penOfsX, yy + hh + m_penOfsY);
}
}
CalcBoundingBox(x, y);
CalcBoundingBox(x + width, y + height);
@@ -576,7 +576,7 @@ void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h
{
wxCHECK_RET( Ok(), wxT("invalid dc") );
if ( radius < 0.0 )
if ( radius < 0.0 )
radius = -radius * ((width < height) ? width : height);
wxCoord xx = XLOG2DEV(x);
@@ -586,15 +586,15 @@ void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h
wxCoord rr = XLOG2DEVREL((wxCoord)radius);
// CMB: handle -ve width and/or height
if ( ww < 0 )
if ( ww < 0 )
{
ww = -ww;
xx = xx - ww;
ww = -ww;
xx = xx - ww;
}
if ( hh < 0 )
{
hh = -hh;
yy = yy - hh;
if ( hh < 0 )
{
hh = -hh;
yy = yy - hh;
}
// CMB: if radius is zero use DrawRectangle() instead to avoid
@@ -618,7 +618,7 @@ void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( m_brush.GetStyle() != wxTRANSPARENT )
{
if (!m_brushSelected)
if (!m_brushSelected)
SelectBrush();
m_MGLDC->fillRect(xx+rr, yy, xx+ww-rr, yy+hh);
m_MGLDC->fillRect(xx, yy+rr, xx+ww, yy+hh-rr);
@@ -626,20 +626,20 @@ void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h
m_MGLDC->fillEllipseArc(xx+ww-rr, yy+rr, rr, rr, 0, 90);
m_MGLDC->fillEllipseArc(xx+rr, yy+hh-rr, rr, rr, 180, 270);
m_MGLDC->fillEllipseArc(xx+ww-rr, yy+hh-rr, rr, rr, 270, 0);
}
}
if ( m_pen.GetStyle() != wxTRANSPARENT )
{
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
xx += m_penOfsX;
yy += m_penOfsY;
m_MGLDC->line(xx+rr+1, yy, xx+ww-rr, yy);
m_MGLDC->line(xx+rr+1, yy, xx+ww-rr, yy);
m_MGLDC->ellipseArc(xx+ww-rr, yy+rr, rr, rr, 0, 90);
m_MGLDC->line(xx+ww, yy+rr+1, xx+ww, yy+hh-rr);
m_MGLDC->ellipseArc(xx+ww-rr, yy+hh-rr, rr, rr, 270, 0);
m_MGLDC->line(xx+ww-rr, yy+hh, xx+rr+1, yy+hh);
m_MGLDC->ellipseArc(xx+rr, yy+hh-rr, rr, rr, 180, 270);
m_MGLDC->ellipseArc(xx+rr, yy+hh-rr, rr, rr, 180, 270);
m_MGLDC->line(xx, yy+hh-rr, xx, yy+rr+1);
m_MGLDC->ellipseArc(xx+rr, yy+rr, rr, rr, 90, 180);
}
@@ -662,13 +662,13 @@ void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
SelectBrush();
MGLRect rect(XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2), YLOG2DEV(y2));
m_MGLDC->fillEllipse(rect);
}
}
if ( m_pen.GetStyle() != wxTRANSPARENT )
{
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
MGLRect rect(XLOG2DEV(x) + m_penOfsX, YLOG2DEV(y) + m_penOfsY,
MGLRect rect(XLOG2DEV(x) + m_penOfsX, YLOG2DEV(y) + m_penOfsY,
XLOG2DEV(x2) + m_penOfsX, YLOG2DEV(y2) + m_penOfsY);
m_MGLDC->ellipse(rect);
}
@@ -690,16 +690,16 @@ void wxDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,d
if (!m_brushSelected) SelectBrush();
MGLRect rect(XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2), YLOG2DEV(y2));
m_MGLDC->fillEllipseArc(rect, (int)sa, (int)ea);
}
}
if ( m_pen.GetStyle() != wxTRANSPARENT )
{
if ( !m_penSelected )
if ( !m_penSelected )
SelectPen();
MGLRect rect(XLOG2DEV(x) + m_penOfsX, YLOG2DEV(y) + m_penOfsY,
MGLRect rect(XLOG2DEV(x) + m_penOfsX, YLOG2DEV(y) + m_penOfsY,
XLOG2DEV(x2) + m_penOfsX, YLOG2DEV(y2) + m_penOfsY);
m_MGLDC->ellipseArc(rect, (int)sa, (int)ea);
}
}
CalcBoundingBox(x, y);
CalcBoundingBox(x2, y2);
@@ -726,7 +726,7 @@ bool wxDC::SelectMGLFont()
m_mglFont = m_font.GetMGLfont_t(scale, antialiased);
wxCHECK_MSG( m_mglFont, FALSE, wxT("invalid font") );
m_MGLDC->useFont(m_mglFont);
wxLogTrace("mgl_font", "useFont(%p)", m_mglFont);
@@ -758,7 +758,7 @@ void wxDC::DrawAnyText(const wxString& text, wxCoord x, wxCoord y)
// Render the text:
wxCoord xx = XLOG2DEV(x);
wxCoord yy = YLOG2DEV(y);
m_MGLDC->setLineStyle(MGL_LINE_STIPPLE);
m_MGLDC->setLineStipple(0xFFFF);
m_MGLDC->setPenSize(1, 1);
@@ -770,9 +770,9 @@ void wxDC::DrawAnyText(const wxString& text, wxCoord x, wxCoord y)
const char *c_text = text.c_str();
#endif
#if 1
// FIXME_MGL - this is a temporary hack in absence of proper
// implementation of solid text background in MGL. Once
#if 1
// FIXME_MGL - this is a temporary hack in absence of proper
// implementation of solid text background in MGL. Once
// the bug in MGL is fixed, this code should be nuked
// immediately. Note that the code is not 100% correct;
// it only works with wxCOPY logical function
@@ -790,9 +790,9 @@ void wxDC::DrawAnyText(const wxString& text, wxCoord x, wxCoord y)
m_textForegroundColour.Green(), m_textForegroundColour.Blue()));
m_MGLDC->setBackColor(m_MGLDC->packColorFast(m_textBackgroundColour.Red(),
m_textBackgroundColour.Green(), m_textBackgroundColour.Blue()));
m_MGLDC->drawStr(xx, yy, c_text);
// Render underline:
if ( m_font.GetUnderlined() )
{
@@ -818,7 +818,7 @@ void wxDC::DoDrawRotatedText(const wxString& text,
double angle)
{
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( angle == 0 )
{
DoDrawText(text, x, y);
@@ -836,9 +836,9 @@ void wxDC::DoDrawRotatedText(const wxString& text,
wxFAIL_MSG(wxT("wxMGL only supports rotated text with angle 0,90,180 or 270"));
return;
}
DrawAnyText(text, x, y);
// Restore default:
m_MGLDC->setTextDirection(MGL_RIGHT_DIR);
}
@@ -885,61 +885,61 @@ void wxDC::SelectMGLFatPen(int style, int flag)
// switch between pens and brushes, we take advantage of MGL's ability
// to have multiple (pix)pattern_t's loaded. We always download pen
// to 0th slot and brush to 1st slot.
if ( flag == wxMGL_SELECT_FROM_PEN )
if ( flag == wxMGL_SELECT_FROM_PEN )
slot = 0;
else
slot = 1;
// compute pen's width:
// compute pen's width:
if ( m_pen.GetWidth() <= 1 )
{
wx = wy = 1;
m_penOfsX = m_penOfsY = 0;
}
else
{
{
wx = (int)(0.5 + fabs((double) XLOG2DEVREL(m_pen.GetWidth())));
wy = (int)(0.5 + fabs((double) YLOG2DEVREL(m_pen.GetWidth())));
m_penOfsX = -wx/2;
m_penOfsY = -wy/2;
}
// find pen's type:
penstyle = MGL_BITMAP_TRANSPARENT;
switch (style)
{
case wxBDIAGONAL_HATCH: pattern = &PATTERN_wxBDIAGONAL_HATCH;
penstyle = MGL_BITMAP_TRANSPARENT;
case wxBDIAGONAL_HATCH: pattern = &PATTERN_wxBDIAGONAL_HATCH;
penstyle = MGL_BITMAP_TRANSPARENT;
break;
case wxCROSSDIAG_HATCH: pattern = &PATTERN_wxCROSSDIAG_HATCH;
penstyle = MGL_BITMAP_TRANSPARENT;
case wxCROSSDIAG_HATCH: pattern = &PATTERN_wxCROSSDIAG_HATCH;
penstyle = MGL_BITMAP_TRANSPARENT;
break;
case wxFDIAGONAL_HATCH: pattern = &PATTERN_wxFDIAGONAL_HATCH;
penstyle = MGL_BITMAP_TRANSPARENT;
penstyle = MGL_BITMAP_TRANSPARENT;
break;
case wxCROSS_HATCH: pattern = &PATTERN_wxCROSS_HATCH;
penstyle = MGL_BITMAP_TRANSPARENT;
penstyle = MGL_BITMAP_TRANSPARENT;
break;
case wxHORIZONTAL_HATCH: pattern = &PATTERN_wxHORIZONTAL_HATCH;
penstyle = MGL_BITMAP_TRANSPARENT;
penstyle = MGL_BITMAP_TRANSPARENT;
break;
case wxVERTICAL_HATCH: pattern = &PATTERN_wxVERTICAL_HATCH;
penstyle = MGL_BITMAP_TRANSPARENT;
penstyle = MGL_BITMAP_TRANSPARENT;
break;
case wxSTIPPLE:
if ( flag == wxMGL_SELECT_FROM_PEN )
if ( flag == wxMGL_SELECT_FROM_PEN )
pixPattern = (pixpattern24_t*) m_pen.GetPixPattern();
else
pixPattern = (pixpattern24_t*) m_brush.GetPixPattern();
penstyle = MGL_PIXMAP;
break;
case wxSTIPPLE_MASK_OPAQUE:
pattern = (pattern_t*) m_brush.GetMaskPattern();
penstyle = MGL_BITMAP_OPAQUE;
break;
case wxSOLID:
default:
penstyle = MGL_BITMAP_SOLID; break;
@@ -956,14 +956,14 @@ void wxDC::SelectMGLFatPen(int style, int flag)
}
m_MGLDC->usePenBitmapPattern(slot);
}
if ( pixPattern )
{
if ( !m_downloadedPatterns[slot] )
{
pixpattern_t pix;
int x, y, c;
switch (GetDepth())
{
case 8:
@@ -1006,7 +1006,7 @@ void wxDC::SelectMGLFatPen(int style, int flag)
}
m_MGLDC->usePenPixmapPattern(slot);
}
m_MGLDC->setLineStyle(MGL_LINE_PENSTYLE);
m_MGLDC->setPenStyle(penstyle);
m_MGLDC->setPenSize(wy, wx);
@@ -1031,7 +1031,7 @@ void wxDC::SelectPen()
case wxDOT_DASH:
SelectMGLStipplePen(m_pen.GetStyle());
break;
case wxBDIAGONAL_HATCH:
case wxCROSSDIAG_HATCH:
case wxFDIAGONAL_HATCH:
@@ -1064,7 +1064,7 @@ void wxDC::SelectBrush()
wxColour fg, bg;
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE )
{
fg = m_textForegroundColour;
@@ -1105,7 +1105,7 @@ void wxDC::SetBrush(const wxBrush& brush)
void wxDC::SetPalette(const wxPalette& palette)
{
wxCHECK_RET( Ok(), wxT("invalid dc") );
if ( palette == wxNullPalette )
{
if ( m_oldPalette.Ok() )
@@ -1119,7 +1119,7 @@ void wxDC::SetPalette(const wxPalette& palette)
m_palette = palette;
int cnt = m_palette.GetColoursCount();
palette_t *pal = m_palette.GetMGLpalette_t();
palette_t *pal = m_palette.GetMGLpalette_t();
m_MGLDC->setPalette(pal, cnt, 0);
m_MGLDC->realizePalette(cnt, 0, TRUE);
}
@@ -1238,18 +1238,18 @@ void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y,
wxFont *theFont) const
{
wxFont oldFont;
if ( theFont != NULL )
{
oldFont = m_font;
wxConstCast(this, wxDC)->SetFont(*theFont);
}
wxCurrentDCSwitcher switcher(m_MGLDC);
if ( !wxConstCast(this, wxDC)->SelectMGLFont() ) return;
if ( x )
// VS: YDEV is corrent, it should *not* be XDEV, because font's are
// VS: YDEV is corrent, it should *not* be XDEV, because font's are
// only scaled according to m_scaleY
*x = YDEV2LOGREL(m_MGLDC->textWidth(string.c_str()));
if ( y )
@@ -1273,14 +1273,14 @@ void wxDC::ComputeScaleAndOrigin()
{
double newX = m_logicalScaleX * m_userScaleX;
double newY = m_logicalScaleY * m_userScaleY;
// make sure font will be reloaded before drawing:
if ( newY != m_scaleY )
m_mglFont = NULL;
// make sure m_penOfs{X,Y} will be reevaluated before drawing:
if ( newY != m_scaleY || newX != m_scaleX )
m_penSelected = FALSE;
m_scaleX = newX, m_scaleY = newY;
}
@@ -1409,7 +1409,7 @@ void wxDC::DoGetSizeMM(int *width, int *height) const
wxSize wxDC::GetPPI() const
{
return wxSize(int(double(m_mm_to_pix_x) * inches2mm),
return wxSize(int(double(m_mm_to_pix_x) * inches2mm),
int(double(m_mm_to_pix_y) * inches2mm));
}
@@ -1426,7 +1426,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
{
wxCHECK_MSG( Ok(), FALSE, wxT("invalid dc") );
wxCHECK_MSG( source, FALSE, wxT("invalid source dc") );
// transform the source DC coords to the device ones
xsrc = source->LogicalToDeviceX(xsrc);
ysrc = source->LogicalToDeviceY(ysrc);
@@ -1460,7 +1460,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
else
{
m_MGLDC->makeCurrent(); // will go away with MGL6.0
m_MGLDC->bitBlt(*source->GetMGLDC(),
m_MGLDC->bitBlt(*source->GetMGLDC(),
xsrc, ysrc, xsrc + ww, ysrc + hh,
xx, yy, LogicalFunctionToMGLRop(rop));
}
@@ -1487,8 +1487,8 @@ void wxDC::DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y)
static inline void DoBitBlt(const wxBitmap& src, MGLDevCtx *dst,
int sx, int sy, int sw, int sh,
int dx, int dy, int dw, int dh,
int sx, int sy, int sw, int sh,
int dx, int dy, int dw, int dh,
int rop, bool useStretching, bool putSection)
{
bitmap_t *bmp = src.GetMGLbitmap_t();
@@ -1504,12 +1504,12 @@ static inline void DoBitBlt(const wxBitmap& src, MGLDevCtx *dst,
if (!putSection)
dst->stretchBitmap(dx, dy, dx + dw, dy + dh, bmp, rop);
else
dst->stretchBitmapSection(sx, sy, sx + sw, sy + sh,
dst->stretchBitmapSection(sx, sy, sx + sw, sy + sh,
dx, dy, dx + dw, dy + dh, bmp, rop);
}
}
void wxDC::DoDrawSubBitmap(const wxBitmap &bmp,
void wxDC::DoDrawSubBitmap(const wxBitmap &bmp,
wxCoord x, wxCoord y, wxCoord w, wxCoord h,
wxCoord destx, wxCoord desty, int rop, bool useMask)
{
@@ -1523,9 +1523,9 @@ void wxDC::DoDrawSubBitmap(const wxBitmap &bmp,
wxCoord dy = YLOG2DEV(desty);
wxCoord dw = XLOG2DEVREL(w);
wxCoord dh = YLOG2DEVREL(h);
m_MGLDC->makeCurrent(); // will go away with MGL6.0
bool useStretching = ((w != dw) || (h != dh));
bool putSection = (w != bmp.GetWidth() || h != bmp.GetHeight());
MGL_writeModeType mglRop = (MGL_writeModeType)LogicalFunctionToMGLRop(rop);
@@ -1541,29 +1541,29 @@ void wxDC::DoDrawSubBitmap(const wxBitmap &bmp,
if ( useMask && bmp.GetMask() )
{
// Since MGL does not support masks directly (in MGL, mask is handled
// in same way as in wxImage, i.e. there is one "key" color), we
// in same way as in wxImage, i.e. there is one "key" color), we
// simulate masked bitblt in 6 steps (same as in MSW):
//
// 1. Create a temporary bitmap and copy the destination area into it.
// 2. Copy the source area into the temporary bitmap using the
// 1. Create a temporary bitmap and copy the destination area into it.
// 2. Copy the source area into the temporary bitmap using the
// specified logical function.
// 3. Set the masked area in the temporary bitmap to BLACK by ANDing
// the mask bitmap with the temp bitmap with the foreground colour
// 3. Set the masked area in the temporary bitmap to BLACK by ANDing
// the mask bitmap with the temp bitmap with the foreground colour
// set to WHITE and the bg colour set to BLACK.
// 4. Set the unmasked area in the destination area to BLACK by
// ANDing the mask bitmap with the destination area with the
// ANDing the mask bitmap with the destination area with the
// foreground colour set to BLACK and the background colour set
// to WHITE.
// 5. OR the temporary bitmap with the destination area.
// 6. Delete the temporary bitmap.
//
// This sequence of operations ensures that the source's transparent
// to WHITE.
// 5. OR the temporary bitmap with the destination area.
// 6. Delete the temporary bitmap.
//
// This sequence of operations ensures that the source's transparent
// area need not be black, and logical functions are supported.
wxBitmap *mask = bmp.GetMask()->GetBitmap();
MGLMemoryDC *temp;
if ( GetDepth() <= 8 )
{
temp = new MGLMemoryDC(dw, dh, GetDepth(), NULL);
@@ -1577,28 +1577,28 @@ void wxDC::DoDrawSubBitmap(const wxBitmap &bmp,
m_MGLDC->getPixelFormat(pf);
temp = new MGLMemoryDC(dw, dh, GetDepth(), &pf);
}
wxCHECK_RET( temp->isValid(), wxT("cannot create temporary dc") );
temp->bitBlt(*m_MGLDC, dx, dy, dx + dw, dy + dh, 0, 0, MGL_REPLACE_MODE);
DoBitBlt(bmp, temp, x, y, w, h, 0, 0, dw, dh, mglRop,
DoBitBlt(bmp, temp, x, y, w, h, 0, 0, dw, dh, mglRop,
useStretching, putSection);
mask->SetMonoPalette(wxColour(0,0,0), wxColour(255,255,255));
DoBitBlt(*mask, temp, x, y, w, h, 0, 0, dw, dh, MGL_R2_MASKSRC,
DoBitBlt(*mask, temp, x, y, w, h, 0, 0, dw, dh, MGL_R2_MASKSRC,
useStretching, putSection);
DoBitBlt(*mask, m_MGLDC, x, y, w, h, dx, dy, dw, dh, MGL_R2_MASKNOTSRC,
DoBitBlt(*mask, m_MGLDC, x, y, w, h, dx, dy, dw, dh, MGL_R2_MASKNOTSRC,
useStretching, putSection);
m_MGLDC->bitBlt(*temp, 0, 0, dw, dh, dx, dy, MGL_OR_MODE);
delete temp;
}
else
{
DoBitBlt(bmp, m_MGLDC, x, y, w, h, dx, dy, dw, dh, mglRop,
DoBitBlt(bmp, m_MGLDC, x, y, w, h, dx, dy, dw, dh, mglRop,
useStretching, putSection);
}
}

View File

@@ -90,11 +90,6 @@ void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
m_clipY2 = y + height;
}
void wxDC::DestroyClippingRegion()
{
m_clipping = FALSE;
}
void wxDC::DoGetSize( int* width, int* height ) const
{
if ( width )

View File

@@ -503,7 +503,7 @@ void wxDC::DestroyClippingRegion(void)
::GpiSetClipRegion(m_hPS, hRgn, &hRgnOld);
}
m_clipping = false;
ResetClipping();
} // end of wxDC::DestroyClippingRegion
// ---------------------------------------------------------------------------