/* * 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