OLD | NEW |
---|---|
1 /* | 1 /* |
2 * (C) 1999 Lars Knoll (knoll@kde.org) | 2 * (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2000 Dirk Mueller (mueller@kde.org) | 3 * (C) 2000 Dirk Mueller (mueller@kde.org) |
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
11 * This library is distributed in the hope that it will be useful, | 11 * This library is distributed in the hope that it will be useful, |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 * Library General Public License for more details. | 14 * Library General Public License for more details. |
15 * | 15 * |
16 * You should have received a copy of the GNU Library General Public License | 16 * You should have received a copy of the GNU Library General Public License |
17 * along with this library; see the file COPYING.LIB. If not, write to | 17 * along with this library; see the file COPYING.LIB. If not, write to |
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
19 * Boston, MA 02110-1301, USA. | 19 * Boston, MA 02110-1301, USA. |
20 * | 20 * |
21 */ | 21 */ |
22 | 22 |
23 #include "config.h" | 23 #include "config.h" |
24 #include "core/rendering/InlineTextBox.h" | 24 #include "core/rendering/InlineTextBox.h" |
25 | 25 |
26 #include "core/accessibility/AXObjectCache.h" | |
26 #include "core/dom/Document.h" | 27 #include "core/dom/Document.h" |
27 #include "core/dom/DocumentMarkerController.h" | 28 #include "core/dom/DocumentMarkerController.h" |
28 #include "core/dom/RenderedDocumentMarker.h" | 29 #include "core/dom/RenderedDocumentMarker.h" |
29 #include "core/dom/Text.h" | 30 #include "core/dom/Text.h" |
30 #include "core/editing/Editor.h" | 31 #include "core/editing/Editor.h" |
31 #include "core/editing/InputMethodController.h" | 32 #include "core/editing/InputMethodController.h" |
32 #include "core/page/Frame.h" | 33 #include "core/page/Frame.h" |
33 #include "core/page/Page.h" | 34 #include "core/page/Page.h" |
34 #include "core/page/Settings.h" | 35 #include "core/page/Settings.h" |
35 #include "core/platform/graphics/DrawLooper.h" | 36 #include "core/platform/graphics/DrawLooper.h" |
36 #include "core/platform/graphics/FontCache.h" | 37 #include "core/platform/graphics/FontCache.h" |
37 #include "core/platform/graphics/GraphicsContextStateSaver.h" | 38 #include "core/platform/graphics/GraphicsContextStateSaver.h" |
39 #include "core/platform/graphics/WidthIterator.h" | |
38 #include "core/rendering/EllipsisBox.h" | 40 #include "core/rendering/EllipsisBox.h" |
39 #include "core/rendering/HitTestResult.h" | 41 #include "core/rendering/HitTestResult.h" |
40 #include "core/rendering/PaintInfo.h" | 42 #include "core/rendering/PaintInfo.h" |
41 #include "core/rendering/RenderBR.h" | 43 #include "core/rendering/RenderBR.h" |
42 #include "core/rendering/RenderBlock.h" | 44 #include "core/rendering/RenderBlock.h" |
43 #include "core/rendering/RenderCombineText.h" | 45 #include "core/rendering/RenderCombineText.h" |
44 #include "core/rendering/RenderRubyRun.h" | 46 #include "core/rendering/RenderRubyRun.h" |
45 #include "core/rendering/RenderRubyText.h" | 47 #include "core/rendering/RenderRubyText.h" |
46 #include "core/rendering/RenderTheme.h" | 48 #include "core/rendering/RenderTheme.h" |
47 #include "core/rendering/style/ShadowData.h" | 49 #include "core/rendering/style/ShadowData.h" |
(...skipping 14 matching lines...) Expand all Loading... | |
62 | 64 |
63 COMPILE_ASSERT(sizeof(InlineTextBox) == sizeof(SameSizeAsInlineTextBox), InlineT extBox_should_stay_small); | 65 COMPILE_ASSERT(sizeof(InlineTextBox) == sizeof(SameSizeAsInlineTextBox), InlineT extBox_should_stay_small); |
64 | 66 |
65 typedef WTF::HashMap<const InlineTextBox*, LayoutRect> InlineTextBoxOverflowMap; | 67 typedef WTF::HashMap<const InlineTextBox*, LayoutRect> InlineTextBoxOverflowMap; |
66 static InlineTextBoxOverflowMap* gTextBoxesWithOverflow; | 68 static InlineTextBoxOverflowMap* gTextBoxesWithOverflow; |
67 | 69 |
68 static const int misspellingLineThickness = 3; | 70 static const int misspellingLineThickness = 3; |
69 | 71 |
70 void InlineTextBox::destroy() | 72 void InlineTextBox::destroy() |
71 { | 73 { |
74 if (AXObjectCache* cache = renderer()->document().existingAXObjectCache()) | |
75 cache->remove(this); | |
76 | |
72 if (!knownToHaveNoOverflow() && gTextBoxesWithOverflow) | 77 if (!knownToHaveNoOverflow() && gTextBoxesWithOverflow) |
73 gTextBoxesWithOverflow->remove(this); | 78 gTextBoxesWithOverflow->remove(this); |
74 InlineBox::destroy(); | 79 InlineBox::destroy(); |
75 } | 80 } |
76 | 81 |
77 void InlineTextBox::markDirty(bool dirty) | 82 void InlineTextBox::markDirty(bool dirty) |
78 { | 83 { |
79 if (dirty) { | 84 if (dirty) { |
80 m_len = 0; | 85 m_len = 0; |
81 m_start = 0; | 86 m_start = 0; |
(...skipping 1385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1467 return false; | 1472 return false; |
1468 | 1473 |
1469 // Offsets at the end are "out" for line breaks (they are on the next line). | 1474 // Offsets at the end are "out" for line breaks (they are on the next line). |
1470 if (isLineBreak()) | 1475 if (isLineBreak()) |
1471 return false; | 1476 return false; |
1472 | 1477 |
1473 // Offsets at the end are "in" for normal boxes (but the caller has to check affinity). | 1478 // Offsets at the end are "in" for normal boxes (but the caller has to check affinity). |
1474 return true; | 1479 return true; |
1475 } | 1480 } |
1476 | 1481 |
1482 void InlineTextBox::characterWidths(Vector<float>& widths) const | |
1483 { | |
1484 FontCachePurgePreventer fontCachePurgePreventer; | |
1485 | |
1486 RenderText* textObj = textRenderer(); | |
1487 RenderStyle* styleToUse = textObj->style(isFirstLineStyle()); | |
1488 const Font& font = styleToUse->font(); | |
1489 | |
1490 TextRun textRun = constructTextRun(styleToUse, font); | |
1491 | |
1492 GlyphBuffer glyphBuffer; | |
1493 WidthIterator it(&font, textRun); | |
1494 float lastWidth = 0; | |
1495 widths.resize(m_len); | |
1496 for (unsigned i = 0; i < m_len; i++) { | |
1497 it.advance(i + 1, &glyphBuffer); | |
1498 widths[i] = it.m_runWidthSoFar - lastWidth; | |
1499 lastWidth = it.m_runWidthSoFar; | |
1500 } | |
1501 } | |
1502 | |
1503 bool InlineTextBox::isRTL() const | |
igoroliveira
2013/10/03 03:11:55
InlineBox::direction() is not enough here?
dmazzoni
2013/10/03 03:22:33
Thanks, that's obviously what I was looking for.
| |
1504 { | |
1505 FontCachePurgePreventer fontCachePurgePreventer; | |
1506 | |
1507 RenderText* textObj = textRenderer(); | |
1508 RenderStyle* styleToUse = textObj->style(isFirstLineStyle()); | |
1509 const Font& font = styleToUse->font(); | |
1510 | |
1511 TextRun textRun = constructTextRun(styleToUse, font); | |
1512 return textRun.rtl(); | |
1513 } | |
1514 | |
1477 TextRun InlineTextBox::constructTextRun(RenderStyle* style, const Font& font, St ringBuilder* charactersWithHyphen) const | 1515 TextRun InlineTextBox::constructTextRun(RenderStyle* style, const Font& font, St ringBuilder* charactersWithHyphen) const |
1478 { | 1516 { |
1479 ASSERT(style); | 1517 ASSERT(style); |
1480 | 1518 |
1481 RenderText* textRenderer = this->textRenderer(); | 1519 RenderText* textRenderer = this->textRenderer(); |
1482 ASSERT(textRenderer); | 1520 ASSERT(textRenderer); |
1483 ASSERT(textRenderer->text()); | 1521 ASSERT(textRenderer->text()); |
1484 | 1522 |
1485 StringView string = textRenderer->text().createView(); | 1523 StringView string = textRenderer->text().createView(); |
1486 unsigned startPos = start(); | 1524 unsigned startPos = start(); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1546 printedCharacters = fprintf(stderr, "\t%s %p", obj->renderName(), obj); | 1584 printedCharacters = fprintf(stderr, "\t%s %p", obj->renderName(), obj); |
1547 const int rendererCharacterOffset = 24; | 1585 const int rendererCharacterOffset = 24; |
1548 for (; printedCharacters < rendererCharacterOffset; printedCharacters++) | 1586 for (; printedCharacters < rendererCharacterOffset; printedCharacters++) |
1549 fputc(' ', stderr); | 1587 fputc(' ', stderr); |
1550 fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), value.utf8().d ata()); | 1588 fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), value.utf8().d ata()); |
1551 } | 1589 } |
1552 | 1590 |
1553 #endif | 1591 #endif |
1554 | 1592 |
1555 } // namespace WebCore | 1593 } // namespace WebCore |
OLD | NEW |