- gs_cairo->cairo_save(m_cairo);
- // In case we're scaling the image by using a width and height different
- // than the bitmap's size create a pattern transformation on the surface and
- // draw the transformed pattern.
- cairo_pattern_t* pattern = gs_cairo->cairo_pattern_create_for_surface(surface);
-
- // Prepare to draw the image.
- gs_cairo->cairo_translate(m_cairo, x, y);
- gs_cairo->cairo_set_source(m_cairo, pattern);
- // Use the original size here since the context is scaled already.
- gs_cairo->cairo_rectangle(m_cairo, 0, 0, bw, bh);
- // Fill the rectangle using the pattern.
- gs_cairo->cairo_fill(m_cairo);
-
- // Clean up.
- gs_cairo->cairo_pattern_destroy(pattern);
- gs_cairo->cairo_surface_destroy(surface);
- delete [] buffer;
-
- CalcBoundingBox(0,0);
- CalcBoundingBox(bw,bh);
-
- gs_cairo->cairo_restore(m_cairo);
-}
-
-// wxGtkPrintDC has a constant resolution of 72dpi. If we want an higher resolution for printing
-// an image, the scaling has to be done by cairo.
-void wxGtkPrintDC::DoDrawScaledBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, wxCoord w, wxCoord h, bool useMask, int quality )
-{
- wxCHECK_RET( bitmap.IsOk(), wxT("Invalid bitmap in wxGtkPrintDC::DoDrawBitmap"));
-
- cairo_surface_t* surface;
- int bw = bitmap.GetWidth();
- int bh = bitmap.GetHeight();
- x = wxCoord(LogicalToCairoX(x));
- y = wxCoord(LogicalToCairoY(y));
- w = wxCoord(LogicalToCairoXRel(w));
- h = wxCoord(LogicalToCairoYRel(h));
- wxBitmap bmpSource = bitmap; // we need a non-const instance.
- unsigned char* buffer = new unsigned char[bw*bh*4];
- wxUint32* data = (wxUint32*)buffer;
-
- // Create a surface object and copy the bitmap pixel data to it. If the image has alpha (or a mask represented as alpha)
- // then we'll use a different format and iterator than if it doesn't.
- if (bmpSource.HasAlpha() || bmpSource.GetMask())
- {
- surface = gs_cairo->cairo_image_surface_create_for_data(
- buffer, CAIRO_FORMAT_ARGB32, bw, bh, bw*4);
- wxAlphaPixelData pixData(bmpSource, wxPoint(0,0), wxSize(bw, bh));
- wxCHECK_RET( pixData, wxT("Failed to gain raw access to bitmap data."));
-
- wxAlphaPixelData::Iterator p(pixData);
- int y, x;
- for (y=0; y<bh; y++)
- {
- wxAlphaPixelData::Iterator rowStart = p;
- for (x=0; x<bw; x++)
- {
- // Each pixel in CAIRO_FORMAT_ARGB32 is a 32-bit quantity,
- // with alpha in the upper 8 bits, then red, then green, then
- // blue. The 32-bit quantities are stored native-endian.
- // Pre-multiplied alpha is used.
- unsigned char alpha = p.Alpha();