diff -r 000000000000 -r 4f2f89ce4247 WebCore/rendering/SVGCharacterLayoutInfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebCore/rendering/SVGCharacterLayoutInfo.h Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2007 Nikolas Zimmermann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef SVGCharacterLayoutInfo_h +#define SVGCharacterLayoutInfo_h + +#if ENABLE(SVG) +#include "Path.h" +#include +#include + +namespace WebCore { + +class InlineFlowBox; +class SVGElement; +class SVGLengthList; +class SVGNumberList; +class SVGTextPositioningElement; + +template +class PositionedVector : public Vector { +public: + PositionedVector() + : m_position(0) + { + } + + unsigned position() const + { + return m_position; + } + + void advance(unsigned position) + { + m_position += position; + ASSERT(m_position < Vector::size()); + } + + Type valueAtCurrentPosition() const + { + ASSERT(m_position < Vector::size()); + return Vector::at(m_position); + } + +private: + unsigned m_position; +}; + +class PositionedFloatVector : public PositionedVector { }; +struct SVGChar; + +struct SVGCharacterLayoutInfo { + SVGCharacterLayoutInfo(); + + enum StackType { XStack, YStack, DxStack, DyStack, AngleStack, BaselineShiftStack }; + + bool xValueAvailable() const; + bool yValueAvailable() const; + bool dxValueAvailable() const; + bool dyValueAvailable() const; + bool angleValueAvailable() const; + bool baselineShiftValueAvailable() const; + + float xValueNext() const; + float yValueNext() const; + float dxValueNext() const; + float dyValueNext() const; + float angleValueNext() const; + float baselineShiftValueNext() const; + + void processedChunk(float savedShiftX, float savedShiftY); + void processedSingleCharacter(); + + bool nextPathLayoutPointAndAngle(float glyphAdvance, float extraAdvance, float newOffset); + + // Used for text-on-path. + void addLayoutInformation(InlineFlowBox*, float textAnchorOffset = 0.0f); + + bool inPathLayout() const; + void setInPathLayout(bool value); + + // Used for anything else. + void addLayoutInformation(SVGTextPositioningElement*); + + // Global position + float curx; + float cury; + + // Global rotation + float angle; + + // Accumulated dx/dy values + float dx; + float dy; + + // Accumulated baseline-shift values + float shiftx; + float shifty; + + // Path specific advance values to handle lengthAdjust + float pathExtraAdvance; + float pathTextLength; + float pathChunkLength; + + // Result vector + Vector svgChars; + bool nextDrawnSeperated : 1; + +private: + // Used for baseline-shift. + void addStackContent(StackType, float); + + // Used for angle. + void addStackContent(StackType, SVGNumberList*); + + // Used for x/y/dx/dy. + void addStackContent(StackType, SVGLengthList*, const SVGElement*); + + void addStackContent(StackType, const PositionedFloatVector&); + + void xStackWalk(); + void yStackWalk(); + void dxStackWalk(); + void dyStackWalk(); + void angleStackWalk(); + void baselineShiftStackWalk(); + + bool isInitialLayout() const; + +private: + bool xStackChanged : 1; + bool yStackChanged : 1; + bool dxStackChanged : 1; + bool dyStackChanged : 1; + bool angleStackChanged : 1; + bool baselineShiftStackChanged : 1; + + // text on path layout + bool pathLayout : 1; + float currentOffset; + float startOffset; + float layoutPathLength; + Path layoutPath; + + Vector xStack; + Vector yStack; + Vector dxStack; + Vector dyStack; + Vector angleStack; + Vector baselineShiftStack; +}; + +} // namespace WebCore + +#endif // ENABLE(SVG) +#endif // SVGCharacterLayoutInfo_h