Home | History | Annotate | Download | only in svg
      1 /*
      2  * Copyright (C) Research In Motion Limited 2010-2012. 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 #include "core/rendering/svg/SVGTextLayoutAttributes.h"
     24 #include "wtf/Vector.h"
     25 
     26 namespace blink {
     27 
     28 class RenderObject;
     29 class RenderSVGInlineText;
     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 // These values are propagated to the corresponding RenderSVGInlineText renderers.
     37 // The first layout phase only extracts the relevant information needed in RenderBlockLineLayout
     38 // to create the InlineBox tree based on text chunk boundaries & BiDi information.
     39 // The second layout phase is carried out by SVGTextLayoutEngine.
     40 
     41 class SVGTextLayoutAttributesBuilder {
     42     WTF_MAKE_NONCOPYABLE(SVGTextLayoutAttributesBuilder);
     43 public:
     44     SVGTextLayoutAttributesBuilder();
     45     bool buildLayoutAttributesForForSubtree(RenderSVGText*);
     46     void buildLayoutAttributesForTextRenderer(RenderSVGInlineText*);
     47 
     48     void rebuildMetricsForTextRenderer(RenderSVGInlineText*);
     49 
     50     // Invoked whenever the underlying DOM tree changes, so that m_textPositions is rebuild.
     51     void clearTextPositioningElements() { m_textPositions.clear(); }
     52     unsigned numberOfTextPositioningElements() const { return m_textPositions.size(); }
     53 
     54 private:
     55     struct TextPosition {
     56         TextPosition(SVGTextPositioningElement* newElement = 0, unsigned newStart = 0, unsigned newLength = 0)
     57             : element(newElement)
     58             , start(newStart)
     59             , length(newLength)
     60         {
     61         }
     62 
     63         SVGTextPositioningElement* element;
     64         unsigned start;
     65         unsigned length;
     66     };
     67 
     68     void buildCharacterDataMap(RenderSVGText*);
     69     void collectTextPositioningElements(RenderObject*, UChar& lastCharacter);
     70     void fillCharacterDataMap(const TextPosition&);
     71 
     72 private:
     73     unsigned m_textLength;
     74     Vector<TextPosition> m_textPositions;
     75     SVGCharacterDataMap m_characterDataMap;
     76 };
     77 
     78 } // namespace blink
     79 
     80 #endif
     81