diff options
author | Armin Weiss <aw@openoffice.org> | 2007-09-20 08:51:46 +0000 |
---|---|---|
committer | Armin Weiss <aw@openoffice.org> | 2007-09-20 08:51:46 +0000 |
commit | e7ca5458fe9b87768206d1a653b5d0ff60acbf95 (patch) | |
tree | 54aacd5404deda18ed882d3efce3a34093557a9c /drawinglayer/source/primitive2d | |
parent | d100845363f2d71b8b9d0d7375ad4a1fbec2be80 (diff) |
#i39532# Waveline usage, tuning text primitive
Diffstat (limited to 'drawinglayer/source/primitive2d')
4 files changed, 318 insertions, 53 deletions
diff --git a/drawinglayer/source/primitive2d/makefile.mk b/drawinglayer/source/primitive2d/makefile.mk index 75d589019299..3b28b07ce7ce 100644 --- a/drawinglayer/source/primitive2d/makefile.mk +++ b/drawinglayer/source/primitive2d/makefile.mk @@ -4,9 +4,9 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.6 $ +# $Revision: 1.7 $ # -# last change: $Author: aw $ $Date: 2007-08-03 10:43:04 $ +# last change: $Author: aw $ $Date: 2007-09-20 09:51:38 $ # # The Contents of this file are made available subject to # the terms of GNU Lesser General Public License Version 2.1. @@ -75,7 +75,8 @@ SLOFILES= \ $(SLO)$/textdecoratedprimitive2d.obj \ $(SLO)$/texthierarchyprimitive2d.obj \ $(SLO)$/transformprimitive2d.obj \ - $(SLO)$/unifiedalphaprimitive2d.obj + $(SLO)$/unifiedalphaprimitive2d.obj \ + $(SLO)$/wrongspellprimitive2d.obj # --- Targets ---------------------------------- diff --git a/drawinglayer/source/primitive2d/polygonprimitive2d.cxx b/drawinglayer/source/primitive2d/polygonprimitive2d.cxx index 9c5957d30d14..336bfaf7d097 100644 --- a/drawinglayer/source/primitive2d/polygonprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/polygonprimitive2d.cxx @@ -4,9 +4,9 @@ * * $RCSfile: polygonprimitive2d.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: aw $ $Date: 2007-03-06 12:34:30 $ + * last change: $Author: aw $ $Date: 2007-09-20 09:51:38 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -319,6 +319,96 @@ namespace drawinglayer { namespace primitive2d { + Primitive2DSequence PolygonWavePrimitive2D::createLocalDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const + { + Primitive2DSequence aRetval; + + if(getB2DPolygon().count()) + { + const bool bHasWidth(!basegfx::fTools::equalZero(getWaveWidth())); + const bool bHasHeight(!basegfx::fTools::equalZero(getWaveHeight())); + + if(bHasWidth && bHasHeight) + { + // create waveline curve + const basegfx::B2DPolygon aWaveline(basegfx::tools::createWaveline(getB2DPolygon(), getWaveWidth(), getWaveHeight())); + const Primitive2DReference xRef(new PolygonHairlinePrimitive2D(aWaveline, getBColor())); + aRetval = Primitive2DSequence(&xRef, 1); + } + else + { + // flat waveline, decompose to PolygonHairlinePrimitive2D + const Primitive2DReference xRef(new PolygonHairlinePrimitive2D(getB2DPolygon(), getBColor())); + aRetval = Primitive2DSequence(&xRef, 1); + } + } + + return aRetval; + } + + PolygonWavePrimitive2D::PolygonWavePrimitive2D( + const basegfx::B2DPolygon& rPolygon, + const basegfx::BColor& rBColor, + double fWaveWidth, + double fWaveHeight) + : BasePrimitive2D(), + maPolygon(rPolygon), + maBColor(rBColor), + mfWaveWidth(fWaveWidth), + mfWaveHeight(fWaveHeight) + { + if(mfWaveWidth < 0.0) + { + mfWaveWidth = 0.0; + } + + if(mfWaveHeight < 0.0) + { + mfWaveHeight = 0.0; + } + } + + bool PolygonWavePrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const + { + if(BasePrimitive2D::operator==(rPrimitive)) + { + const PolygonWavePrimitive2D& rCompare = (PolygonWavePrimitive2D&)rPrimitive; + + return (getB2DPolygon() == rCompare.getB2DPolygon() + && getBColor() == rCompare.getBColor() + && getWaveWidth() == rCompare.getWaveWidth() + && getWaveHeight() == rCompare.getWaveHeight()); + } + + return false; + } + + basegfx::B2DRange PolygonWavePrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const + { + // get range of it (subdivided) + basegfx::B2DRange aRetval(basegfx::tools::getRange(basegfx::tools::adaptiveSubdivideByAngle(getB2DPolygon()))); + + // if WaveHeight, grow by it + if(!basegfx::fTools::equalZero(getWaveHeight())) + { + aRetval.grow(getWaveHeight()); + } + + return aRetval; + } + + // provide unique ID + ImplPrimitrive2DIDBlock(PolygonWavePrimitive2D, PRIMITIVE2D_ID_POLYGONWAVEPRIMITIVE2D) + + } // end of namespace primitive2d +} // end of namespace drawinglayer + +////////////////////////////////////////////////////////////////////////////// + +namespace drawinglayer +{ + namespace primitive2d + { Primitive2DSequence PolygonStrokeArrowPrimitive2D::createLocalDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const { // copy local polygon, it may be changed diff --git a/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx b/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx index f03fc284179c..80c00afe22e8 100644 --- a/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx @@ -4,9 +4,9 @@ * * $RCSfile: textdecoratedprimitive2d.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: aw $ $Date: 2007-08-13 15:30:25 $ + * last change: $Author: aw $ $Date: 2007-09-20 09:51:38 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -61,6 +61,86 @@ namespace drawinglayer { namespace primitive2d { +/* Primitive2DSequence TextDecoratedPortionPrimitive2D::createLocalDecomposition(const geometry::ViewInformation2D& rViewInformation) const + { + const sal_uInt16 nTextLength(getText().Len()); + Primitive2DSequence aRetval; + + if(nTextLength) + { + if(getWordLineMode()) + { + // support for single word mode + if(!mxBreakIterator.is()) + { + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xMSF(::comphelper::getProcessServiceFactory()); + mxBreakIterator.set(xMSF->createInstance(rtl::OUString::createFromAscii("com.sun.star.i18n.BreakIterator")), ::com::sun::star::uno::UNO_QUERY); + } + + if(mxBreakIterator.is()) + { + for(sal_Int32 nPos(0); nPos < nTextLength;) + { + ::com::sun::star::i18n::Boundary nNextWordBoundary(mxBreakIterator->getWordBoundary( + getText(), nPos, getLocale(), ::com::sun::star::i18n::WordType::ANY_WORD, sal_True)); + const String aNewText(getText(), nPos, nNextWordBoundary - nPos); + ::std::vector< double > aNewDXArray(getDXArray().begin() + nPos, getDXArray().end() + nNextWordBoundary); + + TextDecoratedPortionPrimitive2D aNewPrimitive( + getTextTransform(), + aNewText, + aNewDXArray, + getFontAttributes(), + getLocale(), + getFontColor(), + getTextlineColor(), + getFontUnderline(), + getUnderlineAbove(), + getFontStrikeout(), + false, // no WordLineMode + getFontEmphasisMark(), + getEmphasisMarkAbove(), + getEmphasisMarkBelow(), + RELIEF_NONE, // no relief + false); // no shadow + + appendPrimitive2DSequenceToPrimitive2DSequence(aRetval, aNewPrimitive.get2DDecomposition(rViewInformation)); + + nPos = nNextWordBoundary; + } + } + } + else + { + // no single words needed, decompose + std::vector< BasePrimitive2D* > aNewPrimitives; + + + + // prepare return sequence + for(sal_uInt32 a(0); a < aNewPrimitives.size(); a++) + { + aRetval[a] = Primitive2DReference(aNewPrimitives[a]); + } + } + + if(aRetval.hasElements()) + { + Primitive2DSequence aContent(aRetval); + + if(getShadow()) + { + } + + if(RELIEF_NONE != getFontRelief()) + { + } + } + } + + return aRetval; + } */ + Primitive2DSequence TextDecoratedPortionPrimitive2D::createLocalDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const { std::vector< BasePrimitive2D* > aNewPrimitives; @@ -73,13 +153,11 @@ namespace drawinglayer const bool bNeedFontStrikeout(getFontStrikeout() != FONT_STRIKEOUT_NONE); const bool bNeedEmphasisMarkAbove(getEmphasisMarkAbove() != FONT_EMPHASISMARK_NONE); const bool bNeedEmphasisMarkBelow(getEmphasisMarkBelow() != FONT_EMPHASISMARK_NONE); - const sal_uInt32 nSpellVectorSize(maWrongSpellVector.size()); if(bNeedFontUnderline || bNeedFontStrikeout || bNeedEmphasisMarkAbove - || bNeedEmphasisMarkBelow - || 0 != nSpellVectorSize) + || bNeedEmphasisMarkBelow) { // prepare transformations basegfx::B2DVector aScale, aTranslate; @@ -376,46 +454,7 @@ namespace drawinglayer // if( getWordLineMode() ) // if( getUnderlineAbove() ) - if(nSpellVectorSize && !getDXArray().empty()) - { - // TODO: take care of WrongSpellVector; create redlining (red wavelines) accordingly. - // For test purposes, create single lines as long as no waveline primitive is created - const ::std::vector< double >& rDXArray = getDXArray(); - const sal_uInt32 nDXCount(rDXArray.size()); - const basegfx::BColor aSpellColor(1.0, 0.0, 0.0); // red - - for(sal_uInt32 a(0); a < nSpellVectorSize; a++) - { - const WrongSpellEntry& rCandidate = maWrongSpellVector[a]; - - if(rCandidate.getStart() < rCandidate.getEnd()) - { - ::basegfx::B2DPoint aStart; - ::basegfx::B2DPoint aEnd; - - if(rCandidate.getStart() > 0 && rCandidate.getStart() - 1 < nDXCount) - { - aStart.setX(rDXArray[rCandidate.getStart() - 1] * aScale.getX()); - } - - if(rCandidate.getEnd() > 0 && rCandidate.getEnd() - 1 < nDXCount) - { - aEnd.setX(rDXArray[rCandidate.getEnd() - 1] * aScale.getX()); - } - if(aStart != aEnd) - { - basegfx::B2DPolygon aPolygon; - - aPolygon.append(aStart); - aPolygon.append(aEnd); - aPolygon.transform(aUnscaledTransform); - - aNewPrimitives.push_back(new PolygonHairlinePrimitive2D(aPolygon, aSpellColor)); - } - } - } - } } // prepare return sequence @@ -449,15 +488,13 @@ namespace drawinglayer bool bEmphasisMarkAbove, bool bEmphasisMarkBelow, FontRelief eFontRelief, - bool bShadow, - const WrongSpellVector& rWrongSpellVector) + bool bShadow) : TextSimplePortionPrimitive2D(rNewTransform, rText, rDXArray, rFontAttributes, rLocale, rFontColor), maTextlineColor(rTextlineColor), meFontUnderline(eFontUnderline), meFontStrikeout(eFontStrikeout), meFontEmphasisMark(eFontEmphasisMark), meFontRelief(eFontRelief), - maWrongSpellVector(rWrongSpellVector), mbUnderlineAbove(bUnderlineAbove), mbWordLineMode(bWordLineMode), mbEmphasisMarkAbove(bEmphasisMarkAbove), @@ -477,7 +514,6 @@ namespace drawinglayer && getFontStrikeout() == rCompare.getFontStrikeout() && getFontEmphasisMark() == rCompare.getFontEmphasisMark() && getFontRelief() == rCompare.getFontRelief() - && getWrongSpellVector() == rCompare.getWrongSpellVector() && getUnderlineAbove() == rCompare.getUnderlineAbove() && getWordLineMode() == rCompare.getWordLineMode() && getEmphasisMarkAbove() == rCompare.getEmphasisMarkAbove() diff --git a/drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx b/drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx new file mode 100644 index 000000000000..bb59c16cb882 --- /dev/null +++ b/drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx @@ -0,0 +1,138 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: wrongspellprimitive2d.cxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: aw $ $Date: 2007-09-20 09:51:38 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#ifndef INCLUDED_DRAWINGLAYER_PRIMITIVE2D_WRONGSPELLPRIMITIVE2D_HXX +#include <drawinglayer/primitive2d/wrongspellprimitive2d.hxx> +#endif + +#ifndef _BGFX_POLYGON_B2DPOLYGON_HXX +#include <basegfx/polygon/b2dpolygon.hxx> +#endif + +#ifndef INCLUDED_DRAWINGLAYER_PRIMITIVE2D_POLYGONPRIMITIVE2D_HXX +#include <drawinglayer/primitive2d/polygonprimitive2d.hxx> +#endif + +#ifndef INCLUDED_DRAWINGLAYER_PRIMITIVE2D_PRIMITIVETYPES2D_HXX +#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> +#endif + +#ifndef INCLUDED_DRAWINGLAYER_GEOMETRY_VIEWINFORMATION2D_HXX +#include <drawinglayer/geometry/viewinformation2d.hxx> +#endif + +////////////////////////////////////////////////////////////////////////////// + +namespace drawinglayer +{ + namespace primitive2d + { + Primitive2DSequence WrongSpellPrimitive2D::createLocalDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const + { + // ATM this decompose is view-independent, what the original VCL-Display is not. To mimic + // the old behaviour here if wanted it is necessary to add get2DDecomposition and implement + // it similar to the usage in e.g. HelplinePrimitive2D. Remembering the ViewTransformation + // should be enough then. + // The view-independent wavelines work well (if You ask me). Maybe the old VCL-Behaviour is only + // in place because it was not possible/too expensive at that time to scale the wavelines with the + // view... + // With the VCL-PixelRenderer this will not even be used since it implements WrongSpellPrimitive2D + // directly and mimics the old VCL-Display there. If You implemented a new renderer without + // direct WrongSpellPrimitive2D support, You may want to do the described change here. + + // get the font height (part of scale), so decompose the matrix + basegfx::B2DVector aScale, aTranslate; + double fRotate, fShearX; + getTransformation().decompose(aScale, aTranslate, fRotate, fShearX); + + // calculate distances based on a static default (to allow testing in debugger) + static double fDefaultDistance(0.03); + const double fFontHeight(aScale.getY()); + const double fUnderlineDistance(fFontHeight * fDefaultDistance); + const double fWaveWidth(2.0 * fUnderlineDistance); + + // the Y-distance needs to be relativated to FontHeight since the points get + // transformed with the transformation containing that scale already. + const double fRelativeUnderlineDistance(basegfx::fTools::equalZero(aScale.getY()) ? 0.0 : fUnderlineDistance / aScale.getY()); + basegfx::B2DPoint aStart(getStart(), fRelativeUnderlineDistance); + basegfx::B2DPoint aStop(getStop(), fRelativeUnderlineDistance); + basegfx::B2DPolygon aPolygon; + + aPolygon.append(getTransformation() * aStart); + aPolygon.append(getTransformation() * aStop); + + // create the waveline primitive + Primitive2DReference xPrimitive(new PolygonWavePrimitive2D(aPolygon, getColor(), fWaveWidth, 0.5 * fWaveWidth)); + Primitive2DSequence xRetval(&xPrimitive, 1); + + return xRetval; + } + + WrongSpellPrimitive2D::WrongSpellPrimitive2D( + const basegfx::B2DHomMatrix& rTransformation, + double fStart, + double fStop, + const basegfx::BColor& rColor) + : BasePrimitive2D(), + maTransformation(rTransformation), + mfStart(fStart), + mfStop(fStop), + maColor(rColor) + { + } + + bool WrongSpellPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const + { + if(BasePrimitive2D::operator==(rPrimitive)) + { + const WrongSpellPrimitive2D& rCompare = (WrongSpellPrimitive2D&)rPrimitive; + + return (getTransformation() == rCompare.getTransformation() + && getStart() == rCompare.getStart() + && getStop() == rCompare.getStop() + && getColor() == rCompare.getColor()); + } + + return false; + } + + // provide unique ID + ImplPrimitrive2DIDBlock(WrongSpellPrimitive2D, PRIMITIVE2D_ID_WRONGSPELLPRIMITIVE2D) + + } // end of namespace primitive2d +} // end of namespace drawinglayer + +////////////////////////////////////////////////////////////////////////////// +// eof |