38730a38d061e825cd937d78184b8d3b3fa0faaf
[WebKit-https.git] / Source / WebCore / rendering / svg / SVGTextQuery.h
1 /*
2  * Copyright (C) Research In Motion Limited 2010. 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 SVGTextQuery_h
21 #define SVGTextQuery_h
22
23 #include "FloatRect.h"
24 #include "SVGPoint.h"
25 #include "SVGTextFragment.h"
26 #include <wtf/Vector.h>
27
28 namespace WebCore {
29
30 class InlineFlowBox;
31 class RenderObject;
32 class SVGInlineTextBox;
33
34 class SVGTextQuery {
35 public:
36     SVGTextQuery(RenderObject*);
37
38     unsigned numberOfCharacters() const;
39     float textLength() const;
40     float subStringLength(unsigned startPosition, unsigned length) const;
41     SVGPoint startPositionOfCharacter(unsigned position) const;
42     SVGPoint endPositionOfCharacter(unsigned position) const;
43     float rotationOfCharacter(unsigned position) const;
44     FloatRect extentOfCharacter(unsigned position) const;
45     int characterNumberAtPosition(const SVGPoint&) const;
46
47     // Public helper struct. Private classes in SVGTextQuery inherit from it.
48     struct Data;
49
50 private:
51     typedef bool (SVGTextQuery::*ProcessTextFragmentCallback)(Data*, const SVGTextFragment&) const;
52     bool executeQuery(Data*, ProcessTextFragmentCallback) const;
53
54     void collectTextBoxesInFlowBox(InlineFlowBox*);
55     bool mapStartEndPositionsIntoFragmentCoordinates(Data*, const SVGTextFragment&, unsigned& startPosition, unsigned& endPosition) const;
56     void modifyStartEndPositionsRespectingLigatures(Data*, unsigned& startPosition, unsigned& endPosition) const;
57
58 private:
59     bool numberOfCharactersCallback(Data*, const SVGTextFragment&) const;
60     bool textLengthCallback(Data*, const SVGTextFragment&) const;
61     bool subStringLengthCallback(Data*, const SVGTextFragment&) const;
62     bool startPositionOfCharacterCallback(Data*, const SVGTextFragment&) const;
63     bool endPositionOfCharacterCallback(Data*, const SVGTextFragment&) const;
64     bool rotationOfCharacterCallback(Data*, const SVGTextFragment&) const;
65     bool extentOfCharacterCallback(Data*, const SVGTextFragment&) const;
66     bool characterNumberAtPositionCallback(Data*, const SVGTextFragment&) const;
67
68 private:
69     Vector<SVGInlineTextBox*> m_textBoxes;
70 };
71
72 }
73
74 #endif