1*464702f4SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*464702f4SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*464702f4SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*464702f4SAndrew Rist * distributed with this work for additional information 6*464702f4SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*464702f4SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*464702f4SAndrew Rist * "License"); you may not use this file except in compliance 9*464702f4SAndrew Rist * with the License. You may obtain a copy of the License at 10*464702f4SAndrew Rist * 11*464702f4SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*464702f4SAndrew Rist * 13*464702f4SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*464702f4SAndrew Rist * software distributed under the License is distributed on an 15*464702f4SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*464702f4SAndrew Rist * KIND, either express or implied. See the License for the 17*464702f4SAndrew Rist * specific language governing permissions and limitations 18*464702f4SAndrew Rist * under the License. 19*464702f4SAndrew Rist * 20*464702f4SAndrew Rist *************************************************************/ 21*464702f4SAndrew Rist 22*464702f4SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_drawinglayer.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <drawinglayer/primitive2d/mediaprimitive2d.hxx> 28cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx> 29cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx> 30cdf0e10cSrcweir #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> 31cdf0e10cSrcweir #include <avmedia/mediawindow.hxx> 32cdf0e10cSrcweir #include <svtools/grfmgr.hxx> 33cdf0e10cSrcweir #include <drawinglayer/primitive2d/graphicprimitive2d.hxx> 34cdf0e10cSrcweir #include <drawinglayer/geometry/viewinformation2d.hxx> 35cdf0e10cSrcweir #include <drawinglayer/primitive2d/transformprimitive2d.hxx> 36cdf0e10cSrcweir #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> 37cdf0e10cSrcweir #include <drawinglayer/primitive2d/hiddengeometryprimitive2d.hxx> 38cdf0e10cSrcweir 39cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 40cdf0e10cSrcweir 41cdf0e10cSrcweir namespace drawinglayer 42cdf0e10cSrcweir { 43cdf0e10cSrcweir namespace primitive2d 44cdf0e10cSrcweir { create2DDecomposition(const geometry::ViewInformation2D & rViewInformation) const45cdf0e10cSrcweir Primitive2DSequence MediaPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const 46cdf0e10cSrcweir { 47cdf0e10cSrcweir Primitive2DSequence xRetval(1); 48cdf0e10cSrcweir 49cdf0e10cSrcweir // create background object 50cdf0e10cSrcweir basegfx::B2DPolygon aBackgroundPolygon(basegfx::tools::createUnitPolygon()); 51cdf0e10cSrcweir aBackgroundPolygon.transform(getTransform()); 52cdf0e10cSrcweir const Primitive2DReference xRefBackground( 53cdf0e10cSrcweir new PolyPolygonColorPrimitive2D( 54cdf0e10cSrcweir basegfx::B2DPolyPolygon(aBackgroundPolygon), 55cdf0e10cSrcweir getBackgroundColor())); 56cdf0e10cSrcweir xRetval[0] = xRefBackground; 57cdf0e10cSrcweir 58cdf0e10cSrcweir // try to get graphic snapshot 59cdf0e10cSrcweir const Graphic aGraphic(avmedia::MediaWindow::grabFrame(getURL(), true)); 60cdf0e10cSrcweir 61cdf0e10cSrcweir if(GRAPHIC_BITMAP == aGraphic.GetType() || GRAPHIC_GDIMETAFILE == aGraphic.GetType()) 62cdf0e10cSrcweir { 63cdf0e10cSrcweir const GraphicObject aGraphicObject(aGraphic); 64cdf0e10cSrcweir const GraphicAttr aGraphicAttr; 65cdf0e10cSrcweir xRetval.realloc(2); 66cdf0e10cSrcweir xRetval[0] = xRefBackground; 67cdf0e10cSrcweir xRetval[1] = Primitive2DReference(new GraphicPrimitive2D(getTransform(), aGraphicObject, aGraphicAttr)); 68cdf0e10cSrcweir } 69cdf0e10cSrcweir 70cdf0e10cSrcweir if(getDiscreteBorder()) 71cdf0e10cSrcweir { 72cdf0e10cSrcweir const basegfx::B2DVector aDiscreteInLogic(rViewInformation.getInverseObjectToViewTransformation() * 73cdf0e10cSrcweir basegfx::B2DVector((double)getDiscreteBorder(), (double)getDiscreteBorder())); 74cdf0e10cSrcweir const double fDiscreteSize(aDiscreteInLogic.getX() + aDiscreteInLogic.getY()); 75cdf0e10cSrcweir 76cdf0e10cSrcweir basegfx::B2DRange aSourceRange(0.0, 0.0, 1.0, 1.0); 77cdf0e10cSrcweir aSourceRange.transform(getTransform()); 78cdf0e10cSrcweir 79cdf0e10cSrcweir basegfx::B2DRange aDestRange(aSourceRange); 80cdf0e10cSrcweir aDestRange.grow(-0.5 * fDiscreteSize); 81cdf0e10cSrcweir 82cdf0e10cSrcweir if(basegfx::fTools::equalZero(aDestRange.getWidth()) || basegfx::fTools::equalZero(aDestRange.getHeight())) 83cdf0e10cSrcweir { 84cdf0e10cSrcweir // shrunk primitive has no content (zero size in X or Y), nothing to display. Still create 85cdf0e10cSrcweir // invisible content for HitTest and BoundRect 86cdf0e10cSrcweir const Primitive2DReference xHiddenLines(new HiddenGeometryPrimitive2D(xRetval)); 87cdf0e10cSrcweir 88cdf0e10cSrcweir xRetval = Primitive2DSequence(&xHiddenLines, 1); 89cdf0e10cSrcweir } 90cdf0e10cSrcweir else 91cdf0e10cSrcweir { 92cdf0e10cSrcweir // create transformation matrix from original range to shrunk range 93cdf0e10cSrcweir basegfx::B2DHomMatrix aTransform; 94cdf0e10cSrcweir aTransform.translate(-aSourceRange.getMinX(), -aSourceRange.getMinY()); 95cdf0e10cSrcweir aTransform.scale(aDestRange.getWidth() / aSourceRange.getWidth(), aDestRange.getHeight() / aSourceRange.getHeight()); 96cdf0e10cSrcweir aTransform.translate(aDestRange.getMinX(), aDestRange.getMinY()); 97cdf0e10cSrcweir 98cdf0e10cSrcweir // add transform primitive 99cdf0e10cSrcweir const Primitive2DReference aScaled(new TransformPrimitive2D(aTransform, xRetval)); 100cdf0e10cSrcweir xRetval = Primitive2DSequence(&aScaled, 1L); 101cdf0e10cSrcweir } 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir return xRetval; 105cdf0e10cSrcweir } 106cdf0e10cSrcweir MediaPrimitive2D(const basegfx::B2DHomMatrix & rTransform,const rtl::OUString & rURL,const basegfx::BColor & rBackgroundColor,sal_uInt32 nDiscreteBorder)107cdf0e10cSrcweir MediaPrimitive2D::MediaPrimitive2D( 108cdf0e10cSrcweir const basegfx::B2DHomMatrix& rTransform, 109cdf0e10cSrcweir const rtl::OUString& rURL, 110cdf0e10cSrcweir const basegfx::BColor& rBackgroundColor, 111cdf0e10cSrcweir sal_uInt32 nDiscreteBorder) 112cdf0e10cSrcweir : BufferedDecompositionPrimitive2D(), 113cdf0e10cSrcweir maTransform(rTransform), 114cdf0e10cSrcweir maURL(rURL), 115cdf0e10cSrcweir maBackgroundColor(rBackgroundColor), 116cdf0e10cSrcweir mnDiscreteBorder(nDiscreteBorder) 117cdf0e10cSrcweir { 118cdf0e10cSrcweir } 119cdf0e10cSrcweir operator ==(const BasePrimitive2D & rPrimitive) const120cdf0e10cSrcweir bool MediaPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const 121cdf0e10cSrcweir { 122cdf0e10cSrcweir if(BufferedDecompositionPrimitive2D::operator==(rPrimitive)) 123cdf0e10cSrcweir { 124cdf0e10cSrcweir const MediaPrimitive2D& rCompare = (MediaPrimitive2D&)rPrimitive; 125cdf0e10cSrcweir 126cdf0e10cSrcweir return (getTransform() == rCompare.getTransform() 127cdf0e10cSrcweir && getURL() == rCompare.getURL() 128cdf0e10cSrcweir && getBackgroundColor() == rCompare.getBackgroundColor() 129cdf0e10cSrcweir && getDiscreteBorder() == rCompare.getDiscreteBorder()); 130cdf0e10cSrcweir } 131cdf0e10cSrcweir 132cdf0e10cSrcweir return false; 133cdf0e10cSrcweir } 134cdf0e10cSrcweir getB2DRange(const geometry::ViewInformation2D & rViewInformation) const135cdf0e10cSrcweir basegfx::B2DRange MediaPrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const 136cdf0e10cSrcweir { 137cdf0e10cSrcweir basegfx::B2DRange aRetval(0.0, 0.0, 1.0, 1.0); 138cdf0e10cSrcweir aRetval.transform(getTransform()); 139cdf0e10cSrcweir 140cdf0e10cSrcweir if(getDiscreteBorder()) 141cdf0e10cSrcweir { 142cdf0e10cSrcweir const basegfx::B2DVector aDiscreteInLogic(rViewInformation.getInverseObjectToViewTransformation() * 143cdf0e10cSrcweir basegfx::B2DVector((double)getDiscreteBorder(), (double)getDiscreteBorder())); 144cdf0e10cSrcweir const double fDiscreteSize(aDiscreteInLogic.getX() + aDiscreteInLogic.getY()); 145cdf0e10cSrcweir 146cdf0e10cSrcweir aRetval.grow(-0.5 * fDiscreteSize); 147cdf0e10cSrcweir } 148cdf0e10cSrcweir 149cdf0e10cSrcweir return aRetval; 150cdf0e10cSrcweir } 151cdf0e10cSrcweir 152cdf0e10cSrcweir // provide unique ID 153cdf0e10cSrcweir ImplPrimitrive2DIDBlock(MediaPrimitive2D, PRIMITIVE2D_ID_MEDIAPRIMITIVE2D) 154cdf0e10cSrcweir 155cdf0e10cSrcweir } // end of namespace primitive2d 156cdf0e10cSrcweir } // end of namespace drawinglayer 157cdf0e10cSrcweir 158cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 159cdf0e10cSrcweir // eof 160