// Author: Vaclav Slavik
// Created: 2001/03/09
// RCS-ID: $Id$
-// Copyright: (c) Vaclav Slavik
+// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// headers
// ---------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "dc.h"
#endif
#endif
#include "wx/fontutil.h"
+#include "wx/encinfo.h"
#include "wx/fontmap.h"
#include "wx/mgl/private.h"
#include "wx/log.h"
// constants
//-----------------------------------------------------------------------------
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
const double mm2inches = 0.0393700787402;
const double inches2mm = 25.4;
const double mm2twips = 56.6929133859;
m_OwnsMGLDC = FALSE;
m_ok = FALSE; // must call SetMGLDevCtx() before using it
-#if 0
m_mm_to_pix_x = (double)wxGetDisplaySize().GetWidth() /
(double)wxGetDisplaySizeMM().GetWidth();
m_mm_to_pix_y = (double)wxGetDisplaySize().GetHeight() /
(double)wxGetDisplaySizeMM().GetHeight();
-#endif
- // FIXME_MGL -- not in wxUniversal branch (and not implementend anyway,
- // hardcode it for 75dpi for now)
- m_mm_to_pix_x = ((double)wxGetDisplaySize().GetWidth() / 75) * inches2mm;
- m_mm_to_pix_y = ((double)wxGetDisplaySize().GetHeight() / 75) * inches2mm;
m_pen = *wxBLACK_PEN;
m_font = *wxNORMAL_FONT;
m_MGLDC = mgldc;
m_OwnsMGLDC = OwnsMGLDC;
m_ok = TRUE;
+
+ if ( !m_globalClippingRegion.IsNull() )
+ SetClippingRegion(m_globalClippingRegion);
+
InitializeMGLDC();
}
{
wxCHECK_RET( Ok(), wxT("invalid dc") );
- if ( region.Empty() )
+ if ( region.IsEmpty() )
{
DestroyClippingRegion();
return;
// check if the DC is scaled or moved, and if yes, then
// convert rg to device coordinates:
if ( m_deviceOriginX != 0 || m_deviceOriginY != 0 ||
+ m_logicalOriginX != 0 || m_logicalOriginY != 0 ||
XLOG2DEVREL(500) != 500 || YLOG2DEVREL(500) != 500 )
{
region_t *mrg = rg.GetMGLRegion().rgnPointer();
{
wxCHECK_RET( Ok(), wxT("invalid dc") );
- m_MGLDC->setClipRect(MGLRect(0, 0, m_MGLDC->sizex(), m_MGLDC->sizey()));
- m_clipping = FALSE;
- m_currentClippingRegion.Clear();
+ if ( !m_globalClippingRegion.IsNull() )
+ {
+ m_MGLDC->setClipRegion(m_globalClippingRegion.GetMGLRegion());
+ m_currentClippingRegion = m_globalClippingRegion;
+ m_clipping = TRUE;
+ }
+ else
+ {
+ m_MGLDC->setClipRect(MGLRect(0, 0, m_MGLDC->sizex()+1, m_MGLDC->sizey()+1));
+ m_clipping = FALSE;
+ m_currentClippingRegion.Clear();
+ }
}
// ---------------------------------------------------------------------------
wxCHECK_RET( Ok(), wxT("invalid dc") );
m_MGLDC->makeCurrent(); // will go away with MGL6.0
- m_MGLDC->clearDevice();
- if ( m_backgroundBrush.GetStyle() != wxSOLID &&
- m_backgroundBrush.GetStyle() != wxTRANSPARENT )
+ if ( m_backgroundBrush.GetStyle() != wxTRANSPARENT )
{
int w, h;
wxBrush oldb = m_brush;
SetBrush(m_backgroundBrush);
SelectBrush();
GetSize(&w, &h);
- m_MGLDC->fillRect(0, 0, w-1, h-1);
+ m_MGLDC->fillRect(0, 0, w, h);
SetBrush(oldb);
}
}
-void wxDC::DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, int style)
+extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y,
+ const wxColour & col, int style);
+
+bool wxDC::DoFloodFill(wxCoord x, wxCoord y,
+ const wxColour& col, int style)
{
- wxFAIL_MSG( wxT("wxDC::DoFloodFill not implemented") );
+ return wxDoFloodFill(this, x, y, col, style);
}
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), XLOG2DEV(y)),
+ m_MGLDC->unpackColorFast(m_MGLDC->getPixel(XLOG2DEV(x), YLOG2DEV(y)),
r, g, b);
col->Set(r, g, b);
return TRUE;
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( !m_penSelected )
SelectPen();
- m_MGLDC->line(XLOG2DEV(x1) + m_penOfsX, XLOG2DEV(y1) + m_penOfsY,
- XLOG2DEV(x2) + m_penOfsX, XLOG2DEV(y2) + 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);
}
{
if ( !m_penSelected )
SelectPen();
+
m_MGLDC->rect(xx + m_penOfsX, yy + m_penOfsY,
xx + ww + m_penOfsX, yy + hh + m_penOfsY);
}
void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y)
{
- if ( m_pen.GetStyle() == wxTRANSPARENT ) return;
m_MGLDC->makeCurrent(); // will go away with MGL6.0
DrawAnyText(text, x, y);
!wxTestFontEncoding(nativeEnc) )
{
#if wxUSE_FONTMAP
- if ( !wxTheFontMapper->GetAltForEncoding(encoding, &nativeEnc) )
+ if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &nativeEnc) )
#endif
{
nativeEnc.mglEncoding = MGL_ENCODING_ASCII;
SelectMGLFont();
- m_MGLDC->setColor(m_MGLDC->packColorFast(m_textForegroundColour.Red(),
- m_textForegroundColour.Green(), m_textForegroundColour.Blue()));
- m_MGLDC->setBackColor(m_MGLDC->packColorFast(m_textBackgroundColour.Red(),
- m_textBackgroundColour.Green(), m_textBackgroundColour.Blue()));
-
// 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);
m_MGLDC->setPenStyle(MGL_BITMAP_SOLID);
-
+
#if wxUSE_UNICODE
const wchar_t *c_text = text.c_str();
#else
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
+ // 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
+ if ( m_backgroundMode == wxSOLID )
+ {
+ int w = m_MGLDC->textWidth(c_text);
+ int h = m_MGLDC->textHeight();
+ m_MGLDC->setColor(m_MGLDC->packColorFast(m_textBackgroundColour.Red(),
+ m_textBackgroundColour.Green(), m_textBackgroundColour.Blue()));
+ m_MGLDC->fillRect(xx, yy, xx+w, yy+h);
+ }
+#endif
+
+ m_MGLDC->setColor(m_MGLDC->packColorFast(m_textForegroundColour.Red(),
+ 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() )
{
int x1 = xx, y1 = yy;
- int x2, y2;
+ int x2 = 0 , y2 = 0;
int w = m_MGLDC->textWidth(c_text);
m_MGLDC->underScoreLocation(x1, y1, c_text);
switch (m_MGLDC->getTextDirection())
wxCoord x, wxCoord y,
double angle)
{
- if ( m_pen.GetStyle() == wxTRANSPARENT ) return;
m_MGLDC->makeCurrent(); // will go away with MGL6.0
if ( angle == 0 )
if ( palette == wxNullPalette )
{
- SetPalette(m_oldPalette);
+ if ( m_oldPalette.Ok() )
+ SetPalette(m_oldPalette);
return;
}
void wxDC::SetFont(const wxFont& font)
{
- wxCHECK_RET( font.Ok(), wxT("invalid font") );
- m_font = font;
- m_mglFont = NULL;
+ if ( font.Ok() )
+ {
+ m_font = font;
+ m_mglFont = NULL;
+ }
}
void wxDC::SetBackground(const wxBrush& brush)
*descent = YDEV2LOGREL(m_mglFont->descent);
if ( externalLeading )
*externalLeading = YDEV2LOGREL(m_mglFont->leading);
-
+
if ( theFont != NULL )
wxConstCast(this, wxDC)->SetFont(oldFont);
}
void wxDC::DoGetSize(int *w, int *h) const
{
- if (w) *w = m_MGLDC->sizex();
- if (h) *h = m_MGLDC->sizey();
+ if (w) *w = m_MGLDC->sizex()+1;
+ if (h) *h = m_MGLDC->sizey()+1;
}
void wxDC::DoGetSizeMM(int *width, int *height) const
bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
wxCoord width, wxCoord height,
wxDC *source, wxCoord xsrc, wxCoord ysrc,
- int rop, bool useMask)
+ int rop, bool useMask,
+ wxCoord xsrcMask, wxCoord ysrcMask)
{
wxCHECK_MSG( Ok(), FALSE, wxT("invalid dc") );
wxCHECK_MSG( source, FALSE, wxT("invalid source dc") );
xsrc = source->LogicalToDeviceX(xsrc);
ysrc = source->LogicalToDeviceY(ysrc);
+ /* FIXME_MGL: use the mask origin when drawing transparently */
+ if (xsrcMask == -1 && ysrcMask == -1)
+ {
+ xsrcMask = xsrc; ysrcMask = ysrc;
+ }
+ else
+ {
+ xsrcMask = source->LogicalToDeviceX(xsrcMask);
+ ysrcMask = source->LogicalToDeviceY(ysrcMask);
+ }
+
CalcBoundingBox(xdest, ydest);
CalcBoundingBox(xdest + width, ydest + height);