Reviewed by hyatt
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 May 2006 23:24:38 +0000 (23:24 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 May 2006 23:24:38 +0000 (23:24 +0000)
        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=8851
          REGRESSION: RTL text shifted to the right

        Already covered by several tests in fast/text

        * platform/Font.h:
        (WebCore::TextRun::TextRun): Added length parameter.
        * rendering/InlineTextBox.cpp: Pass the length to the TextRun constructor.
        (WebCore::InlineTextBox::selectionRect):
        (WebCore::InlineTextBox::paint):
        (WebCore::InlineTextBox::paintSelection):
        (WebCore::InlineTextBox::paintMarkedTextBackground):
        (WebCore::InlineTextBox::paintTextMatchMarker):
        (WebCore::InlineTextBox::offsetForPosition):
        (WebCore::InlineTextBox::positionForOffset):
        * rendering/RenderText.cpp:
        (WebCore::RenderText::widthFromCache): Pass length and from instead of from and to
        to the TextRun constructor.
        (WebCore::RenderText::width): Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@14313 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/Font.h
WebCore/rendering/InlineTextBox.cpp
WebCore/rendering/RenderText.cpp

index 12bde8f204be70d92dd154296fd6471d3601864c..8baaa07a37c0aff3d9e4cc637de903a29f745cac 100644 (file)
@@ -1,3 +1,27 @@
+2006-05-11  Mitz Pettel  <opendarwin.org@mitzpettel.com>
+
+        Reviewed by hyatt
+
+        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=8851
+          REGRESSION: RTL text shifted to the right
+
+        Already covered by several tests in fast/text
+
+        * platform/Font.h:
+        (WebCore::TextRun::TextRun): Added length parameter.
+        * rendering/InlineTextBox.cpp: Pass the length to the TextRun constructor.
+        (WebCore::InlineTextBox::selectionRect):
+        (WebCore::InlineTextBox::paint):
+        (WebCore::InlineTextBox::paintSelection):
+        (WebCore::InlineTextBox::paintMarkedTextBackground):
+        (WebCore::InlineTextBox::paintTextMatchMarker):
+        (WebCore::InlineTextBox::offsetForPosition):
+        (WebCore::InlineTextBox::positionForOffset):
+        * rendering/RenderText.cpp:
+        (WebCore::RenderText::widthFromCache): Pass length and from instead of from and to
+        to the TextRun constructor.
+        (WebCore::RenderText::width): Ditto.
+
 2006-05-11  David Hyatt  <hyatt@apple.com>
 
         Fix a regression from the TextRun landing.  Delete the characters in
index 736b6d25ce6c321183a56cc4906873705c965467..480140be0f0c8b635a95b0ff2f1c8cb2b3f17758 100644 (file)
@@ -58,8 +58,8 @@ public:
     :m_characters(c), m_len(len), m_from(from), m_to(to)
     {}
 
-    TextRun(const StringImpl* s, int offset = 0, int from = -1, int to = -1)
-    :m_characters(s->characters() + offset), m_len(s->length() - offset), m_from(adjustFrom(from)), m_to(adjustTo(to))
+    TextRun(const StringImpl* s, int offset = 0, int length = -1, int from = -1, int to = -1)
+    :m_characters(s->characters() + offset), m_len(length == -1 ? s->length() - offset : length), m_from(adjustFrom(from)), m_to(adjustTo(to))
     {}
 
     const UChar operator[](int i) const { return m_characters[i]; }
index aad10b174731dd385988e40e1f5cc99ec531ae69..249959f722136b753a1602a037689013251fd83d 100644 (file)
@@ -117,7 +117,7 @@ IntRect InlineTextBox::selectionRect(int tx, int ty, int startPos, int endPos)
     int selHeight = rootBox->selectionHeight();
     const Font *f = textObj->font(m_firstLine);
 
-    IntRect r = enclosingIntRect(f->selectionRectForText(TextRun(textObj->string(), m_start, sPos, ePos),
+    IntRect r = enclosingIntRect(f->selectionRectForText(TextRun(textObj->string(), m_start, m_len, sPos, ePos),
                                         IntPoint(tx + m_x, ty + selTop), selHeight, textObj->tabWidth(), textPos(), 
                                         m_toAdd, m_reversed, m_dirOverride));
     if (r.x() > tx + m_x + m_width)
@@ -334,7 +334,7 @@ void InlineTextBox::paint(RenderObject::PaintInfo& i, int tx, int ty)
         int endPoint = m_len;
         if (m_truncation != cNoTruncation)
             endPoint = m_truncation - m_start;
-        i.p->drawText(TextRun(textStr, m_start, 0, endPoint),
+        i.p->drawText(TextRun(textStr, m_start, endPoint),
                       IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
                       m_toAdd, m_reversed ? RTL : LTR, m_dirOverride || styleToUse->visuallyOrdered());
     } else {
@@ -343,14 +343,14 @@ void InlineTextBox::paint(RenderObject::PaintInfo& i, int tx, int ty)
         if (paintSelectedTextSeparately) {
             // paint only the text that is not selected
             if (sPos >= ePos)
-                i.p->drawText(TextRun(textStr, m_start), IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
+                i.p->drawText(TextRun(textStr, m_start, m_len), IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
                               m_toAdd, m_reversed ? RTL : LTR, m_dirOverride || styleToUse->visuallyOrdered());
             else {
                 if (sPos - 1 >= 0)
-                    i.p->drawText(TextRun(textStr, m_start, 0, sPos), IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
+                    i.p->drawText(TextRun(textStr, m_start, m_len, 0, sPos), IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
                                   m_toAdd, m_reversed ? RTL : LTR, m_dirOverride || styleToUse->visuallyOrdered());
                 if (ePos < m_start + m_len)
-                    i.p->drawText(TextRun(textStr, m_start, ePos), IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
+                    i.p->drawText(TextRun(textStr, m_start, m_len, ePos), IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
                                   m_toAdd, m_reversed ? RTL : LTR, m_dirOverride || styleToUse->visuallyOrdered());
             }
         }
@@ -364,7 +364,7 @@ void InlineTextBox::paint(RenderObject::PaintInfo& i, int tx, int ty)
                 i.p->setShadow(IntSize(selectionTextShadow->x, selectionTextShadow->y),
                                selectionTextShadow->blur,
                                selectionTextShadow->color);
-            i.p->drawText(TextRun(textStr, m_start, sPos, ePos), IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
+            i.p->drawText(TextRun(textStr, m_start, m_len, sPos, ePos), IntPoint(m_x + tx, m_y + ty + m_baseline), textObject()->tabWidth(), textPos(),
                           m_toAdd, m_reversed ? RTL : LTR, m_dirOverride || styleToUse->visuallyOrdered());
             if (selectionTextShadow)
                 i.p->clearShadow();
@@ -448,7 +448,7 @@ void InlineTextBox::paintSelection(GraphicsContext* p, int tx, int ty, RenderSty
     int y = r->selectionTop();
     int h = r->selectionHeight();
     p->addClip(IntRect(m_x + tx, y + ty, m_width, h));
-    p->drawHighlightForText(TextRun(textObject()->string(), m_start, sPos, ePos), IntPoint(m_x + tx, y + ty), h, textObject()->tabWidth(), textPos(), 
+    p->drawHighlightForText(TextRun(textObject()->string(), m_start, m_len, sPos, ePos), IntPoint(m_x + tx, y + ty), h, textObject()->tabWidth(), textPos(), 
                             m_toAdd, m_reversed ? RTL : LTR, m_dirOverride || style->visuallyOrdered(), c);
     p->restore();
 }
@@ -471,7 +471,7 @@ void InlineTextBox::paintMarkedTextBackground(GraphicsContext* p, int tx, int ty
     RootInlineBox* r = root();
     int y = r->selectionTop();
     int h = r->selectionHeight();
-    p->drawHighlightForText(TextRun(textObject()->string(), m_start, sPos, ePos),
+    p->drawHighlightForText(TextRun(textObject()->string(), m_start, m_len, sPos, ePos),
                             IntPoint(m_x + tx, y + ty), h, textObject()->tabWidth(), textPos(),
                             m_toAdd, m_reversed ? RTL : LTR, m_dirOverride || style->visuallyOrdered(), c);
     p->restore();
@@ -570,7 +570,7 @@ void InlineTextBox::paintTextMatchMarker(GraphicsContext* pt, int _tx, int _ty,
     int sPos = max(marker.startOffset - m_start, (unsigned)0);
     int ePos = min(marker.endOffset - m_start, (unsigned)m_len);
     
-    pt->drawHighlightForText(TextRun(textObject()->string(), m_start, sPos, ePos), IntPoint(m_x + _tx, y + _ty), h, textObject()->tabWidth(), textPos(), 
+    pt->drawHighlightForText(TextRun(textObject()->string(), m_start, m_len, sPos, ePos), IntPoint(m_x + _tx, y + _ty), h, textObject()->tabWidth(), textPos(), 
                              m_toAdd, m_reversed ? RTL : LTR, m_dirOverride || style->visuallyOrdered(), yellow);
     pt->restore();
 }
@@ -684,7 +684,7 @@ int InlineTextBox::offsetForPosition(int _x, bool includePartialGlyphs) const
     RenderText* text = static_cast<RenderText*>(m_object);
     RenderStyle *style = text->style(m_firstLine);
     const Font* f = &style->font();
-    return f->checkSelectionPoint(TextRun(textObject()->string(), m_start),
+    return f->checkSelectionPoint(TextRun(textObject()->string(), m_start, m_len),
                                   m_toAdd, text->tabWidth(), textPos(), _x - m_x,
                                   m_reversed ? RTL : LTR, m_dirOverride || style->visuallyOrdered(), includePartialGlyphs);
 }
@@ -699,7 +699,7 @@ int InlineTextBox::positionForOffset(int offset) const
     int from = m_reversed ? offset - m_start : 0;
     int to = m_reversed ? m_len : offset - m_start;
     // FIXME: Do we need to add rightBearing here?
-    return enclosingIntRect(f->selectionRectForText(TextRun(text->string(), m_start, from, to), IntPoint(m_x, 0), 0, text->tabWidth(), textPos(), m_toAdd, m_reversed, m_dirOverride)).right();
+    return enclosingIntRect(f->selectionRectForText(TextRun(text->string(), m_start, m_len, from, to), IntPoint(m_x, 0), 0, text->tabWidth(), textPos(), m_toAdd, m_reversed, m_dirOverride)).right();
 }
 
 }
index c5005f090ee1e8b36b3e04452b35f32c9e0abb64..05905f21f54eba4469fc010210c4ac5746d9857d 100644 (file)
@@ -486,7 +486,7 @@ ALWAYS_INLINE int RenderText::widthFromCache(const Font* f, int start, int len,
         return w;
     }
     
-    return f->width(TextRun(string(), start, 0, len), tabWidth, xpos);
+    return f->width(TextRun(string(), start, len, 0), tabWidth, xpos);
 }
 
 void RenderText::trimmedMinMaxWidth(int leadWidth,
@@ -995,7 +995,7 @@ unsigned int RenderText::width(unsigned int from, unsigned int len, const Font *
     else if (f == &style()->font())
         w = widthFromCache(f, from, len, tabWidth(), xpos);
     else
-        w = f->width(TextRun(string(), from, 0, len), tabWidth(), xpos );
+        w = f->width(TextRun(string(), from, len, 0), tabWidth(), xpos );
         
     return w;
 }