| 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 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
| 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) |
| 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) | 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) |
| 7 * | 7 * |
| 8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
| 9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
| 10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
| (...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 case AlwaysDownstream: | 529 case AlwaysDownstream: |
| 530 affinity = DOWNSTREAM; | 530 affinity = DOWNSTREAM; |
| 531 break; | 531 break; |
| 532 case AlwaysUpstream: | 532 case AlwaysUpstream: |
| 533 affinity = VP_UPSTREAM_IF_POSSIBLE; | 533 affinity = VP_UPSTREAM_IF_POSSIBLE; |
| 534 break; | 534 break; |
| 535 case UpstreamIfPositionIsNotAtStart: | 535 case UpstreamIfPositionIsNotAtStart: |
| 536 affinity = offset > box->caretMinOffset() ? VP_UPSTREAM_IF_POSSIBLE : DO
WNSTREAM; | 536 affinity = offset > box->caretMinOffset() ? VP_UPSTREAM_IF_POSSIBLE : DO
WNSTREAM; |
| 537 break; | 537 break; |
| 538 } | 538 } |
| 539 int textStartOffset = box->renderer()->isText() ? toRenderText(box->renderer
())->textStartOffset() : 0; | 539 int textStartOffset = box->renderer().isText() ? toRenderText(box->renderer(
)).textStartOffset() : 0; |
| 540 return box->renderer()->createPositionWithAffinity(offset + textStartOffset,
affinity); | 540 return box->renderer().createPositionWithAffinity(offset + textStartOffset,
affinity); |
| 541 } | 541 } |
| 542 | 542 |
| 543 static PositionWithAffinity createPositionWithAffinityForBoxAfterAdjustingOffset
ForBiDi(const InlineTextBox* box, int offset, ShouldAffinityBeDownstream shouldA
ffinityBeDownstream) | 543 static PositionWithAffinity createPositionWithAffinityForBoxAfterAdjustingOffset
ForBiDi(const InlineTextBox* box, int offset, ShouldAffinityBeDownstream shouldA
ffinityBeDownstream) |
| 544 { | 544 { |
| 545 ASSERT(box); | 545 ASSERT(box); |
| 546 ASSERT(box->renderer()); | |
| 547 ASSERT(offset >= 0); | 546 ASSERT(offset >= 0); |
| 548 | 547 |
| 549 if (offset && static_cast<unsigned>(offset) < box->len()) | 548 if (offset && static_cast<unsigned>(offset) < box->len()) |
| 550 return createPositionWithAffinityForBox(box, box->start() + offset, shou
ldAffinityBeDownstream); | 549 return createPositionWithAffinityForBox(box, box->start() + offset, shou
ldAffinityBeDownstream); |
| 551 | 550 |
| 552 bool positionIsAtStartOfBox = !offset; | 551 bool positionIsAtStartOfBox = !offset; |
| 553 if (positionIsAtStartOfBox == box->isLeftToRightDirection()) { | 552 if (positionIsAtStartOfBox == box->isLeftToRightDirection()) { |
| 554 // offset is on the left edge | 553 // offset is on the left edge |
| 555 | 554 |
| 556 const InlineBox* prevBox = box->prevLeafChildIgnoringLineBreak(); | 555 const InlineBox* prevBox = box->prevLeafChildIgnoringLineBreak(); |
| 557 if ((prevBox && prevBox->bidiLevel() == box->bidiLevel()) | 556 if ((prevBox && prevBox->bidiLevel() == box->bidiLevel()) |
| 558 || box->renderer()->containingBlock()->style()->direction() == box->
direction()) // FIXME: left on 12CBA | 557 || box->renderer().containingBlock()->style()->direction() == box->d
irection()) // FIXME: left on 12CBA |
| 559 return createPositionWithAffinityForBox(box, box->caretLeftmostOffse
t(), shouldAffinityBeDownstream); | 558 return createPositionWithAffinityForBox(box, box->caretLeftmostOffse
t(), shouldAffinityBeDownstream); |
| 560 | 559 |
| 561 if (prevBox && prevBox->bidiLevel() > box->bidiLevel()) { | 560 if (prevBox && prevBox->bidiLevel() > box->bidiLevel()) { |
| 562 // e.g. left of B in aDC12BAb | 561 // e.g. left of B in aDC12BAb |
| 563 const InlineBox* leftmostBox; | 562 const InlineBox* leftmostBox; |
| 564 do { | 563 do { |
| 565 leftmostBox = prevBox; | 564 leftmostBox = prevBox; |
| 566 prevBox = leftmostBox->prevLeafChildIgnoringLineBreak(); | 565 prevBox = leftmostBox->prevLeafChildIgnoringLineBreak(); |
| 567 } while (prevBox && prevBox->bidiLevel() > box->bidiLevel()); | 566 } while (prevBox && prevBox->bidiLevel() > box->bidiLevel()); |
| 568 return createPositionWithAffinityForBox(leftmostBox, leftmostBox->ca
retRightmostOffset(), shouldAffinityBeDownstream); | 567 return createPositionWithAffinityForBox(leftmostBox, leftmostBox->ca
retRightmostOffset(), shouldAffinityBeDownstream); |
| 569 } | 568 } |
| 570 | 569 |
| 571 if (!prevBox || prevBox->bidiLevel() < box->bidiLevel()) { | 570 if (!prevBox || prevBox->bidiLevel() < box->bidiLevel()) { |
| 572 // e.g. left of D in aDC12BAb | 571 // e.g. left of D in aDC12BAb |
| 573 const InlineBox* rightmostBox; | 572 const InlineBox* rightmostBox; |
| 574 const InlineBox* nextBox = box; | 573 const InlineBox* nextBox = box; |
| 575 do { | 574 do { |
| 576 rightmostBox = nextBox; | 575 rightmostBox = nextBox; |
| 577 nextBox = rightmostBox->nextLeafChildIgnoringLineBreak(); | 576 nextBox = rightmostBox->nextLeafChildIgnoringLineBreak(); |
| 578 } while (nextBox && nextBox->bidiLevel() >= box->bidiLevel()); | 577 } while (nextBox && nextBox->bidiLevel() >= box->bidiLevel()); |
| 579 return createPositionWithAffinityForBox(rightmostBox, | 578 return createPositionWithAffinityForBox(rightmostBox, |
| 580 box->isLeftToRightDirection() ? rightmostBox->caretMaxOffset() :
rightmostBox->caretMinOffset(), shouldAffinityBeDownstream); | 579 box->isLeftToRightDirection() ? rightmostBox->caretMaxOffset() :
rightmostBox->caretMinOffset(), shouldAffinityBeDownstream); |
| 581 } | 580 } |
| 582 | 581 |
| 583 return createPositionWithAffinityForBox(box, box->caretRightmostOffset()
, shouldAffinityBeDownstream); | 582 return createPositionWithAffinityForBox(box, box->caretRightmostOffset()
, shouldAffinityBeDownstream); |
| 584 } | 583 } |
| 585 | 584 |
| 586 const InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak(); | 585 const InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak(); |
| 587 if ((nextBox && nextBox->bidiLevel() == box->bidiLevel()) | 586 if ((nextBox && nextBox->bidiLevel() == box->bidiLevel()) |
| 588 || box->renderer()->containingBlock()->style()->direction() == box->dire
ction()) | 587 || box->renderer().containingBlock()->style()->direction() == box->direc
tion()) |
| 589 return createPositionWithAffinityForBox(box, box->caretRightmostOffset()
, shouldAffinityBeDownstream); | 588 return createPositionWithAffinityForBox(box, box->caretRightmostOffset()
, shouldAffinityBeDownstream); |
| 590 | 589 |
| 591 // offset is on the right edge | 590 // offset is on the right edge |
| 592 if (nextBox && nextBox->bidiLevel() > box->bidiLevel()) { | 591 if (nextBox && nextBox->bidiLevel() > box->bidiLevel()) { |
| 593 // e.g. right of C in aDC12BAb | 592 // e.g. right of C in aDC12BAb |
| 594 const InlineBox* rightmostBox; | 593 const InlineBox* rightmostBox; |
| 595 do { | 594 do { |
| 596 rightmostBox = nextBox; | 595 rightmostBox = nextBox; |
| 597 nextBox = rightmostBox->nextLeafChildIgnoringLineBreak(); | 596 nextBox = rightmostBox->nextLeafChildIgnoringLineBreak(); |
| 598 } while (nextBox && nextBox->bidiLevel() > box->bidiLevel()); | 597 } while (nextBox && nextBox->bidiLevel() > box->bidiLevel()); |
| (...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1422 deleteTextBoxes(); | 1421 deleteTextBoxes(); |
| 1423 else if (!m_linesDirty) { | 1422 else if (!m_linesDirty) { |
| 1424 for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) | 1423 for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) |
| 1425 box->dirtyLineBoxes(); | 1424 box->dirtyLineBoxes(); |
| 1426 } | 1425 } |
| 1427 m_linesDirty = false; | 1426 m_linesDirty = false; |
| 1428 } | 1427 } |
| 1429 | 1428 |
| 1430 InlineTextBox* RenderText::createTextBox() | 1429 InlineTextBox* RenderText::createTextBox() |
| 1431 { | 1430 { |
| 1432 return new InlineTextBox(this); | 1431 return new InlineTextBox(*this); |
| 1433 } | 1432 } |
| 1434 | 1433 |
| 1435 InlineTextBox* RenderText::createInlineTextBox() | 1434 InlineTextBox* RenderText::createInlineTextBox() |
| 1436 { | 1435 { |
| 1437 InlineTextBox* textBox = createTextBox(); | 1436 InlineTextBox* textBox = createTextBox(); |
| 1438 if (!m_firstTextBox) | 1437 if (!m_firstTextBox) |
| 1439 m_firstTextBox = m_lastTextBox = textBox; | 1438 m_firstTextBox = m_lastTextBox = textBox; |
| 1440 else { | 1439 else { |
| 1441 m_lastTextBox->setNextTextBox(textBox); | 1440 m_lastTextBox->setNextTextBox(textBox); |
| 1442 textBox->setPreviousTextBox(m_lastTextBox); | 1441 textBox->setPreviousTextBox(m_lastTextBox); |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1867 } | 1866 } |
| 1868 secureTextTimer->restartWithNewText(lastTypedCharacterOffset); | 1867 secureTextTimer->restartWithNewText(lastTypedCharacterOffset); |
| 1869 } | 1868 } |
| 1870 | 1869 |
| 1871 PassRefPtr<AbstractInlineTextBox> RenderText::firstAbstractInlineTextBox() | 1870 PassRefPtr<AbstractInlineTextBox> RenderText::firstAbstractInlineTextBox() |
| 1872 { | 1871 { |
| 1873 return AbstractInlineTextBox::getOrCreate(this, m_firstTextBox); | 1872 return AbstractInlineTextBox::getOrCreate(this, m_firstTextBox); |
| 1874 } | 1873 } |
| 1875 | 1874 |
| 1876 } // namespace WebCore | 1875 } // namespace WebCore |
| OLD | NEW |