Kaydet (Commit) d4b5b8bf authored tarafından Armin Le Grand's avatar Armin Le Grand

i121591 Corrected some transparent printing stuff for windows

üst 8c142809
......@@ -302,8 +302,14 @@ void OutputDevice::DrawTransparent( const PolyPolygon& rPolyPoly,
const double fTransparency = 0.01 * nTransparencePercent;
if( mbFillColor )
{
// draw the transparent polygon
// NOTE: filled polygons are assumed to be drawn as if they were always closed
// #121591#
// CAUTION: Only non printing (pixel-renderer) VCL commands from OutputDevices
// should be used when printing. Normally this is avoided by the printer being
// non-AAed and thus e.g. on WIN GdiPlus calls are not used. It may be necessary
// to add (OUTDEV_PRINTER != meOutDevType) to the entering if statement, thus
// using the fallbacl some lines below (which is not very good, though). For
// now, WinSalGraphics::drawPolyPolygon will detect printer usage and correct
// the wrong mapping (see there for details)
bDrawn = mpGraphics->DrawPolyPolygon( aB2DPolyPolygon, fTransparency, this );
}
......
......@@ -178,6 +178,33 @@ bool WinSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPoly
aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone);
}
if(mbPrinter)
{
// #121591#
// Normally GdiPlus should not be used for printing at all since printers cannot
// print transparent filled polygon geometry and normally this does not happen
// since OutputDevice::RemoveTransparenciesFromMetaFile is used as preparation
// and no transparent parts should remain for printing. But this can be overriden
// by the user and thus happens. This call can only come (currently) from
// OutputDevice::DrawTransparent, see comments sthere with the same TaskID.
// If it is used, the mapping for the printer is wrong and needs to be corrected. I
// checked that there is *no* transformation set (testcode commented out below) and
// estimated that a stable factor dependent of the printer's DPI is used. Create
// and set a transformation here to correct this
const Gdiplus::REAL aDpiX(aGraphics.GetDpiX());
const Gdiplus::REAL aDpiY(aGraphics.GetDpiY());
// test code to check the current transformation at the graphics device
//Gdiplus::Matrix matrix;
//aGraphics.GetTransform(&matrix);
//Gdiplus::REAL elements[6];
//matrix.GetElements(elements);
Gdiplus::Matrix aPrinterTransform;
aPrinterTransform.Scale(Gdiplus::REAL(100.0) / aDpiX, Gdiplus::REAL(100.0) / aDpiY);
aGraphics.SetTransform(&aPrinterTransform);
}
aGraphics.FillPath(&aTestBrush, &aPath);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment