| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_drawinglayer.hxx" |
| |
| #include <drawinglayer/processor2d/vclpixelprocessor2d.hxx> |
| #include <vcl/outdev.hxx> |
| #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> |
| #include <drawinglayer/primitive2d/textprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/polygonprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/bitmapprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/fillbitmapprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/metafileprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/maskprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/transparenceprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/transformprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/markerarrayprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/pointarrayprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/wrongspellprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/controlprimitive2d.hxx> |
| #include <com/sun/star/awt/XWindow2.hpp> |
| #include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/pagepreviewprimitive2d.hxx> |
| #include <helperwrongspellrenderer.hxx> |
| #include <drawinglayer/primitive2d/fillhatchprimitive2d.hxx> |
| #include <basegfx/polygon/b2dpolygontools.hxx> |
| #include <vcl/hatch.hxx> |
| #include <tools/diagnose_ex.h> |
| #include <com/sun/star/awt/PosSize.hpp> |
| #include <drawinglayer/primitive2d/invertprimitive2d.hxx> |
| #include <cstdio> |
| #include <drawinglayer/primitive2d/backgroundcolorprimitive2d.hxx> |
| #include <basegfx/matrix/b2dhommatrixtools.hxx> |
| #include <drawinglayer/primitive2d/epsprimitive2d.hxx> |
| #include <drawinglayer/primitive2d/svggradientprimitive2d.hxx> |
| #include <toolkit/helper/vclunohelper.hxx> |
| #include <vcl/window.hxx> |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| using namespace com::sun::star; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| namespace drawinglayer |
| { |
| namespace processor2d |
| { |
| VclPixelProcessor2D::VclPixelProcessor2D(const geometry::ViewInformation2D& rViewInformation, OutputDevice& rOutDev) |
| : VclProcessor2D(rViewInformation, rOutDev) |
| { |
| // prepare maCurrentTransformation matrix with viewTransformation to target directly to pixels |
| maCurrentTransformation = rViewInformation.getObjectToViewTransformation(); |
| |
| // prepare output directly to pixels |
| mpOutputDevice->Push(PUSH_MAPMODE); |
| mpOutputDevice->SetMapMode(); |
| |
| // react on AntiAliasing settings |
| if(getOptionsDrawinglayer().IsAntiAliasing()) |
| { |
| mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing() | ANTIALIASING_ENABLE_B2DDRAW); |
| } |
| else |
| { |
| mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing() & ~ANTIALIASING_ENABLE_B2DDRAW); |
| } |
| } |
| |
| VclPixelProcessor2D::~VclPixelProcessor2D() |
| { |
| // restore MapMode |
| mpOutputDevice->Pop(); |
| |
| // restore AntiAliasing |
| mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing() & ~ANTIALIASING_ENABLE_B2DDRAW); |
| } |
| |
| void VclPixelProcessor2D::processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate) |
| { |
| switch(rCandidate.getPrimitive2DID()) |
| { |
| case PRIMITIVE2D_ID_WRONGSPELLPRIMITIVE2D : |
| { |
| // directdraw of wrong spell primitive; added test possibility to check wrong spell decompose |
| static bool bHandleWrongSpellDirectly(true); |
| |
| if(bHandleWrongSpellDirectly) |
| { |
| const primitive2d::WrongSpellPrimitive2D& rWrongSpellPrimitive = static_cast< const primitive2d::WrongSpellPrimitive2D& >(rCandidate); |
| |
| if(!renderWrongSpellPrimitive2D( |
| rWrongSpellPrimitive, |
| *mpOutputDevice, |
| maCurrentTransformation, |
| maBColorModifierStack)) |
| { |
| // fallback to decomposition (MetaFile) |
| process(rWrongSpellPrimitive.get2DDecomposition(getViewInformation2D())); |
| } |
| } |
| else |
| { |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| } |
| break; |
| } |
| case PRIMITIVE2D_ID_TEXTSIMPLEPORTIONPRIMITIVE2D : |
| { |
| // directdraw of text simple portion; added test possibility to check text decompose |
| static bool bForceSimpleTextDecomposition(false); |
| |
| // Adapt evtl. used special DrawMode |
| const sal_uInt32 nOriginalDrawMode(mpOutputDevice->GetDrawMode()); |
| adaptTextToFillDrawMode(); |
| |
| if(!bForceSimpleTextDecomposition && getOptionsDrawinglayer().IsRenderSimpleTextDirect()) |
| { |
| RenderTextSimpleOrDecoratedPortionPrimitive2D(static_cast< const primitive2d::TextSimplePortionPrimitive2D& >(rCandidate)); |
| } |
| else |
| { |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| } |
| |
| // restore DrawMode |
| mpOutputDevice->SetDrawMode(nOriginalDrawMode); |
| |
| break; |
| } |
| case PRIMITIVE2D_ID_TEXTDECORATEDPORTIONPRIMITIVE2D : |
| { |
| // directdraw of text simple portion; added test possibility to check text decompose |
| static bool bForceComplexTextDecomposition(false); |
| |
| // Adapt evtl. used special DrawMode |
| const sal_uInt32 nOriginalDrawMode(mpOutputDevice->GetDrawMode()); |
| adaptTextToFillDrawMode(); |
| |
| if(!bForceComplexTextDecomposition && getOptionsDrawinglayer().IsRenderDecoratedTextDirect()) |
| { |
| RenderTextSimpleOrDecoratedPortionPrimitive2D(static_cast< const primitive2d::TextSimplePortionPrimitive2D& >(rCandidate)); |
| } |
| else |
| { |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| } |
| |
| // restore DrawMode |
| mpOutputDevice->SetDrawMode(nOriginalDrawMode); |
| |
| break; |
| } |
| case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D : |
| { |
| // direct draw of hairline |
| RenderPolygonHairlinePrimitive2D(static_cast< const primitive2d::PolygonHairlinePrimitive2D& >(rCandidate), true); |
| break; |
| } |
| case PRIMITIVE2D_ID_BITMAPPRIMITIVE2D : |
| { |
| // direct draw of transformed BitmapEx primitive |
| RenderBitmapPrimitive2D(static_cast< const primitive2d::BitmapPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_FILLBITMAPPRIMITIVE2D : |
| { |
| // direct draw of fillBitmapPrimitive |
| RenderFillBitmapPrimitive2D(static_cast< const primitive2d::FillBitmapPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_POLYPOLYGONGRADIENTPRIMITIVE2D : |
| { |
| // direct draw of gradient |
| RenderPolyPolygonGradientPrimitive2D(static_cast< const primitive2d::PolyPolygonGradientPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_POLYPOLYGONBITMAPPRIMITIVE2D : |
| { |
| // direct draw of bitmap |
| RenderPolyPolygonBitmapPrimitive2D(static_cast< const primitive2d::PolyPolygonBitmapPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D : |
| { |
| // direct draw of PolyPolygon with color |
| RenderPolyPolygonColorPrimitive2D(static_cast< const primitive2d::PolyPolygonColorPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_METAFILEPRIMITIVE2D : |
| { |
| // #i98289# |
| const bool bForceLineSnap(getOptionsDrawinglayer().IsAntiAliasing() && getOptionsDrawinglayer().IsSnapHorVerLinesToDiscrete()); |
| const sal_uInt16 nOldAntiAliase(mpOutputDevice->GetAntialiasing()); |
| |
| if(bForceLineSnap) |
| { |
| mpOutputDevice->SetAntialiasing(nOldAntiAliase | ANTIALIASING_PIXELSNAPHAIRLINE); |
| } |
| |
| static bool bTestMetaFilePrimitiveDecomposition(true); |
| if(bTestMetaFilePrimitiveDecomposition) |
| { |
| // use new Metafile decomposition |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| } |
| else |
| { |
| // direct draw of MetaFile |
| RenderMetafilePrimitive2D(static_cast< const primitive2d::MetafilePrimitive2D& >(rCandidate)); |
| } |
| |
| if(bForceLineSnap) |
| { |
| mpOutputDevice->SetAntialiasing(nOldAntiAliase); |
| } |
| |
| break; |
| } |
| case PRIMITIVE2D_ID_MASKPRIMITIVE2D : |
| { |
| // mask group. |
| RenderMaskPrimitive2DPixel(static_cast< const primitive2d::MaskPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_MODIFIEDCOLORPRIMITIVE2D : |
| { |
| // modified color group. Force output to unified color. |
| RenderModifiedColorPrimitive2D(static_cast< const primitive2d::ModifiedColorPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_UNIFIEDTRANSPARENCEPRIMITIVE2D : |
| { |
| // Detect if a single PolyPolygonColorPrimitive2D is contained; in that case, |
| // use the faster OutputDevice::DrawTransparent method |
| const primitive2d::UnifiedTransparencePrimitive2D& rUniTransparenceCandidate = static_cast< const primitive2d::UnifiedTransparencePrimitive2D& >(rCandidate); |
| const primitive2d::Primitive2DSequence rContent = rUniTransparenceCandidate.getChildren(); |
| |
| if(rContent.hasElements()) |
| { |
| if(0.0 == rUniTransparenceCandidate.getTransparence()) |
| { |
| // not transparent at all, use content |
| process(rUniTransparenceCandidate.getChildren()); |
| } |
| else if(rUniTransparenceCandidate.getTransparence() > 0.0 && rUniTransparenceCandidate.getTransparence() < 1.0) |
| { |
| bool bDrawTransparentUsed(false); |
| |
| // since DEV300 m33 DrawTransparent is supported in VCL (for some targets |
| // natively), so i am now enabling this shortcut |
| static bool bAllowUsingDrawTransparent(true); |
| |
| if(bAllowUsingDrawTransparent && 1 == rContent.getLength()) |
| { |
| const primitive2d::Primitive2DReference xReference(rContent[0]); |
| const primitive2d::BasePrimitive2D* pBasePrimitive = dynamic_cast< const primitive2d::BasePrimitive2D* >(xReference.get()); |
| |
| if(pBasePrimitive) |
| { |
| switch(pBasePrimitive->getPrimitive2DID()) |
| { |
| case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D: |
| { |
| // single transparent PolyPolygon identified, use directly |
| const primitive2d::PolyPolygonColorPrimitive2D* pPoPoColor = static_cast< const primitive2d::PolyPolygonColorPrimitive2D* >(pBasePrimitive); |
| OSL_ENSURE(pPoPoColor, "OOps, PrimitiveID and PrimitiveType do not match (!)"); |
| const basegfx::BColor aPolygonColor(maBColorModifierStack.getModifiedColor(pPoPoColor->getBColor())); |
| mpOutputDevice->SetFillColor(Color(aPolygonColor)); |
| mpOutputDevice->SetLineColor(); |
| |
| basegfx::B2DPolyPolygon aLocalPolyPolygon(pPoPoColor->getB2DPolyPolygon()); |
| aLocalPolyPolygon.transform(maCurrentTransformation); |
| |
| mpOutputDevice->DrawTransparent(aLocalPolyPolygon, rUniTransparenceCandidate.getTransparence()); |
| bDrawTransparentUsed = true; |
| break; |
| } |
| // #i# need to wait for #i101378# which is in CWS vcl112 to directly paint transparent hairlines |
| //case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D: |
| //{ |
| // // single transparent PolygonHairlinePrimitive2D identified, use directly |
| // const primitive2d::PolygonHairlinePrimitive2D* pPoHair = static_cast< const primitive2d::PolygonHairlinePrimitive2D* >(pBasePrimitive); |
| // OSL_ENSURE(pPoHair, "OOps, PrimitiveID and PrimitiveType do not match (!)"); |
| // break; |
| //} |
| } |
| } |
| } |
| |
| if(!bDrawTransparentUsed) |
| { |
| // unified sub-transparence. Draw to VDev first. |
| RenderUnifiedTransparencePrimitive2D(rUniTransparenceCandidate); |
| } |
| } |
| } |
| |
| break; |
| } |
| case PRIMITIVE2D_ID_TRANSPARENCEPRIMITIVE2D : |
| { |
| // sub-transparence group. Draw to VDev first. |
| RenderTransparencePrimitive2D(static_cast< const primitive2d::TransparencePrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_TRANSFORMPRIMITIVE2D : |
| { |
| // transform group. |
| RenderTransformPrimitive2D(static_cast< const primitive2d::TransformPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_PAGEPREVIEWPRIMITIVE2D : |
| { |
| // new XDrawPage for ViewInformation2D |
| RenderPagePreviewPrimitive2D(static_cast< const primitive2d::PagePreviewPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_MARKERARRAYPRIMITIVE2D : |
| { |
| // marker array |
| RenderMarkerArrayPrimitive2D(static_cast< const primitive2d::MarkerArrayPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_POINTARRAYPRIMITIVE2D : |
| { |
| // point array |
| RenderPointArrayPrimitive2D(static_cast< const primitive2d::PointArrayPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_CONTROLPRIMITIVE2D : |
| { |
| // control primitive |
| const primitive2d::ControlPrimitive2D& rControlPrimitive = static_cast< const primitive2d::ControlPrimitive2D& >(rCandidate); |
| const uno::Reference< awt::XControl >& rXControl(rControlPrimitive.getXControl()); |
| |
| try |
| { |
| // remember old graphics and create new |
| uno::Reference< awt::XView > xControlView(rXControl, uno::UNO_QUERY_THROW); |
| const uno::Reference< awt::XGraphics > xOriginalGraphics(xControlView->getGraphics()); |
| const uno::Reference< awt::XGraphics > xNewGraphics(mpOutputDevice->CreateUnoGraphics()); |
| |
| if(xNewGraphics.is()) |
| { |
| // link graphics and view |
| xControlView->setGraphics(xNewGraphics); |
| |
| // get position |
| const basegfx::B2DHomMatrix aObjectToPixel(maCurrentTransformation * rControlPrimitive.getTransform()); |
| const basegfx::B2DPoint aTopLeftPixel(aObjectToPixel * basegfx::B2DPoint(0.0, 0.0)); |
| |
| // find out if the control is already visualized as a VCL-ChildWindow. If yes, |
| // it does not need to be painted at all. |
| uno::Reference< awt::XWindow2 > xControlWindow(rXControl, uno::UNO_QUERY_THROW); |
| const bool bControlIsVisibleAsChildWindow(rXControl->getPeer().is() && xControlWindow->isVisible()); |
| |
| if(!bControlIsVisibleAsChildWindow) |
| { |
| // draw it. Do not forget to use the evtl. offsetted origin of the target device, |
| // e.g. when used with mask/transparence buffer device |
| const Point aOrigin(mpOutputDevice->GetMapMode().GetOrigin()); |
| xControlView->draw( |
| aOrigin.X() + basegfx::fround(aTopLeftPixel.getX()), |
| aOrigin.Y() + basegfx::fround(aTopLeftPixel.getY())); |
| } |
| |
| // restore original graphics |
| xControlView->setGraphics(xOriginalGraphics); |
| } |
| } |
| catch(const uno::Exception&) |
| { |
| // #i116763# removing since there is a good alternative when the xControlView |
| // is not found and it is allowed to happen |
| // DBG_UNHANDLED_EXCEPTION(); |
| |
| // process recursively and use the decomposition as Bitmap |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| } |
| |
| break; |
| } |
| case PRIMITIVE2D_ID_POLYGONSTROKEPRIMITIVE2D: |
| { |
| // the stroke primitive may be decomposed to filled polygons. To keep |
| // evtl. set DrawModes aka DRAWMODE_BLACKLINE, DRAWMODE_GRAYLINE, |
| // DRAWMODE_GHOSTEDLINE, DRAWMODE_WHITELINE or DRAWMODE_SETTINGSLINE |
| // working, these need to be copied to the corresponding fill modes |
| const sal_uInt32 nOriginalDrawMode(mpOutputDevice->GetDrawMode()); |
| adaptLineToFillDrawMode(); |
| |
| // polygon stroke primitive |
| static bool bSuppressFatToHairlineCorrection(false); |
| |
| if(bSuppressFatToHairlineCorrection) |
| { |
| // remeber that we enter a PolygonStrokePrimitive2D decomposition, |
| // used for AA thick line drawing |
| mnPolygonStrokePrimitive2D++; |
| |
| // with AA there is no need to handle thin lines special |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| |
| // leave PolygonStrokePrimitive2D |
| mnPolygonStrokePrimitive2D--; |
| } |
| else |
| { |
| // Lines with 1 and 2 pixel width without AA need special treatment since their vsiualisation |
| // as filled polygons is geometrically corret but looks wrong since polygon filling avoids |
| // the right and bottom pixels. The used method evaluates that and takes the correct action, |
| // including calling recursively with decomposition if line is wide enough |
| const primitive2d::PolygonStrokePrimitive2D& rPolygonStrokePrimitive = static_cast< const primitive2d::PolygonStrokePrimitive2D& >(rCandidate); |
| |
| RenderPolygonStrokePrimitive2D(rPolygonStrokePrimitive); |
| } |
| |
| // restore DrawMode |
| mpOutputDevice->SetDrawMode(nOriginalDrawMode); |
| |
| break; |
| } |
| case PRIMITIVE2D_ID_FILLHATCHPRIMITIVE2D : |
| { |
| static bool bForceIgnoreHatchSmoothing(false); |
| |
| if(bForceIgnoreHatchSmoothing || getOptionsDrawinglayer().IsAntiAliasing()) |
| { |
| // if AA is used (or ignore smoothing is on), there is no need to smooth |
| // hatch painting, use decomposition |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| } |
| else |
| { |
| // without AA, use VCL to draw the hatch. It snaps hatch distances to the next pixel |
| // and forces hatch distance to be >= 3 pixels to make the hatch display look smoother. |
| // This is wrong in principle, but looks nicer. This could also be done here directly |
| // without VCL usage if needed |
| const primitive2d::FillHatchPrimitive2D& rFillHatchPrimitive = static_cast< const primitive2d::FillHatchPrimitive2D& >(rCandidate); |
| const attribute::FillHatchAttribute& rFillHatchAttributes = rFillHatchPrimitive.getFillHatch(); |
| |
| // create hatch polygon in range size and discrete coordinates |
| basegfx::B2DRange aHatchRange(rFillHatchPrimitive.getObjectRange()); |
| aHatchRange.transform(maCurrentTransformation); |
| const basegfx::B2DPolygon aHatchPolygon(basegfx::tools::createPolygonFromRect(aHatchRange)); |
| |
| if(rFillHatchAttributes.isFillBackground()) |
| { |
| // #i111846# background fill is active; draw fill polygon |
| const basegfx::BColor aPolygonColor(maBColorModifierStack.getModifiedColor(rFillHatchPrimitive.getBColor())); |
| |
| mpOutputDevice->SetFillColor(Color(aPolygonColor)); |
| mpOutputDevice->SetLineColor(); |
| mpOutputDevice->DrawPolygon(aHatchPolygon); |
| } |
| |
| // set hatch line color |
| const basegfx::BColor aHatchColor(maBColorModifierStack.getModifiedColor(rFillHatchPrimitive.getBColor())); |
| mpOutputDevice->SetFillColor(); |
| mpOutputDevice->SetLineColor(Color(aHatchColor)); |
| |
| // get hatch style |
| HatchStyle eHatchStyle(HATCH_SINGLE); |
| |
| switch(rFillHatchAttributes.getStyle()) |
| { |
| default : // HATCHSTYLE_SINGLE |
| { |
| break; |
| } |
| case attribute::HATCHSTYLE_DOUBLE : |
| { |
| eHatchStyle = HATCH_DOUBLE; |
| break; |
| } |
| case attribute::HATCHSTYLE_TRIPLE : |
| { |
| eHatchStyle = HATCH_TRIPLE; |
| break; |
| } |
| } |
| |
| // create hatch |
| const basegfx::B2DVector aDiscreteDistance(maCurrentTransformation * basegfx::B2DVector(rFillHatchAttributes.getDistance(), 0.0)); |
| const sal_uInt32 nDistance(basegfx::fround(aDiscreteDistance.getLength())); |
| const sal_uInt16 nAngle10((sal_uInt16)basegfx::fround(rFillHatchAttributes.getAngle() / F_PI1800)); |
| ::Hatch aVCLHatch(eHatchStyle, Color(rFillHatchAttributes.getColor()), nDistance, nAngle10); |
| |
| // draw hatch using VCL |
| mpOutputDevice->DrawHatch(PolyPolygon(Polygon(aHatchPolygon)), aVCLHatch); |
| } |
| break; |
| } |
| case PRIMITIVE2D_ID_BACKGROUNDCOLORPRIMITIVE2D : |
| { |
| // #i98404# Handle directly, especially when AA is active |
| const primitive2d::BackgroundColorPrimitive2D& rPrimitive = static_cast< const primitive2d::BackgroundColorPrimitive2D& >(rCandidate); |
| const sal_uInt16 nOriginalAA(mpOutputDevice->GetAntialiasing()); |
| |
| // switch AA off in all cases |
| mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing() & ~ANTIALIASING_ENABLE_B2DDRAW); |
| |
| // create color for fill |
| const basegfx::BColor aPolygonColor(maBColorModifierStack.getModifiedColor(rPrimitive.getBColor())); |
| mpOutputDevice->SetFillColor(Color(aPolygonColor)); |
| mpOutputDevice->SetLineColor(); |
| |
| // create rectangle for fill |
| const basegfx::B2DRange& aViewport(getViewInformation2D().getDiscreteViewport()); |
| const Rectangle aRectangle( |
| (sal_Int32)floor(aViewport.getMinX()), (sal_Int32)floor(aViewport.getMinY()), |
| (sal_Int32)ceil(aViewport.getMaxX()), (sal_Int32)ceil(aViewport.getMaxY())); |
| mpOutputDevice->DrawRect(aRectangle); |
| |
| // restore AA setting |
| mpOutputDevice->SetAntialiasing(nOriginalAA); |
| break; |
| } |
| case PRIMITIVE2D_ID_TEXTHIERARCHYEDITPRIMITIVE2D : |
| { |
| // #i97628# |
| // This primitive means that the content is derived from an active text edit, |
| // not from model data itself. Some renderers need to suppress this content, e.g. |
| // the pixel renderer used for displaying the edit view (like this one). It's |
| // not to be suppressed by the MetaFile renderers, so that the edited text is |
| // part of the MetaFile, e.g. needed for presentation previews. |
| // Action: Ignore here, do nothing. |
| break; |
| } |
| case PRIMITIVE2D_ID_INVERTPRIMITIVE2D : |
| { |
| // invert primitive (currently only used for HighContrast fallback for selection in SW and SC). |
| // Set OutDev to XOR and switch AA off (XOR does not work with AA) |
| mpOutputDevice->Push(); |
| mpOutputDevice->SetRasterOp( ROP_XOR ); |
| const sal_uInt16 nAntiAliasing(mpOutputDevice->GetAntialiasing()); |
| mpOutputDevice->SetAntialiasing(nAntiAliasing & ~ANTIALIASING_ENABLE_B2DDRAW); |
| |
| // process content recursively |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| |
| // restore OutDev |
| mpOutputDevice->Pop(); |
| mpOutputDevice->SetAntialiasing(nAntiAliasing); |
| break; |
| } |
| case PRIMITIVE2D_ID_EPSPRIMITIVE2D : |
| { |
| RenderEpsPrimitive2D(static_cast< const primitive2d::EpsPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_SVGLINEARATOMPRIMITIVE2D: |
| { |
| RenderSvgLinearAtomPrimitive2D(static_cast< const primitive2d::SvgLinearAtomPrimitive2D& >(rCandidate)); |
| break; |
| } |
| case PRIMITIVE2D_ID_SVGRADIALATOMPRIMITIVE2D: |
| { |
| RenderSvgRadialAtomPrimitive2D(static_cast< const primitive2d::SvgRadialAtomPrimitive2D& >(rCandidate)); |
| break; |
| } |
| default : |
| { |
| // process recursively |
| process(rCandidate.get2DDecomposition(getViewInformation2D())); |
| break; |
| } |
| } |
| } |
| } // end of namespace processor2d |
| } // end of namespace drawinglayer |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| // eof |