X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f7b8e3d654084fc4e64939f4aae5e70e15231741..f0fbbe236452ae27a7577deafbbc44ace2c209e7:/src/gtk/print.cpp diff --git a/src/gtk/print.cpp b/src/gtk/print.cpp index 4d33c96f8e..a7c6f95081 100644 --- a/src/gtk/print.cpp +++ b/src/gtk/print.cpp @@ -1074,7 +1074,7 @@ wxDC* wxGtkPrinter::PrintDialog( wxWindow *parent ) } m_printDialogData = dialog.GetPrintDialogData(); - + return new wxPrinterDC( m_printDialogData.GetPrintData() ); } @@ -1132,7 +1132,7 @@ wxGtkPrinterDCImpl::wxGtkPrinterDCImpl(wxPrinterDC *owner, const wxPrintData& da #if wxCAIRO_SCALE m_PS2DEV = 1.0; m_DEV2PS = 1.0; - + cairo_scale( m_cairo, 72.0 / (double)m_resolution, 72.0 / (double)m_resolution ); #else m_PS2DEV = (double)m_resolution / 72.0; @@ -1192,7 +1192,8 @@ void wxGtkPrinterDCImpl::DoGradientFillConcentric(const wxRect& rect, const wxCo wxCoord w = rect.width; wxCoord h = rect.height; - double radius = sqrt((w/2)*(w/2)+(h/2)*(h/2)); + const double r2 = (w/2)*(w/2)+(h/2)*(h/2); + double radius = sqrt(r2); unsigned char redI = initialColour.Red(); unsigned char blueI = initialColour.Blue(); @@ -1814,40 +1815,6 @@ void wxGtkPrinterDCImpl::DoDrawRotatedText(const wxString& text, wxCoord x, wxCo } } - int w,h; - - // Scale font description. - gint oldSize = pango_font_description_get_size( m_fontdesc ); - double size = oldSize; - size = size * m_scaleX; - 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 ); - - if ( m_backgroundMode == wxBRUSHSTYLE_SOLID ) - { - unsigned char red = m_textBackgroundColour.Red(); - unsigned char blue = m_textBackgroundColour.Blue(); - unsigned char green = m_textBackgroundColour.Green(); - unsigned char alpha = m_textBackgroundColour.Alpha(); - - double redPS = (double)(red) / 255.0; - double bluePS = (double)(blue) / 255.0; - double greenPS = (double)(green) / 255.0; - double alphaPS = (double)(alpha) / 255.0; - - cairo_save(m_cairo); - cairo_translate(m_cairo, xx, yy); - cairo_set_source_rgba( m_cairo, redPS, greenPS, bluePS, alphaPS ); - cairo_rotate(m_cairo,angle*DEG2RAD); - cairo_rectangle(m_cairo, 0, 0, w, h); // still in cairo units - cairo_fill(m_cairo); - cairo_restore(m_cairo); - } - // Draw layout. cairo_move_to (m_cairo, xx, yy); @@ -1856,6 +1823,30 @@ void wxGtkPrinterDCImpl::DoDrawRotatedText(const wxString& text, wxCoord x, wxCo if (fabs(angle) > 0.00001) cairo_rotate( m_cairo, angle*DEG2RAD ); + cairo_scale(m_cairo, m_scaleX, m_scaleY); + + int w,h; + pango_layout_get_pixel_size( m_layout, &w, &h ); + + if ( m_backgroundMode == wxBRUSHSTYLE_SOLID ) + { + unsigned char red = m_textBackgroundColour.Red(); + unsigned char blue = m_textBackgroundColour.Blue(); + unsigned char green = m_textBackgroundColour.Green(); + unsigned char alpha = m_textBackgroundColour.Alpha(); + + double redPS = (double)(red) / 255.0; + double bluePS = (double)(blue) / 255.0; + double greenPS = (double)(green) / 255.0; + double alphaPS = (double)(alpha) / 255.0; + + cairo_save(m_cairo); + cairo_set_source_rgba( m_cairo, redPS, greenPS, bluePS, alphaPS ); + cairo_rectangle(m_cairo, 0, 0, w, h); // still in cairo units + cairo_fill(m_cairo); + cairo_restore(m_cairo); + } + pango_cairo_update_layout (m_cairo, m_layout); pango_cairo_show_layout (m_cairo, m_layout); @@ -1867,12 +1858,6 @@ void wxGtkPrinterDCImpl::DoDrawRotatedText(const wxString& text, wxCoord x, wxCo pango_layout_set_attributes(m_layout, NULL); } - // Reset unscaled size. - pango_font_description_set_size( m_fontdesc, oldSize ); - - // Actually apply unscaled font. - pango_layout_set_font_description( m_layout, m_fontdesc ); - // Back to device units: CalcBoundingBox (x, y); CalcBoundingBox (x + w, y + h); @@ -1881,7 +1866,7 @@ void wxGtkPrinterDCImpl::DoDrawRotatedText(const wxString& text, wxCoord x, wxCo void wxGtkPrinterDCImpl::Clear() { // Clear does nothing for printing, but keep the code -// for later reuse +// for later reuse /* cairo_save(m_cairo); cairo_set_operator (m_cairo, CAIRO_OPERATOR_SOURCE); @@ -1902,6 +1887,10 @@ void wxGtkPrinterDCImpl::SetFont( const wxFont& font ) m_fontdesc = pango_font_description_copy( m_font.GetNativeFontInfo()->description ); + float size = pango_font_description_get_size( m_fontdesc ); + size = size * GetFontPointSizeAdjustment(72.0); + pango_font_description_set_size( m_fontdesc, (gint)size ); + pango_layout_set_font_description( m_layout, m_fontdesc ); } } @@ -1913,7 +1902,7 @@ void wxGtkPrinterDCImpl::SetPen( const wxPen& pen ) m_pen = pen; double width; - + if (m_pen.GetWidth() <= 0) width = 0.1; else @@ -2185,43 +2174,49 @@ void wxGtkPrinterDCImpl::DoGetTextExtent(const wxString& string, wxCoord *width, return; } + cairo_save( m_cairo ); + cairo_scale(m_cairo, m_scaleX, m_scaleY); + // Set layout's text const wxUTF8Buf dataUTF8 = string.utf8_str(); - PangoFontDescription *desc = m_fontdesc; - if (theFont) desc = theFont->GetNativeFontInfo()->description; - - gint oldSize = pango_font_description_get_size( desc ); - double size = oldSize; - size = size * m_scaleY; - pango_font_description_set_size( desc, (gint)size ); + gint oldSize=0; + if ( theFont ) + { + // scale the font and apply it + PangoFontDescription *desc = theFont->GetNativeFontInfo()->description; + float size = pango_font_description_get_size(desc); + size = size * GetFontPointSizeAdjustment(72.0); + pango_font_description_set_size(desc, (gint)size); - // apply scaled font - pango_layout_set_font_description( m_layout, desc ); + pango_layout_set_font_description(m_layout, desc); + } pango_layout_set_text( m_layout, dataUTF8, strlen(dataUTF8) ); - int w, h; - pango_layout_get_pixel_size( m_layout, &w, &h ); - - if (width) - *width = wxRound( (double)w / m_scaleX * m_PS2DEV ); - if (height) - *height = wxRound( (double)h / m_scaleY * m_PS2DEV ); + int h; + pango_layout_get_pixel_size( m_layout, width, &h ); + if ( height ) + *height = h; if (descent) { PangoLayoutIter *iter = pango_layout_get_iter(m_layout); int baseline = pango_layout_iter_get_baseline(iter); pango_layout_iter_free(iter); - *descent = wxRound( (h - PANGO_PIXELS(baseline)) * m_PS2DEV ); + *descent = h - PANGO_PIXELS(baseline); } - // Reset unscaled size. - pango_font_description_set_size( desc, oldSize ); + if ( theFont ) + { + // restore font and reset font's size back + pango_layout_set_font_description(m_layout, m_fontdesc); + + PangoFontDescription *desc = theFont->GetNativeFontInfo()->description; + pango_font_description_set_size(desc, oldSize); + } - // Reset unscaled font. - pango_layout_set_font_description( m_layout, m_fontdesc ); + cairo_restore( m_cairo ); } void wxGtkPrinterDCImpl::DoGetSize(int* width, int* height) const @@ -2256,7 +2251,7 @@ void wxGtkPrinterDCImpl::SetPrintData(const wxPrintData& data) // overriden for wxPrinterDC Impl -wxRect wxGtkPrinterDCImpl::GetPaperRect() +wxRect wxGtkPrinterDCImpl::GetPaperRect() const { // Does GtkPrint support printer margins? int w = 0; @@ -2265,7 +2260,7 @@ wxRect wxGtkPrinterDCImpl::GetPaperRect() return wxRect( 0,0,w,h ); } -int wxGtkPrinterDCImpl::GetResolution() +int wxGtkPrinterDCImpl::GetResolution() const { return m_resolution; } @@ -2362,7 +2357,7 @@ void wxGtkPrintPreview::DetermineScaling() wxSize sizeDevUnits(paper->GetSizeDeviceUnits()); sizeDevUnits.x = wxRound((double)sizeDevUnits.x * (double)m_resolution / 72.0); sizeDevUnits.y = wxRound((double)sizeDevUnits.y * (double)m_resolution / 72.0); - + wxSize sizeTenthsMM(paper->GetSize()); wxSize sizeMM(sizeTenthsMM.x / 10, sizeTenthsMM.y / 10);