Rewrote scaling code for GNOME print backend. The inverted Y axis is now handled internally. Resulotion is not set to 600 dpi
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48628 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
#include "wx/list.h" // we use wxList in inline functions
|
#include "wx/list.h" // we use wxList in inline functions
|
||||||
#include "wx/dynarray.h"
|
#include "wx/dynarray.h"
|
||||||
#include "wx/math.h"
|
#include "wx/math.h"
|
||||||
|
#include "wx/image.h"
|
||||||
|
|
||||||
// 1 if using the reorganized DC code
|
// 1 if using the reorganized DC code
|
||||||
#define wxUSE_NEW_DC 0
|
#define wxUSE_NEW_DC 0
|
||||||
@@ -873,6 +874,49 @@ public:
|
|||||||
bool useMask = false)
|
bool useMask = false)
|
||||||
{ m_pimpl->DoDrawBitmap(bmp, pt.x, pt.y, useMask); }
|
{ m_pimpl->DoDrawBitmap(bmp, pt.x, pt.y, useMask); }
|
||||||
|
|
||||||
|
virtual void DrawScaledBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, wxCoord w, wxCoord h, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
|
||||||
|
{
|
||||||
|
if (bmp.GetWidth() != w || bmp.GetHeight() != h)
|
||||||
|
{
|
||||||
|
if (quality != wxIMAGE_QUALITY_HIGH)
|
||||||
|
quality = wxIMAGE_QUALITY_NORMAL;
|
||||||
|
wxImage tmpImg = bmp.ConvertToImage();
|
||||||
|
tmpImg.Rescale( w, h, quality );
|
||||||
|
wxBitmap scaledBmp(tmpImg);
|
||||||
|
m_pimpl->DoDrawBitmap(scaledBmp, x, y, useMask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_pimpl->DoDrawBitmap(bmp, x, y, useMask);
|
||||||
|
}
|
||||||
|
virtual void DrawScaledBitmap(const wxBitmap &bmp, const wxPoint& pt, const wxSize& sz, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
|
||||||
|
{
|
||||||
|
if (bmp.GetWidth() != sz.x || bmp.GetHeight() != sz.y)
|
||||||
|
{
|
||||||
|
if (quality != wxIMAGE_QUALITY_HIGH)
|
||||||
|
quality = wxIMAGE_QUALITY_NORMAL;
|
||||||
|
wxImage tmpImg = bmp.ConvertToImage();
|
||||||
|
tmpImg.Rescale( sz.x, sz.y, quality );
|
||||||
|
wxBitmap scaledBmp(tmpImg);
|
||||||
|
m_pimpl->DoDrawBitmap(scaledBmp, pt.x, pt.y, useMask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_pimpl->DoDrawBitmap(bmp, pt.x, pt.y, useMask);
|
||||||
|
}
|
||||||
|
virtual void DrawScaledBitmap(const wxBitmap &bmp, const wxRect& rect, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
|
||||||
|
{
|
||||||
|
if (bmp.GetWidth() != rect.width || bmp.GetHeight() != rect.height)
|
||||||
|
{
|
||||||
|
if (quality != wxIMAGE_QUALITY_HIGH)
|
||||||
|
quality = wxIMAGE_QUALITY_NORMAL;
|
||||||
|
wxImage tmpImg = bmp.ConvertToImage();
|
||||||
|
tmpImg.Rescale( rect.width, rect.height, quality );
|
||||||
|
wxBitmap scaledBmp(tmpImg);
|
||||||
|
m_pimpl->DoDrawBitmap(scaledBmp, rect.x, rect.y, useMask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_pimpl->DoDrawBitmap(bmp, rect.x, rect.y, useMask);
|
||||||
|
}
|
||||||
|
|
||||||
void DrawText(const wxString& text, wxCoord x, wxCoord y)
|
void DrawText(const wxString& text, wxCoord x, wxCoord y)
|
||||||
{ m_pimpl->DoDrawText(text, x, y); }
|
{ m_pimpl->DoDrawText(text, x, y); }
|
||||||
void DrawText(const wxString& text, const wxPoint& pt)
|
void DrawText(const wxString& text, const wxPoint& pt)
|
||||||
@@ -1189,6 +1233,49 @@ public:
|
|||||||
bool useMask = false)
|
bool useMask = false)
|
||||||
{ DoDrawBitmap(bmp, pt.x, pt.y, useMask); }
|
{ DoDrawBitmap(bmp, pt.x, pt.y, useMask); }
|
||||||
|
|
||||||
|
virtual void DrawScaledBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, wxCoord w, wxCoord h, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
|
||||||
|
{
|
||||||
|
if (bmp.GetWidth() != w || bmp.GetHeight() != h)
|
||||||
|
{
|
||||||
|
if (quality != wxIMAGE_QUALITY_HIGH)
|
||||||
|
quality = wxIMAGE_QUALITY_NORMAL;
|
||||||
|
wxImage tmpImg = bmp.ConvertToImage();
|
||||||
|
tmpImg.Rescale( w, h, quality );
|
||||||
|
wxBitmap scaledBmp(tmpImg);
|
||||||
|
DoDrawBitmap(scaledBmp, x, y, useMask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
DoDrawBitmap(bmp, x, y, useMask);
|
||||||
|
}
|
||||||
|
virtual void DrawScaledBitmap(const wxBitmap &bmp, const wxPoint& pt, const wxSize& sz, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
|
||||||
|
{
|
||||||
|
if (bmp.GetWidth() != sz.x || bmp.GetHeight() != sz.y)
|
||||||
|
{
|
||||||
|
if (quality != wxIMAGE_QUALITY_HIGH)
|
||||||
|
quality = wxIMAGE_QUALITY_NORMAL;
|
||||||
|
wxImage tmpImg = bmp.ConvertToImage();
|
||||||
|
tmpImg.Rescale( sz.x, sz.y, quality );
|
||||||
|
wxBitmap scaledBmp(tmpImg);
|
||||||
|
DoDrawBitmap(scaledBmp, pt.x, pt.y, useMask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
DoDrawBitmap(bmp, pt.x, pt.y, useMask);
|
||||||
|
}
|
||||||
|
virtual void DrawScaledBitmap(const wxBitmap &bmp, const wxRect& rect, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
|
||||||
|
{
|
||||||
|
if (bmp.GetWidth() != rect.width || bmp.GetHeight() != rect.height)
|
||||||
|
{
|
||||||
|
if (quality != wxIMAGE_QUALITY_HIGH)
|
||||||
|
quality = wxIMAGE_QUALITY_NORMAL;
|
||||||
|
wxImage tmpImg = bmp.ConvertToImage();
|
||||||
|
tmpImg.Rescale( rect.width, rect.height, quality );
|
||||||
|
wxBitmap scaledBmp(tmpImg);
|
||||||
|
DoDrawBitmap(scaledBmp, rect.x, rect.y, useMask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
DoDrawBitmap(bmp, rect.x, rect.y, useMask);
|
||||||
|
}
|
||||||
|
|
||||||
void DrawText(const wxString& text, wxCoord x, wxCoord y)
|
void DrawText(const wxString& text, wxCoord x, wxCoord y)
|
||||||
{ DoDrawText(text, x, y); }
|
{ DoDrawText(text, x, y); }
|
||||||
void DrawText(const wxString& text, const wxPoint& pt)
|
void DrawText(const wxString& text, const wxPoint& pt)
|
||||||
|
@@ -232,9 +232,6 @@ public:
|
|||||||
wxCoord GetCharWidth() const;
|
wxCoord GetCharWidth() const;
|
||||||
bool CanGetTextExtent() const { return true; }
|
bool CanGetTextExtent() const { return true; }
|
||||||
wxSize GetPPI() const;
|
wxSize GetPPI() const;
|
||||||
void SetAxisOrientation( bool xLeftRight, bool yBottomUp );
|
|
||||||
void SetLogicalOrigin( wxCoord x, wxCoord y );
|
|
||||||
void SetDeviceOrigin( wxCoord x, wxCoord y );
|
|
||||||
virtual int GetDepth() const { return 24; }
|
virtual int GetDepth() const { return 24; }
|
||||||
void SetBackgroundMode(int WXUNUSED(mode)) { }
|
void SetBackgroundMode(int WXUNUSED(mode)) { }
|
||||||
void SetPalette(const wxPalette& WXUNUSED(palette)) { }
|
void SetPalette(const wxPalette& WXUNUSED(palette)) { }
|
||||||
@@ -290,46 +287,13 @@ private:
|
|||||||
unsigned char m_currentGreen;
|
unsigned char m_currentGreen;
|
||||||
unsigned char m_currentBlue;
|
unsigned char m_currentBlue;
|
||||||
|
|
||||||
int m_deviceOffsetY;
|
double m_pageHeight;
|
||||||
|
|
||||||
GnomePrintContext *m_gpc;
|
GnomePrintContext *m_gpc;
|
||||||
GnomePrintJob* m_job;
|
GnomePrintJob* m_job;
|
||||||
|
|
||||||
void makeEllipticalPath(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
|
void makeEllipticalPath(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
|
||||||
|
|
||||||
private:
|
|
||||||
wxCoord XDEV2LOG(wxCoord x) const
|
|
||||||
{
|
|
||||||
return wxRound((double)(x - m_deviceOriginX) / m_scaleX) * m_signX + m_logicalOriginX;
|
|
||||||
}
|
|
||||||
wxCoord XDEV2LOGREL(wxCoord x) const
|
|
||||||
{
|
|
||||||
return wxRound((double)(x) / m_scaleX);
|
|
||||||
}
|
|
||||||
wxCoord YDEV2LOG(wxCoord y) const
|
|
||||||
{
|
|
||||||
return wxRound((double)(y + m_deviceOriginY - m_deviceOffsetY) / m_scaleY) * m_signY + m_logicalOriginY;
|
|
||||||
}
|
|
||||||
wxCoord YDEV2LOGREL(wxCoord y) const
|
|
||||||
{
|
|
||||||
return wxRound((double)(y) / m_scaleY);
|
|
||||||
}
|
|
||||||
wxCoord XLOG2DEV(wxCoord x) const
|
|
||||||
{
|
|
||||||
return wxRound((double)(x - m_logicalOriginX) * m_scaleX) * m_signX + m_deviceOriginX;
|
|
||||||
}
|
|
||||||
wxCoord XLOG2DEVREL(wxCoord x) const
|
|
||||||
{
|
|
||||||
return wxRound((double)(x) * m_scaleX);
|
|
||||||
}
|
|
||||||
wxCoord YLOG2DEV(wxCoord y) const
|
|
||||||
{
|
|
||||||
return wxRound((double)(y - m_logicalOriginY) * m_scaleY) * m_signY - m_deviceOriginY + m_deviceOffsetY;
|
|
||||||
}
|
|
||||||
wxCoord YLOG2DEVREL(wxCoord y) const
|
|
||||||
{
|
|
||||||
return wxRound((double)(y) * m_scaleY);
|
|
||||||
}
|
|
||||||
private:
|
private:
|
||||||
DECLARE_DYNAMIC_CLASS(wxGnomePrintDC)
|
DECLARE_DYNAMIC_CLASS(wxGnomePrintDC)
|
||||||
DECLARE_NO_COPY_CLASS(wxGnomePrintDC)
|
DECLARE_NO_COPY_CLASS(wxGnomePrintDC)
|
||||||
|
@@ -513,12 +513,12 @@ wxCoord wxImplDC::DeviceToLogicalYRel(wxCoord y) const
|
|||||||
|
|
||||||
wxCoord wxImplDC::LogicalToDeviceX(wxCoord x) const
|
wxCoord wxImplDC::LogicalToDeviceX(wxCoord x) const
|
||||||
{
|
{
|
||||||
return wxRound((double)(x - m_logicalOriginX) * m_scaleX) * m_signX + m_deviceOriginX + m_deviceLocalOriginX;
|
return wxRound((double)(x - m_logicalOriginX) * m_scaleX) * m_signX + m_deviceOriginX * m_signY + m_deviceLocalOriginX;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxCoord wxImplDC::LogicalToDeviceY(wxCoord y) const
|
wxCoord wxImplDC::LogicalToDeviceY(wxCoord y) const
|
||||||
{
|
{
|
||||||
return wxRound((double)(y - m_logicalOriginY) * m_scaleY) * m_signY + m_deviceOriginY + m_deviceLocalOriginY;
|
return wxRound((double)(y - m_logicalOriginY) * m_scaleY) * m_signY + m_deviceOriginY * m_signY + m_deviceLocalOriginY;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxCoord wxImplDC::LogicalToDeviceXRel(wxCoord x) const
|
wxCoord wxImplDC::LogicalToDeviceXRel(wxCoord x) const
|
||||||
@@ -601,6 +601,7 @@ void wxImplDC::SetDeviceLocalOrigin( wxCoord x, wxCoord y )
|
|||||||
void wxImplDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
|
void wxImplDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
|
||||||
{
|
{
|
||||||
// only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
|
// only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
|
||||||
|
// wxWidgets 2.9: no longer override it
|
||||||
m_signX = (xLeftRight ? 1 : -1);
|
m_signX = (xLeftRight ? 1 : -1);
|
||||||
m_signY = (yBottomUp ? -1 : 1);
|
m_signY = (yBottomUp ? -1 : 1);
|
||||||
ComputeScaleAndOrigin();
|
ComputeScaleAndOrigin();
|
||||||
@@ -1706,6 +1707,7 @@ void wxDCBase::SetDeviceLocalOrigin( wxCoord x, wxCoord y )
|
|||||||
void wxDCBase::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
|
void wxDCBase::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
|
||||||
{
|
{
|
||||||
// only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
|
// only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
|
||||||
|
// wxWidgets 2.9: no longer override it
|
||||||
m_signX = (xLeftRight ? 1 : -1);
|
m_signX = (xLeftRight ? 1 : -1);
|
||||||
m_signY = (yBottomUp ? -1 : 1);
|
m_signY = (yBottomUp ? -1 : 1);
|
||||||
ComputeScaleAndOrigin();
|
ComputeScaleAndOrigin();
|
||||||
|
@@ -733,28 +733,42 @@ wxRect wxPrintout::GetLogicalPageMarginsRect(const wxPageSetupDialogData& pageSe
|
|||||||
// Return the rectangle in logical units that corresponds to the region
|
// Return the rectangle in logical units that corresponds to the region
|
||||||
// within the page margins as specified by the given wxPageSetupDialogData
|
// within the page margins as specified by the given wxPageSetupDialogData
|
||||||
// object.
|
// object.
|
||||||
wxRect paperRect = GetPaperRectPixels();
|
|
||||||
|
// We get the paper size in device units and the margins in mm,
|
||||||
|
// so we need to calculate the conversion with this trick
|
||||||
wxCoord pw, ph;
|
wxCoord pw, ph;
|
||||||
GetPageSizePixels(&pw, &ph);
|
GetPageSizePixels(&pw, &ph);
|
||||||
wxPoint topLeft = pageSetupData.GetMarginTopLeft();
|
|
||||||
wxPoint bottomRight = pageSetupData.GetMarginBottomRight();
|
|
||||||
wxCoord mw, mh;
|
wxCoord mw, mh;
|
||||||
GetPageSizeMM(&mw, &mh);
|
GetPageSizeMM(&mw, &mh);
|
||||||
float mmToDeviceX = float(pw) / mw;
|
float mmToDeviceX = float(pw) / mw;
|
||||||
float mmToDeviceY = float(ph) / mh;
|
float mmToDeviceY = float(ph) / mh;
|
||||||
wxRect pageMarginsRect(paperRect.x + wxRound(mmToDeviceX * topLeft.x),
|
|
||||||
|
// paper size in device units
|
||||||
|
wxRect paperRect = GetPaperRectPixels();
|
||||||
|
|
||||||
|
// margins in mm
|
||||||
|
wxPoint topLeft = pageSetupData.GetMarginTopLeft();
|
||||||
|
wxPoint bottomRight = pageSetupData.GetMarginBottomRight();
|
||||||
|
|
||||||
|
// calculate margins in device units
|
||||||
|
wxRect pageMarginsRect(
|
||||||
|
paperRect.x + wxRound(mmToDeviceX * topLeft.x),
|
||||||
paperRect.y + wxRound(mmToDeviceY * topLeft.y),
|
paperRect.y + wxRound(mmToDeviceY * topLeft.y),
|
||||||
paperRect.width - wxRound(mmToDeviceX * (topLeft.x + bottomRight.x)),
|
paperRect.width - wxRound(mmToDeviceX * (topLeft.x + bottomRight.x)),
|
||||||
paperRect.height - wxRound(mmToDeviceY * (topLeft.y + bottomRight.y)));
|
paperRect.height - wxRound(mmToDeviceY * (topLeft.y + bottomRight.y)));
|
||||||
|
|
||||||
wxCoord w, h;
|
wxCoord w, h;
|
||||||
m_printoutDC->GetSize(&w, &h);
|
m_printoutDC->GetSize(&w, &h);
|
||||||
if (w == pw && h == ph) {
|
if (w == pw && h == ph)
|
||||||
|
{
|
||||||
// this DC matches the printed page, so no scaling
|
// this DC matches the printed page, so no scaling
|
||||||
return wxRect(m_printoutDC->DeviceToLogicalX(pageMarginsRect.x),
|
return wxRect(
|
||||||
|
m_printoutDC->DeviceToLogicalX(pageMarginsRect.x),
|
||||||
m_printoutDC->DeviceToLogicalY(pageMarginsRect.y),
|
m_printoutDC->DeviceToLogicalY(pageMarginsRect.y),
|
||||||
m_printoutDC->DeviceToLogicalXRel(pageMarginsRect.width),
|
m_printoutDC->DeviceToLogicalXRel(pageMarginsRect.width),
|
||||||
m_printoutDC->DeviceToLogicalYRel(pageMarginsRect.height));
|
m_printoutDC->DeviceToLogicalYRel(pageMarginsRect.height));
|
||||||
}
|
}
|
||||||
|
|
||||||
// This DC doesn't match the printed page, so we have to scale.
|
// This DC doesn't match the printed page, so we have to scale.
|
||||||
float scaleX = float(w) / pw;
|
float scaleX = float(w) / pw;
|
||||||
float scaleY = float(h) / ph;
|
float scaleY = float(h) / ph;
|
||||||
@@ -767,17 +781,18 @@ wxRect wxPrintout::GetLogicalPageMarginsRect(const wxPageSetupDialogData& pageSe
|
|||||||
void wxPrintout::SetLogicalOrigin(wxCoord x, wxCoord y)
|
void wxPrintout::SetLogicalOrigin(wxCoord x, wxCoord y)
|
||||||
{
|
{
|
||||||
// Set the device origin by specifying a point in logical coordinates.
|
// Set the device origin by specifying a point in logical coordinates.
|
||||||
m_printoutDC->SetDeviceOrigin(m_printoutDC->LogicalToDeviceX(x),
|
m_printoutDC->SetDeviceOrigin(
|
||||||
m_printoutDC->LogicalToDeviceY(y));
|
m_printoutDC->LogicalToDeviceX(x),
|
||||||
|
m_printoutDC->LogicalToDeviceY(y) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPrintout::OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff)
|
void wxPrintout::OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff)
|
||||||
{
|
{
|
||||||
// Offset the device origin by a specified distance in device coordinates.
|
// Offset the device origin by a specified distance in device coordinates.
|
||||||
wxCoord x = m_printoutDC->LogicalToDeviceX(0);
|
wxPoint dev_org = m_printoutDC->GetDeviceOrigin();
|
||||||
wxCoord y = m_printoutDC->LogicalToDeviceY(0);
|
m_printoutDC->SetDeviceOrigin(
|
||||||
m_printoutDC->SetDeviceOrigin(x + m_printoutDC->LogicalToDeviceXRel(xoff),
|
dev_org.x + m_printoutDC->LogicalToDeviceXRel(xoff),
|
||||||
y + m_printoutDC->LogicalToDeviceYRel(yoff));
|
dev_org.y + m_printoutDC->LogicalToDeviceYRel(yoff) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -40,8 +40,6 @@
|
|||||||
#include <libgnomeprintui/gnome-print-job-preview.h>
|
#include <libgnomeprintui/gnome-print-job-preview.h>
|
||||||
#include <libgnomeprintui/gnome-print-paper-selector.h>
|
#include <libgnomeprintui/gnome-print-paper-selector.h>
|
||||||
|
|
||||||
static const double RAD2DEG = 180.0 / M_PI;
|
|
||||||
|
|
||||||
#include "wx/link.h"
|
#include "wx/link.h"
|
||||||
wxFORCE_LINK_THIS_MODULE(gnome_print)
|
wxFORCE_LINK_THIS_MODULE(gnome_print)
|
||||||
|
|
||||||
@@ -945,6 +943,19 @@ bool wxGnomePrinter::Setup( wxWindow *parent )
|
|||||||
// wxGnomePrintDC
|
// wxGnomePrintDC
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// conversion
|
||||||
|
static const double RAD2DEG = 180.0 / M_PI;
|
||||||
|
|
||||||
|
// we don't want to use only 72 dpi from GNOME print
|
||||||
|
static const int DPI = 600;
|
||||||
|
static const double PS2DEV = 600.0 / 72.0;
|
||||||
|
static const double DEV2PS = 72.0 / 600.0;
|
||||||
|
|
||||||
|
#define XLOG2DEV(x) ((double)(LogicalToDeviceX(x)) * DEV2PS)
|
||||||
|
#define XLOG2DEVREL(x) ((double)(LogicalToDeviceXRel(x)) * DEV2PS)
|
||||||
|
#define YLOG2DEV(x) ((m_pageHeight - (double)LogicalToDeviceY(x)) * DEV2PS)
|
||||||
|
#define YLOG2DEVREL(x) ((double)(LogicalToDeviceYRel(x)) * DEV2PS)
|
||||||
|
|
||||||
IMPLEMENT_CLASS(wxGnomePrintDC, wxDC)
|
IMPLEMENT_CLASS(wxGnomePrintDC, wxDC)
|
||||||
|
|
||||||
wxGnomePrintDC::wxGnomePrintDC( const wxPrintData& data )
|
wxGnomePrintDC::wxGnomePrintDC( const wxPrintData& data )
|
||||||
@@ -965,10 +976,11 @@ wxGnomePrintDC::wxGnomePrintDC( const wxPrintData& data )
|
|||||||
m_currentBlue = 0;
|
m_currentBlue = 0;
|
||||||
m_currentGreen = 0;
|
m_currentGreen = 0;
|
||||||
|
|
||||||
m_signX = 1; // default x-axis left to right
|
// Query page size. This seems to omit the margins
|
||||||
m_signY = -1; // default y-axis bottom up -> top down
|
double pw,ph;
|
||||||
|
gs_lgp->gnome_print_job_get_page_size( native->GetPrintJob(), &pw, &ph );
|
||||||
|
|
||||||
GetSize( NULL, &m_deviceOffsetY );
|
m_pageHeight = ph * PS2DEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGnomePrintDC::~wxGnomePrintDC()
|
wxGnomePrintDC::~wxGnomePrintDC()
|
||||||
@@ -1069,8 +1081,8 @@ void wxGnomePrintDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d
|
|||||||
x += w/2;
|
x += w/2;
|
||||||
y += h/2;
|
y += h/2;
|
||||||
|
|
||||||
int xx = XLOG2DEV(x);
|
double xx = XLOG2DEV(x);
|
||||||
int yy = YLOG2DEV(y);
|
double yy = YLOG2DEV(y);
|
||||||
|
|
||||||
gs_libGnomePrint->gnome_print_gsave( m_gpc );
|
gs_libGnomePrint->gnome_print_gsave( m_gpc );
|
||||||
|
|
||||||
@@ -1078,8 +1090,8 @@ void wxGnomePrintDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d
|
|||||||
double scale = (double)YLOG2DEVREL(h) / (double) XLOG2DEVREL(w);
|
double scale = (double)YLOG2DEVREL(h) / (double) XLOG2DEVREL(w);
|
||||||
gs_libGnomePrint->gnome_print_scale( m_gpc, 1.0, scale );
|
gs_libGnomePrint->gnome_print_scale( m_gpc, 1.0, scale );
|
||||||
|
|
||||||
xx = 0;
|
xx = 0.0;
|
||||||
yy = 0;
|
yy = 0.0;
|
||||||
|
|
||||||
if (m_brush.GetStyle () != wxTRANSPARENT)
|
if (m_brush.GetStyle () != wxTRANSPARENT)
|
||||||
{
|
{
|
||||||
@@ -1496,8 +1508,8 @@ void wxGnomePrintDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y )
|
|||||||
|
|
||||||
void wxGnomePrintDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle)
|
void wxGnomePrintDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle)
|
||||||
{
|
{
|
||||||
x = XLOG2DEV(x);
|
double xx = XLOG2DEV(x);
|
||||||
y = YLOG2DEV(y);
|
double yy = YLOG2DEV(y);
|
||||||
|
|
||||||
bool underlined = m_font.Ok() && m_font.GetUnderlined();
|
bool underlined = m_font.Ok() && m_font.GetUnderlined();
|
||||||
|
|
||||||
@@ -1543,75 +1555,29 @@ void wxGnomePrintDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord
|
|||||||
}
|
}
|
||||||
|
|
||||||
int w,h;
|
int w,h;
|
||||||
|
|
||||||
if (fabs(m_scaleY - 1.0) > 0.00001)
|
|
||||||
{
|
|
||||||
// If there is a user or actually any scale applied to
|
|
||||||
// the device context, scale the font.
|
|
||||||
|
|
||||||
// scale font description
|
|
||||||
gint oldSize = pango_font_description_get_size( m_fontdesc );
|
|
||||||
double size = oldSize;
|
|
||||||
size = size * m_scaleY;
|
|
||||||
pango_font_description_set_size( m_fontdesc, (gint)size );
|
|
||||||
|
|
||||||
// actually apply scaled font
|
|
||||||
pango_layout_set_font_description( m_layout, m_fontdesc );
|
|
||||||
|
|
||||||
pango_layout_get_pixel_size( m_layout, &w, &h );
|
pango_layout_get_pixel_size( m_layout, &w, &h );
|
||||||
#if 0
|
#if 0
|
||||||
if ( m_backgroundMode == wxSOLID )
|
if ( m_backgroundMode == wxSOLID )
|
||||||
{
|
{
|
||||||
gdk_gc_set_foreground(m_textGC, m_textBackgroundColour.GetColor());
|
gdk_gc_set_foreground(m_textGC, m_textBackgroundColour.GetColor());
|
||||||
gdk_draw_rectangle(m_window, m_textGC, TRUE, x, y, w, h);
|
gdk_draw_rectangle(m_window, m_textGC, TRUE, xx, yy, w, h);
|
||||||
gdk_gc_set_foreground(m_textGC, m_textForegroundColour.GetColor());
|
gdk_gc_set_foreground(m_textGC, m_textForegroundColour.GetColor());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Draw layout.
|
|
||||||
gs_libGnomePrint->gnome_print_moveto (m_gpc, x, y);
|
|
||||||
if (fabs(angle) > 0.00001)
|
|
||||||
{
|
|
||||||
gs_libGnomePrint->gnome_print_gsave( m_gpc );
|
|
||||||
gs_libGnomePrint->gnome_print_rotate( m_gpc, angle );
|
|
||||||
gs_libGnomePrint->gnome_print_pango_layout( m_gpc, m_layout );
|
|
||||||
gs_libGnomePrint->gnome_print_grestore( m_gpc );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gs_libGnomePrint->gnome_print_pango_layout( m_gpc, m_layout );
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset unscaled size
|
|
||||||
pango_font_description_set_size( m_fontdesc, oldSize );
|
|
||||||
|
|
||||||
// actually apply unscaled font
|
|
||||||
pango_layout_set_font_description( m_layout, m_fontdesc );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pango_layout_get_pixel_size( m_layout, &w, &h );
|
|
||||||
#if 0
|
|
||||||
if ( m_backgroundMode == wxSOLID )
|
|
||||||
{
|
|
||||||
gdk_gc_set_foreground(m_textGC, m_textBackgroundColour.GetColor());
|
|
||||||
gdk_draw_rectangle(m_window, m_textGC, TRUE, x, y, w, h);
|
|
||||||
gdk_gc_set_foreground(m_textGC, m_textForegroundColour.GetColor());
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// Draw layout.
|
// Draw layout.
|
||||||
gs_libGnomePrint->gnome_print_moveto (m_gpc, x, y);
|
gs_libGnomePrint->gnome_print_moveto (m_gpc, xx, yy);
|
||||||
if (fabs(angle) > 0.00001)
|
|
||||||
{
|
|
||||||
gs_libGnomePrint->gnome_print_gsave( m_gpc );
|
gs_libGnomePrint->gnome_print_gsave( m_gpc );
|
||||||
|
|
||||||
|
gs_libGnomePrint->gnome_print_scale( m_gpc, m_scaleX * DEV2PS, m_scaleY * DEV2PS );
|
||||||
|
|
||||||
|
if (fabs(angle) > 0.00001)
|
||||||
gs_libGnomePrint->gnome_print_rotate( m_gpc, angle );
|
gs_libGnomePrint->gnome_print_rotate( m_gpc, angle );
|
||||||
|
|
||||||
gs_libGnomePrint->gnome_print_pango_layout( m_gpc, m_layout );
|
gs_libGnomePrint->gnome_print_pango_layout( m_gpc, m_layout );
|
||||||
|
|
||||||
gs_libGnomePrint->gnome_print_grestore( m_gpc );
|
gs_libGnomePrint->gnome_print_grestore( m_gpc );
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gs_libGnomePrint->gnome_print_pango_layout( m_gpc, m_layout );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (underlined)
|
if (underlined)
|
||||||
{
|
{
|
||||||
@@ -1891,9 +1857,9 @@ void wxGnomePrintDC::DoGetSize(int* width, int* height) const
|
|||||||
gs_libGnomePrint->gnome_print_job_get_page_size( native->GetPrintJob(), &pw, &ph );
|
gs_libGnomePrint->gnome_print_job_get_page_size( native->GetPrintJob(), &pw, &ph );
|
||||||
|
|
||||||
if (width)
|
if (width)
|
||||||
*width = (int) (pw + 0.5);
|
*width = wxRound( pw * PS2DEV );
|
||||||
if (height)
|
if (height)
|
||||||
*height = (int) (ph + 0.5);
|
*height = wxRound( ph * PS2DEV );
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxGnomePrintDC::DoGetSizeMM(int *width, int *height) const
|
void wxGnomePrintDC::DoGetSizeMM(int *width, int *height) const
|
||||||
@@ -1921,35 +1887,19 @@ void wxGnomePrintDC::DoGetSizeMM(int *width, int *height) const
|
|||||||
|
|
||||||
wxSize wxGnomePrintDC::GetPPI() const
|
wxSize wxGnomePrintDC::GetPPI() const
|
||||||
{
|
{
|
||||||
return wxSize(72,72);
|
return wxSize(DPI,DPI);
|
||||||
}
|
|
||||||
|
|
||||||
void wxGnomePrintDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
|
|
||||||
{
|
|
||||||
m_signX = (xLeftRight ? 1 : -1);
|
|
||||||
m_signY = (yBottomUp ? 1 : -1);
|
|
||||||
|
|
||||||
ComputeScaleAndOrigin();
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxGnomePrintDC::SetLogicalOrigin( wxCoord x, wxCoord y )
|
|
||||||
{
|
|
||||||
wxDC::SetLogicalOrigin( x, y );
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxGnomePrintDC::SetDeviceOrigin( wxCoord x, wxCoord y )
|
|
||||||
{
|
|
||||||
wxDC::SetDeviceOrigin( x, y );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxGnomePrintDC::SetPrintData(const wxPrintData& data)
|
void wxGnomePrintDC::SetPrintData(const wxPrintData& data)
|
||||||
{
|
{
|
||||||
m_printData = data;
|
m_printData = data;
|
||||||
|
|
||||||
|
int height;
|
||||||
if (m_printData.GetOrientation() == wxPORTRAIT)
|
if (m_printData.GetOrientation() == wxPORTRAIT)
|
||||||
GetSize( NULL, &m_deviceOffsetY );
|
GetSize( NULL, &height );
|
||||||
else
|
else
|
||||||
GetSize( &m_deviceOffsetY, NULL );
|
GetSize( &height, NULL );
|
||||||
|
m_deviceLocalOriginY = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxGnomePrintDC::SetResolution(int ppi)
|
void wxGnomePrintDC::SetResolution(int ppi)
|
||||||
@@ -1958,7 +1908,7 @@ void wxGnomePrintDC::SetResolution(int ppi)
|
|||||||
|
|
||||||
int wxGnomePrintDC::GetResolution()
|
int wxGnomePrintDC::GetResolution()
|
||||||
{
|
{
|
||||||
return 72;
|
return DPI;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user