1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_drawinglayer.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/wrongspellprimitive2d.hxx> 28*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx> 29*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polygonprimitive2d.hxx> 30*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> 31*b1cdbd2cSJim Jagielski #include <drawinglayer/geometry/viewinformation2d.hxx> 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski namespace drawinglayer 36*b1cdbd2cSJim Jagielski { 37*b1cdbd2cSJim Jagielski namespace primitive2d 38*b1cdbd2cSJim Jagielski { create2DDecomposition(const geometry::ViewInformation2D &) const39*b1cdbd2cSJim Jagielski Primitive2DSequence WrongSpellPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const 40*b1cdbd2cSJim Jagielski { 41*b1cdbd2cSJim Jagielski // ATM this decompose is view-independent, what the original VCL-Display is not. To mimic 42*b1cdbd2cSJim Jagielski // the old behaviour here if wanted it is necessary to add get2DDecomposition and implement 43*b1cdbd2cSJim Jagielski // it similar to the usage in e.g. HelplinePrimitive2D. Remembering the ViewTransformation 44*b1cdbd2cSJim Jagielski // should be enough then. 45*b1cdbd2cSJim Jagielski // The view-independent wavelines work well (if You ask me). Maybe the old VCL-Behaviour is only 46*b1cdbd2cSJim Jagielski // in place because it was not possible/too expensive at that time to scale the wavelines with the 47*b1cdbd2cSJim Jagielski // view... 48*b1cdbd2cSJim Jagielski // With the VCL-PixelRenderer this will not even be used since it implements WrongSpellPrimitive2D 49*b1cdbd2cSJim Jagielski // directly and mimics the old VCL-Display there. If You implemented a new renderer without 50*b1cdbd2cSJim Jagielski // direct WrongSpellPrimitive2D support, You may want to do the described change here. 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski // get the font height (part of scale), so decompose the matrix 53*b1cdbd2cSJim Jagielski basegfx::B2DVector aScale, aTranslate; 54*b1cdbd2cSJim Jagielski double fRotate, fShearX; 55*b1cdbd2cSJim Jagielski getTransformation().decompose(aScale, aTranslate, fRotate, fShearX); 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski // calculate distances based on a static default (to allow testing in debugger) 58*b1cdbd2cSJim Jagielski static double fDefaultDistance(0.03); 59*b1cdbd2cSJim Jagielski const double fFontHeight(aScale.getY()); 60*b1cdbd2cSJim Jagielski const double fUnderlineDistance(fFontHeight * fDefaultDistance); 61*b1cdbd2cSJim Jagielski const double fWaveWidth(2.0 * fUnderlineDistance); 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski // the Y-distance needs to be relativated to FontHeight since the points get 64*b1cdbd2cSJim Jagielski // transformed with the transformation containing that scale already. 65*b1cdbd2cSJim Jagielski const double fRelativeUnderlineDistance(basegfx::fTools::equalZero(aScale.getY()) ? 0.0 : fUnderlineDistance / aScale.getY()); 66*b1cdbd2cSJim Jagielski basegfx::B2DPoint aStart(getStart(), fRelativeUnderlineDistance); 67*b1cdbd2cSJim Jagielski basegfx::B2DPoint aStop(getStop(), fRelativeUnderlineDistance); 68*b1cdbd2cSJim Jagielski basegfx::B2DPolygon aPolygon; 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski aPolygon.append(getTransformation() * aStart); 71*b1cdbd2cSJim Jagielski aPolygon.append(getTransformation() * aStop); 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski // prepare line attribute 74*b1cdbd2cSJim Jagielski const attribute::LineAttribute aLineAttribute(getColor()); 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski // create the waveline primitive 77*b1cdbd2cSJim Jagielski Primitive2DReference xPrimitive(new PolygonWavePrimitive2D(aPolygon, aLineAttribute, fWaveWidth, 0.5 * fWaveWidth)); 78*b1cdbd2cSJim Jagielski Primitive2DSequence xRetval(&xPrimitive, 1); 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski return xRetval; 81*b1cdbd2cSJim Jagielski } 82*b1cdbd2cSJim Jagielski WrongSpellPrimitive2D(const basegfx::B2DHomMatrix & rTransformation,double fStart,double fStop,const basegfx::BColor & rColor)83*b1cdbd2cSJim Jagielski WrongSpellPrimitive2D::WrongSpellPrimitive2D( 84*b1cdbd2cSJim Jagielski const basegfx::B2DHomMatrix& rTransformation, 85*b1cdbd2cSJim Jagielski double fStart, 86*b1cdbd2cSJim Jagielski double fStop, 87*b1cdbd2cSJim Jagielski const basegfx::BColor& rColor) 88*b1cdbd2cSJim Jagielski : BufferedDecompositionPrimitive2D(), 89*b1cdbd2cSJim Jagielski maTransformation(rTransformation), 90*b1cdbd2cSJim Jagielski mfStart(fStart), 91*b1cdbd2cSJim Jagielski mfStop(fStop), 92*b1cdbd2cSJim Jagielski maColor(rColor) 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski } 95*b1cdbd2cSJim Jagielski operator ==(const BasePrimitive2D & rPrimitive) const96*b1cdbd2cSJim Jagielski bool WrongSpellPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const 97*b1cdbd2cSJim Jagielski { 98*b1cdbd2cSJim Jagielski if(BufferedDecompositionPrimitive2D::operator==(rPrimitive)) 99*b1cdbd2cSJim Jagielski { 100*b1cdbd2cSJim Jagielski const WrongSpellPrimitive2D& rCompare = (WrongSpellPrimitive2D&)rPrimitive; 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski return (getTransformation() == rCompare.getTransformation() 103*b1cdbd2cSJim Jagielski && getStart() == rCompare.getStart() 104*b1cdbd2cSJim Jagielski && getStop() == rCompare.getStop() 105*b1cdbd2cSJim Jagielski && getColor() == rCompare.getColor()); 106*b1cdbd2cSJim Jagielski } 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski return false; 109*b1cdbd2cSJim Jagielski } 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski // provide unique ID 112*b1cdbd2cSJim Jagielski ImplPrimitrive2DIDBlock(WrongSpellPrimitive2D, PRIMITIVE2D_ID_WRONGSPELLPRIMITIVE2D) 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski } // end of namespace primitive2d 115*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 118*b1cdbd2cSJim Jagielski // eof 119