Home | History | Annotate | Download | only in svg
      1 /*
      2  * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
      3  *
      4  * This library is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU Library General Public
      6  * License as published by the Free Software Foundation; either
      7  * version 2 of the License, or (at your option) any later version.
      8  *
      9  * This library is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * Library General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU Library General Public License
     15  * along with this library; see the file COPYING.LIB.  If not, write to
     16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     17  * Boston, MA 02110-1301, USA.
     18  */
     19 
     20 #ifndef SVGTextLayoutAttributesBuilder_h
     21 #define SVGTextLayoutAttributesBuilder_h
     22 
     23 #if ENABLE(SVG)
     24 #include "SVGTextLayoutAttributes.h"
     25 #include <wtf/Vector.h>
     26 
     27 namespace WebCore {
     28 
     29 class RenderObject;
     30 class RenderSVGText;
     31 class SVGTextPositioningElement;
     32 
     33 // SVGTextLayoutAttributesBuilder performs the first layout phase for SVG text.
     34 //
     35 // It extracts the x/y/dx/dy/rotate values from the SVGTextPositioningElements in the DOM,
     36 // measures all characters in the RenderSVGText subtree and extracts kerning/ligature information.
     37 // These values are propagated to the corresponding RenderSVGInlineText renderers.
     38 // The first layout phase only extracts the relevant information needed in RenderBlockLineLayout
     39 // to create the InlineBox tree based on text chunk boundaries & BiDi information.
     40 // The second layout phase is carried out by SVGTextLayoutEngine.
     41 
     42 class SVGTextLayoutAttributesBuilder {
     43     WTF_MAKE_NONCOPYABLE(SVGTextLayoutAttributesBuilder);
     44 public:
     45     SVGTextLayoutAttributesBuilder();
     46     void buildLayoutAttributesForTextSubtree(RenderSVGText*);
     47 
     48 private:
     49     struct TextPosition {
     50         TextPosition(SVGTextPositioningElement* newElement = 0, unsigned newStart = 0, unsigned newLength = 0)
     51             : element(newElement)
     52             , start(newStart)
     53             , length(newLength)
     54         {
     55         }
     56 
     57         SVGTextPositioningElement* element;
     58         unsigned start;
     59         unsigned length;
     60     };
     61 
     62     void collectTextPositioningElements(RenderObject*, unsigned& atCharacter, UChar& lastCharacter);
     63     void buildLayoutAttributesForAllCharacters(RenderSVGText*, unsigned textLength);
     64     void propagateLayoutAttributes(RenderObject*, Vector<SVGTextLayoutAttributes>& allAttributes, unsigned& atCharacter, UChar& lastCharacter) const;
     65     void fillAttributesAtPosition(const TextPosition&);
     66 
     67 private:
     68     Vector<TextPosition> m_textPositions;
     69     SVGTextLayoutAttributes::PositioningLists m_positioningLists;
     70 };
     71 
     72 } // namespace WebCore
     73 
     74 #endif // ENABLE(SVG)
     75 #endif
     76