| 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  * | 
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  180     int sPos = std::max(startPos - m_start, 0); |  180     int sPos = std::max(startPos - m_start, 0); | 
|  181     int ePos = std::min(endPos - m_start, (int)m_len); |  181     int ePos = std::min(endPos - m_start, (int)m_len); | 
|  182  |  182  | 
|  183     if (sPos > ePos) |  183     if (sPos > ePos) | 
|  184         return LayoutRect(); |  184         return LayoutRect(); | 
|  185  |  185  | 
|  186     FontCachePurgePreventer fontCachePurgePreventer; |  186     FontCachePurgePreventer fontCachePurgePreventer; | 
|  187  |  187  | 
|  188     LayoutUnit selTop = root().selectionTop(); |  188     LayoutUnit selTop = root().selectionTop(); | 
|  189     LayoutUnit selHeight = root().selectionHeight(); |  189     LayoutUnit selHeight = root().selectionHeight(); | 
|  190     const LayoutStyle& styleToUse = layoutObject().styleRef(isFirstLineStyle()); |  190     const ComputedStyle& styleToUse = layoutObject().styleRef(isFirstLineStyle()
     ); | 
|  191     const Font& font = styleToUse.font(); |  191     const Font& font = styleToUse.font(); | 
|  192  |  192  | 
|  193     StringBuilder charactersWithHyphen; |  193     StringBuilder charactersWithHyphen; | 
|  194     bool respectHyphen = ePos == m_len && hasHyphen(); |  194     bool respectHyphen = ePos == m_len && hasHyphen(); | 
|  195     TextRun textRun = constructTextRun(styleToUse, font, respectHyphen ? &charac
     tersWithHyphen : 0); |  195     TextRun textRun = constructTextRun(styleToUse, font, respectHyphen ? &charac
     tersWithHyphen : 0); | 
|  196  |  196  | 
|  197     FloatPointWillBeLayoutPoint startingPoint = FloatPointWillBeLayoutPoint(logi
     calLeft(), selTop.toFloat()); |  197     FloatPointWillBeLayoutPoint startingPoint = FloatPointWillBeLayoutPoint(logi
     calLeft(), selTop.toFloat()); | 
|  198     LayoutRect r; |  198     LayoutRect r; | 
|  199     if (sPos || ePos != static_cast<int>(m_len)) { |  199     if (sPos || ePos != static_cast<int>(m_len)) { | 
|  200         r = LayoutRect(enclosingIntRect(font.selectionRectForText(textRun, start
     ingPoint.toFloatPoint(), selHeight, sPos, ePos))); |  200         r = LayoutRect(enclosingIntRect(font.selectionRectForText(textRun, start
     ingPoint.toFloatPoint(), selHeight, sPos, ePos))); | 
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  322     // FIXME: both calls to rawValue() below is temporary and should be removed 
     once the transition |  322     // FIXME: both calls to rawValue() below is temporary and should be removed 
     once the transition | 
|  323     // to LayoutUnit-based types is complete (crbug.com/321237) |  323     // to LayoutUnit-based types is complete (crbug.com/321237) | 
|  324     if (m_truncation != cFullTruncation && visibleToHitTestRequest(request) && l
     ocationInContainer.intersects(rect.rawValue())) { |  324     if (m_truncation != cFullTruncation && visibleToHitTestRequest(request) && l
     ocationInContainer.intersects(rect.rawValue())) { | 
|  325         layoutObject().updateHitTestResult(result, flipForWritingMode(locationIn
     Container.point() - toLayoutSize(accumulatedOffset))); |  325         layoutObject().updateHitTestResult(result, flipForWritingMode(locationIn
     Container.point() - toLayoutSize(accumulatedOffset))); | 
|  326         if (!result.addNodeToListBasedTestResult(layoutObject().node(), request,
      locationInContainer, rect.rawValue())) |  326         if (!result.addNodeToListBasedTestResult(layoutObject().node(), request,
      locationInContainer, rect.rawValue())) | 
|  327             return true; |  327             return true; | 
|  328     } |  328     } | 
|  329     return false; |  329     return false; | 
|  330 } |  330 } | 
|  331  |  331  | 
|  332 bool InlineTextBox::getEmphasisMarkPosition(const LayoutStyle& style, TextEmphas
     isPosition& emphasisPosition) const |  332 bool InlineTextBox::getEmphasisMarkPosition(const ComputedStyle& style, TextEmph
     asisPosition& emphasisPosition) const | 
|  333 { |  333 { | 
|  334     // This function returns true if there are text emphasis marks and they are 
     suppressed by ruby text. |  334     // This function returns true if there are text emphasis marks and they are 
     suppressed by ruby text. | 
|  335     if (style.textEmphasisMark() == TextEmphasisMarkNone) |  335     if (style.textEmphasisMark() == TextEmphasisMarkNone) | 
|  336         return false; |  336         return false; | 
|  337  |  337  | 
|  338     emphasisPosition = style.textEmphasisPosition(); |  338     emphasisPosition = style.textEmphasisPosition(); | 
|  339     if (emphasisPosition == TextEmphasisPositionUnder) |  339     if (emphasisPosition == TextEmphasisPositionUnder) | 
|  340         return true; // Ruby text is always over, so it cannot suppress emphasis
      marks under. |  340         return true; // Ruby text is always over, so it cannot suppress emphasis
      marks under. | 
|  341  |  341  | 
|  342     LayoutBlock* containingBlock = layoutObject().containingBlock(); |  342     LayoutBlock* containingBlock = layoutObject().containingBlock(); | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|  368         if (layoutObject().selectionState() == LayoutObject::SelectionStart) |  368         if (layoutObject().selectionState() == LayoutObject::SelectionStart) | 
|  369             endPos = layoutObject().textLength(); |  369             endPos = layoutObject().textLength(); | 
|  370         else if (layoutObject().selectionState() == LayoutObject::SelectionEnd) |  370         else if (layoutObject().selectionState() == LayoutObject::SelectionEnd) | 
|  371             startPos = 0; |  371             startPos = 0; | 
|  372     } |  372     } | 
|  373  |  373  | 
|  374     sPos = std::max(startPos - m_start, 0); |  374     sPos = std::max(startPos - m_start, 0); | 
|  375     ePos = std::min(endPos - m_start, (int)m_len); |  375     ePos = std::min(endPos - m_start, (int)m_len); | 
|  376 } |  376 } | 
|  377  |  377  | 
|  378 void InlineTextBox::paintDocumentMarker(GraphicsContext* pt, const FloatPointWil
     lBeLayoutPoint& boxOrigin, DocumentMarker* marker, const LayoutStyle& style, con
     st Font& font, bool grammar) |  378 void InlineTextBox::paintDocumentMarker(GraphicsContext* pt, const FloatPointWil
     lBeLayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, c
     onst Font& font, bool grammar) | 
|  379 { |  379 { | 
|  380     InlineTextBoxPainter(*this).paintDocumentMarker(pt, boxOrigin.toFloatPoint()
     , marker, style, font, grammar); |  380     InlineTextBoxPainter(*this).paintDocumentMarker(pt, boxOrigin.toFloatPoint()
     , marker, style, font, grammar); | 
|  381 } |  381 } | 
|  382  |  382  | 
|  383 void InlineTextBox::paintTextMatchMarker(GraphicsContext* pt, const FloatPointWi
     llBeLayoutPoint& boxOrigin, DocumentMarker* marker, const LayoutStyle& style, co
     nst Font& font) |  383 void InlineTextBox::paintTextMatchMarker(GraphicsContext* pt, const FloatPointWi
     llBeLayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, 
     const Font& font) | 
|  384 { |  384 { | 
|  385     InlineTextBoxPainter(*this).paintTextMatchMarker(pt, boxOrigin.toFloatPoint(
     ), marker, style, font); |  385     InlineTextBoxPainter(*this).paintTextMatchMarker(pt, boxOrigin.toFloatPoint(
     ), marker, style, font); | 
|  386 } |  386 } | 
|  387  |  387  | 
|  388 int InlineTextBox::caretMinOffset() const |  388 int InlineTextBox::caretMinOffset() const | 
|  389 { |  389 { | 
|  390     return m_start; |  390     return m_start; | 
|  391 } |  391 } | 
|  392  |  392  | 
|  393 int InlineTextBox::caretMaxOffset() const |  393 int InlineTextBox::caretMaxOffset() const | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
|  408 { |  408 { | 
|  409     if (isLineBreak()) |  409     if (isLineBreak()) | 
|  410         return 0; |  410         return 0; | 
|  411  |  411  | 
|  412     if (lineOffset - logicalLeft() > logicalWidth()) |  412     if (lineOffset - logicalLeft() > logicalWidth()) | 
|  413         return isLeftToRightDirection() ? len() : 0; |  413         return isLeftToRightDirection() ? len() : 0; | 
|  414     if (lineOffset - logicalLeft() < 0) |  414     if (lineOffset - logicalLeft() < 0) | 
|  415         return isLeftToRightDirection() ? 0 : len(); |  415         return isLeftToRightDirection() ? 0 : len(); | 
|  416  |  416  | 
|  417     LayoutText& text = layoutObject(); |  417     LayoutText& text = layoutObject(); | 
|  418     const LayoutStyle& style = text.styleRef(isFirstLineStyle()); |  418     const ComputedStyle& style = text.styleRef(isFirstLineStyle()); | 
|  419     const Font& font = style.font(); |  419     const Font& font = style.font(); | 
|  420     return font.offsetForPosition(constructTextRun(style, font), lineOffset - lo
     gicalLeft(), includePartialGlyphs); |  420     return font.offsetForPosition(constructTextRun(style, font), lineOffset - lo
     gicalLeft(), includePartialGlyphs); | 
|  421 } |  421 } | 
|  422  |  422  | 
|  423 FloatWillBeLayoutUnit InlineTextBox::positionForOffset(int offset) const |  423 FloatWillBeLayoutUnit InlineTextBox::positionForOffset(int offset) const | 
|  424 { |  424 { | 
|  425     ASSERT(offset >= m_start); |  425     ASSERT(offset >= m_start); | 
|  426     ASSERT(offset <= m_start + m_len); |  426     ASSERT(offset <= m_start + m_len); | 
|  427  |  427  | 
|  428     if (isLineBreak()) |  428     if (isLineBreak()) | 
|  429         return logicalLeft(); |  429         return logicalLeft(); | 
|  430  |  430  | 
|  431     LayoutText& text = layoutObject(); |  431     LayoutText& text = layoutObject(); | 
|  432     const LayoutStyle& styleToUse = text.styleRef(isFirstLineStyle()); |  432     const ComputedStyle& styleToUse = text.styleRef(isFirstLineStyle()); | 
|  433     const Font& font = styleToUse.font(); |  433     const Font& font = styleToUse.font(); | 
|  434     int from = !isLeftToRightDirection() ? offset - m_start : 0; |  434     int from = !isLeftToRightDirection() ? offset - m_start : 0; | 
|  435     int to = !isLeftToRightDirection() ? m_len : offset - m_start; |  435     int to = !isLeftToRightDirection() ? m_len : offset - m_start; | 
|  436     // FIXME: Do we need to add rightBearing here? |  436     // FIXME: Do we need to add rightBearing here? | 
|  437     return font.selectionRectForText(constructTextRun(styleToUse, font), IntPoin
     t(logicalLeft(), 0), 0, from, to).maxX(); |  437     return font.selectionRectForText(constructTextRun(styleToUse, font), IntPoin
     t(logicalLeft(), 0), 0, from, to).maxX(); | 
|  438 } |  438 } | 
|  439  |  439  | 
|  440 bool InlineTextBox::containsCaretOffset(int offset) const |  440 bool InlineTextBox::containsCaretOffset(int offset) const | 
|  441 { |  441 { | 
|  442     // Offsets before the box are never "in". |  442     // Offsets before the box are never "in". | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
|  458         return false; |  458         return false; | 
|  459  |  459  | 
|  460     // Offsets at the end are "in" for normal boxes (but the caller has to check
      affinity). |  460     // Offsets at the end are "in" for normal boxes (but the caller has to check
      affinity). | 
|  461     return true; |  461     return true; | 
|  462 } |  462 } | 
|  463  |  463  | 
|  464 void InlineTextBox::characterWidths(Vector<FloatWillBeLayoutUnit>& widths) const |  464 void InlineTextBox::characterWidths(Vector<FloatWillBeLayoutUnit>& widths) const | 
|  465 { |  465 { | 
|  466     FontCachePurgePreventer fontCachePurgePreventer; |  466     FontCachePurgePreventer fontCachePurgePreventer; | 
|  467  |  467  | 
|  468     const LayoutStyle& styleToUse = layoutObject().styleRef(isFirstLineStyle()); |  468     const ComputedStyle& styleToUse = layoutObject().styleRef(isFirstLineStyle()
     ); | 
|  469     const Font& font = styleToUse.font(); |  469     const Font& font = styleToUse.font(); | 
|  470  |  470  | 
|  471     TextRun textRun = constructTextRun(styleToUse, font); |  471     TextRun textRun = constructTextRun(styleToUse, font); | 
|  472  |  472  | 
|  473     SimpleShaper shaper(&font, textRun); |  473     SimpleShaper shaper(&font, textRun); | 
|  474     FloatWillBeLayoutUnit lastWidth; |  474     FloatWillBeLayoutUnit lastWidth; | 
|  475     widths.resize(m_len); |  475     widths.resize(m_len); | 
|  476     for (unsigned i = 0; i < m_len; i++) { |  476     for (unsigned i = 0; i < m_len; i++) { | 
|  477         shaper.advance(i + 1); |  477         shaper.advance(i + 1); | 
|  478         widths[i] = shaper.runWidthSoFar() - lastWidth; |  478         widths[i] = shaper.runWidthSoFar() - lastWidth; | 
|  479         lastWidth = shaper.runWidthSoFar(); |  479         lastWidth = shaper.runWidthSoFar(); | 
|  480     } |  480     } | 
|  481 } |  481 } | 
|  482  |  482  | 
|  483 TextRun InlineTextBox::constructTextRun(const LayoutStyle& style, const Font& fo
     nt, StringBuilder* charactersWithHyphen) const |  483 TextRun InlineTextBox::constructTextRun(const ComputedStyle& style, const Font& 
     font, StringBuilder* charactersWithHyphen) const | 
|  484 { |  484 { | 
|  485     ASSERT(layoutObject().text()); |  485     ASSERT(layoutObject().text()); | 
|  486  |  486  | 
|  487     StringView string = layoutObject().text().createView(); |  487     StringView string = layoutObject().text().createView(); | 
|  488     unsigned startPos = start(); |  488     unsigned startPos = start(); | 
|  489     unsigned length = len(); |  489     unsigned length = len(); | 
|  490  |  490  | 
|  491     if (string.length() != length || startPos) |  491     if (string.length() != length || startPos) | 
|  492         string.narrow(startPos, length); |  492         string.narrow(startPos, length); | 
|  493  |  493  | 
|  494     return constructTextRun(style, font, string, layoutObject().textLength() - s
     tartPos, charactersWithHyphen); |  494     return constructTextRun(style, font, string, layoutObject().textLength() - s
     tartPos, charactersWithHyphen); | 
|  495 } |  495 } | 
|  496  |  496  | 
|  497 TextRun InlineTextBox::constructTextRun(const LayoutStyle& style, const Font& fo
     nt, StringView string, int maximumLength, StringBuilder* charactersWithHyphen) c
     onst |  497 TextRun InlineTextBox::constructTextRun(const ComputedStyle& style, const Font& 
     font, StringView string, int maximumLength, StringBuilder* charactersWithHyphen)
      const | 
|  498 { |  498 { | 
|  499     if (charactersWithHyphen) { |  499     if (charactersWithHyphen) { | 
|  500         const AtomicString& hyphenString = style.hyphenString(); |  500         const AtomicString& hyphenString = style.hyphenString(); | 
|  501         charactersWithHyphen->reserveCapacity(string.length() + hyphenString.len
     gth()); |  501         charactersWithHyphen->reserveCapacity(string.length() + hyphenString.len
     gth()); | 
|  502         charactersWithHyphen->append(string); |  502         charactersWithHyphen->append(string); | 
|  503         charactersWithHyphen->append(hyphenString); |  503         charactersWithHyphen->append(hyphenString); | 
|  504         string = charactersWithHyphen->toString().createView(); |  504         string = charactersWithHyphen->toString().createView(); | 
|  505         maximumLength = string.length(); |  505         maximumLength = string.length(); | 
|  506     } |  506     } | 
|  507  |  507  | 
|  508     ASSERT(maximumLength >= static_cast<int>(string.length())); |  508     ASSERT(maximumLength >= static_cast<int>(string.length())); | 
|  509  |  509  | 
|  510     TextRun run(string, textPos(), expansion(), expansionBehavior(), direction()
     , dirOverride() || style.rtlOrdering() == VisualOrder, !layoutObject().canUseSim
     pleFontCodePath()); |  510     TextRun run(string, textPos(), expansion(), expansionBehavior(), direction()
     , dirOverride() || style.rtlOrdering() == VisualOrder, !layoutObject().canUseSim
     pleFontCodePath()); | 
|  511     run.setTabSize(!style.collapseWhiteSpace(), style.tabSize()); |  511     run.setTabSize(!style.collapseWhiteSpace(), style.tabSize()); | 
|  512     run.setCodePath(layoutObject().canUseSimpleFontCodePath() ? TextRun::ForceSi
     mple : TextRun::ForceComplex); |  512     run.setCodePath(layoutObject().canUseSimpleFontCodePath() ? TextRun::ForceSi
     mple : TextRun::ForceComplex); | 
|  513     run.setTextJustify(style.textJustify()); |  513     run.setTextJustify(style.textJustify()); | 
|  514  |  514  | 
|  515     // Propagate the maximum length of the characters buffer to the TextRun, eve
     n when we're only processing a substring. |  515     // Propagate the maximum length of the characters buffer to the TextRun, eve
     n when we're only processing a substring. | 
|  516     run.setCharactersLength(maximumLength); |  516     run.setCharactersLength(maximumLength); | 
|  517     ASSERT(run.charactersLength() >= run.length()); |  517     ASSERT(run.charactersLength() >= run.length()); | 
|  518     return run; |  518     return run; | 
|  519 } |  519 } | 
|  520  |  520  | 
|  521 TextRun InlineTextBox::constructTextRunForInspector(const LayoutStyle& style, co
     nst Font& font) const |  521 TextRun InlineTextBox::constructTextRunForInspector(const ComputedStyle& style, 
     const Font& font) const | 
|  522 { |  522 { | 
|  523     return InlineTextBox::constructTextRun(style, font); |  523     return InlineTextBox::constructTextRun(style, font); | 
|  524 } |  524 } | 
|  525  |  525  | 
|  526 const char* InlineTextBox::boxName() const |  526 const char* InlineTextBox::boxName() const | 
|  527 { |  527 { | 
|  528     return "InlineTextBox"; |  528     return "InlineTextBox"; | 
|  529 } |  529 } | 
|  530  |  530  | 
|  531 String InlineTextBox::debugName() const |  531 String InlineTextBox::debugName() const | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|  552     printedCharacters = fprintf(stderr, "\t%s %p", obj.name(), &obj); |  552     printedCharacters = fprintf(stderr, "\t%s %p", obj.name(), &obj); | 
|  553     const int layoutObjectCharacterOffset = 75; |  553     const int layoutObjectCharacterOffset = 75; | 
|  554     for (; printedCharacters < layoutObjectCharacterOffset; printedCharacters++) |  554     for (; printedCharacters < layoutObjectCharacterOffset; printedCharacters++) | 
|  555         fputc(' ', stderr); |  555         fputc(' ', stderr); | 
|  556     fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), value.utf8().d
     ata()); |  556     fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), value.utf8().d
     ata()); | 
|  557 } |  557 } | 
|  558  |  558  | 
|  559 #endif |  559 #endif | 
|  560  |  560  | 
|  561 } // namespace blink |  561 } // namespace blink | 
| OLD | NEW |