WebCore:
authoradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 5 Jul 2005 23:21:31 +0000 (23:21 +0000)
committeradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 5 Jul 2005 23:21:31 +0000 (23:21 +0000)
       Rolling out changes for <rdar://problem/3792529> REGRESSION (Mail): Tabs do not work the way they did in Panther (especially useful in plain text mail)
       since it caused a 2% performance regression.

        * khtml/editing/apply_style_command.cpp:
        (khtml::createStyleSpanElement):
        (khtml::ApplyStyleCommand::removeCSSStyle):
        (khtml::ApplyStyleCommand::addInlineStyleIfNeeded):
        * khtml/editing/delete_selection_command.cpp:
        (khtml::DeleteSelectionCommand::saveTypingStyleState):
        * khtml/editing/edit_command.cpp:
        (khtml::EditCommand::styleAtPosition):
        * khtml/editing/html_interchange.h:
        * khtml/editing/htmlediting.cpp:
        (khtml::isSpecialElement):
        * khtml/editing/htmlediting.h:
        * khtml/editing/insert_text_command.cpp:
        (khtml::InsertTextCommand::prepareForTextInsertion):
        (khtml::InsertTextCommand::input):
        * khtml/editing/insert_text_command.h:
        * khtml/editing/markup.cpp:
        (khtml::createFragmentFromText):
        * khtml/editing/replace_selection_command.cpp:
        (khtml::ReplacementFragment::removeStyleNodes):
        * khtml/html/htmltokenizer.cpp:
        (khtml::HTMLTokenizer::begin):
        (khtml::HTMLTokenizer::processListing):
        (khtml::HTMLTokenizer::parseEntity):
        (khtml::HTMLTokenizer::parseTag):
        (khtml::HTMLTokenizer::addPending):
        (khtml::HTMLTokenizer::write):
        * khtml/html/htmltokenizer.h:
        (khtml::HTMLTokenizer::):
        * khtml/rendering/bidi.cpp:
        (khtml::addRun):
        (khtml::RenderBlock::computeHorizontalPositionsForLine):
        (khtml::RenderBlock::skipWhitespace):
        (khtml::RenderBlock::findNextLineBreak):
        (khtml::RenderBlock::checkLinesForTextOverflow):
        * khtml/rendering/break_lines.cpp:
        (khtml::isBreakable):
        * khtml/rendering/font.cpp:
        (Font::drawHighlightForText):
        (Font::drawText):
        (Font::floatWidth):
        (Font::floatCharacterWidths):
        (Font::checkSelectionPoint):
        (Font::width):
        * khtml/rendering/font.h:
        * khtml/rendering/render_block.cpp:
        (khtml::stripTrailingSpace):
        (khtml::RenderBlock::calcInlineMinMaxWidth):
        * khtml/rendering/render_block.h:
        * khtml/rendering/render_br.h:
        (khtml::RenderBR::width):
        * khtml/rendering/render_flexbox.cpp:
        (khtml::RenderFlexibleBox::layoutVerticalBox):
        * khtml/rendering/render_image.cpp:
        (RenderImage::setPixmap):
        (RenderImage::paint):
        * khtml/rendering/render_line.cpp:
        (khtml::EllipsisBox::paint):
        * khtml/rendering/render_line.h:
        (khtml::InlineBox::width):
        (khtml::InlineBox::xPos):
        (khtml::InlineBox::yPos):
        (khtml::InlineBox::height):
        (khtml::InlineBox::baseline):
        * khtml/rendering/render_list.cpp:
        (RenderListMarker::paint):
        (RenderListMarker::calcMinMaxWidth):
        * khtml/rendering/render_object.cpp:
        (RenderObject::recalcMinMaxWidths):
        * khtml/rendering/render_object.h:
        * khtml/rendering/render_replaced.cpp:
        * khtml/rendering/render_text.cpp:
        (InlineTextBox::selectionRect):
        (InlineTextBox::paint):
        (InlineTextBox::paintSelection):
        (InlineTextBox::paintMarkedTextBackground):
        (InlineTextBox::offsetForPosition):
        (InlineTextBox::positionForOffset):
        (RenderText::cacheWidths):
        (RenderText::widthFromCache):
        (RenderText::trimmedMinMaxWidth):
        (RenderText::calcMinMaxWidth):
        (RenderText::containsOnlyWhitespace):
        (RenderText::width):
        * khtml/rendering/render_text.h:
        * kwq/KWQFontMetrics.h:
        * kwq/KWQFontMetrics.mm:
        (QFontMetrics::width):
        (QFontMetrics::charWidth):
        (QFontMetrics::floatWidth):
        (QFontMetrics::floatCharacterWidths):
        (QFontMetrics::checkSelectionPoint):
        (QFontMetrics::boundingRect):
        (QFontMetrics::size):
        * kwq/KWQPainter.h:
        * kwq/KWQPainter.mm:
        (QPainter::drawText):
        (QPainter::drawHighlightForText):
        * kwq/WebCoreTextRenderer.h:
        * kwq/WebCoreTextRendererFactory.mm:
        (WebCoreInitializeEmptyTextStyle):
        * layout-tests/editing/deleting/delete-tab-001-expected.txt:
        * layout-tests/editing/deleting/delete-tab-001.html:
        * layout-tests/editing/deleting/delete-tab-002-expected.txt:
        * layout-tests/editing/deleting/delete-tab-002.html:
        * layout-tests/editing/deleting/delete-tab-003-expected.txt:
        * layout-tests/editing/deleting/delete-tab-003.html:
        * layout-tests/editing/deleting/delete-tab-004-expected.txt:
        * layout-tests/editing/deleting/delete-tab-004.html:
        * layout-tests/editing/inserting/insert-tab-001-expected.txt:
        * layout-tests/editing/inserting/insert-tab-002-expected.txt:
        * layout-tests/editing/inserting/insert-tab-003-expected.txt:
        * layout-tests/editing/inserting/insert-tab-004-expected.txt:
        * layout-tests/fast/dom/quadraticCurveTo-expected.txt:
        * layout-tests/fast/js/string-replace-2-expected.txt:
        * layout-tests/fast/table/039-expected.txt:
        * layout-tests/fast/table/border-collapsing/004-expected.txt:
        * layout-tests/fast/tokenizer/script_extra_close-expected.txt:

WebKit:

       Rolling out changes for <rdar://problem/3792529> REGRESSION (Mail): Tabs do not work the way they did in Panther (especially useful in plain text mail)
       since it caused a 2% performance regression.

        * WebCoreSupport.subproj/WebTextRenderer.m:
        (isSpace):
        (-[WebTextRenderer _CG_drawHighlightForRun:style:geometry:]):
        (-[WebTextRenderer _CG_floatWidthForRun:style:widths:fonts:glyphs:startPosition:numGlyphs:]):
        (-[WebTextRenderer _extendCharacterToGlyphMapToInclude:]):
        (-[WebTextRenderer _CG_pointToOffset:style:position:reversed:includePartialGlyphs:]):
        (initializeCharacterWidthIterator):
        (widthForNextCharacter):

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

55 files changed:
LayoutTests/editing/deleting/delete-tab-001-expected.txt
LayoutTests/editing/deleting/delete-tab-001.html
LayoutTests/editing/deleting/delete-tab-002-expected.txt
LayoutTests/editing/deleting/delete-tab-002.html
LayoutTests/editing/deleting/delete-tab-003-expected.txt
LayoutTests/editing/deleting/delete-tab-003.html
LayoutTests/editing/deleting/delete-tab-004-expected.txt
LayoutTests/editing/deleting/delete-tab-004.html
LayoutTests/editing/inserting/insert-tab-001-expected.txt
LayoutTests/editing/inserting/insert-tab-002-expected.txt
LayoutTests/editing/inserting/insert-tab-003-expected.txt
LayoutTests/editing/inserting/insert-tab-004-expected.txt
LayoutTests/fast/dom/quadraticCurveTo-expected.txt
LayoutTests/fast/js/string-replace-2-expected.txt
LayoutTests/fast/table/039-expected.txt
LayoutTests/fast/table/border-collapsing/004-expected.txt
LayoutTests/fast/tokenizer/script_extra_close-expected.txt
WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/apply_style_command.cpp
WebCore/khtml/editing/delete_selection_command.cpp
WebCore/khtml/editing/edit_command.cpp
WebCore/khtml/editing/html_interchange.h
WebCore/khtml/editing/htmlediting.cpp
WebCore/khtml/editing/htmlediting.h
WebCore/khtml/editing/insert_text_command.cpp
WebCore/khtml/editing/insert_text_command.h
WebCore/khtml/editing/markup.cpp
WebCore/khtml/editing/replace_selection_command.cpp
WebCore/khtml/html/htmltokenizer.cpp
WebCore/khtml/html/htmltokenizer.h
WebCore/khtml/rendering/bidi.cpp
WebCore/khtml/rendering/break_lines.cpp
WebCore/khtml/rendering/font.cpp
WebCore/khtml/rendering/font.h
WebCore/khtml/rendering/render_block.cpp
WebCore/khtml/rendering/render_block.h
WebCore/khtml/rendering/render_br.h
WebCore/khtml/rendering/render_flexbox.cpp
WebCore/khtml/rendering/render_image.cpp
WebCore/khtml/rendering/render_line.cpp
WebCore/khtml/rendering/render_line.h
WebCore/khtml/rendering/render_list.cpp
WebCore/khtml/rendering/render_object.cpp
WebCore/khtml/rendering/render_object.h
WebCore/khtml/rendering/render_replaced.cpp
WebCore/khtml/rendering/render_text.cpp
WebCore/khtml/rendering/render_text.h
WebCore/kwq/KWQFontMetrics.h
WebCore/kwq/KWQFontMetrics.mm
WebCore/kwq/KWQPainter.h
WebCore/kwq/KWQPainter.mm
WebCore/kwq/WebCoreTextRenderer.h
WebCore/kwq/WebCoreTextRendererFactory.mm
WebKit/ChangeLog
WebKit/WebCoreSupport.subproj/WebTextRenderer.m

index 503a8076266eaf72cc7917595c15c5dabc3b3ce7..87fd304e29ba50276d98b3acd09b761903bbdd0d 100644 (file)
@@ -4,11 +4,8 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 80x28
-          RenderInline {SPAN} at (0,0) size 48x28
-            RenderText {TEXT} at (14,14) size 48x28
-              text run at (14,14) width 48: "\x{9}"
-          RenderText {TEXT} at (62,14) size 32x28
-            text run at (62,14) width 32: "foo"
+        RenderInline {SPAN} at (0,0) size 56x28
+          RenderText {TEXT} at (14,14) size 56x28
+            text run at (14,14) width 56: "    foo"
         RenderText {TEXT} at (0,0) size 0x0
-caret: position 1 of child 0 {TEXT} of child 0 {SPAN} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
+caret: position 4 of child 0 {TEXT} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
index c8068007feb2fbdca52c7fe0f7b48cea9998fd9d..b70368a8d8c292d6c465eafda1a9c8d1964173b2 100644 (file)
@@ -15,7 +15,8 @@
 function editingTest() {
     typeCharacterCommand('\t');
     typeCharacterCommand('\t');
-    deleteCommand();
+    for (i = 0; i < 4; i++)
+        deleteCommand();
 }
 
 </script>
index 2fbf9a47a8d01e1a3a084434c86ee28a6e061732..42648253deb1615cdcd94098e000428b46eb229e 100644 (file)
@@ -4,10 +4,7 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 48x28
-          RenderText {TEXT} at (14,14) size 32x28
-            text run at (14,14) width 32: "foo"
-          RenderInline {SPAN} at (0,0) size 16x28
-            RenderText {TEXT} at (46,14) size 16x28
-              text run at (46,14) width 16: "\x{9}"
-caret: position 1 of child 0 {TEXT} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
+        RenderInline {SPAN} at (0,0) size 56x28
+          RenderText {TEXT} at (14,14) size 56x28
+            text run at (14,14) width 56: "foo    "
+caret: position 7 of child 0 {TEXT} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
index 4a3c0641c638846890e24b3f1dc7148758fee92f..c5720ef7e9e69648cb52079df84e84a3d0e775f7 100644 (file)
@@ -17,7 +17,8 @@ function editingTest() {
         moveSelectionForwardByCharacterCommand();
     typeCharacterCommand('\t');
     typeCharacterCommand('\t');
-    deleteCommand();
+    for (i = 0; i < 4; i++)
+        deleteCommand();
 }
 
 </script>
index 7d4663106d2e23fe1843e2345bec4bcbc82ad3d2..bc7d6e4af1589ad325d24111e3349d42680d8064 100644 (file)
@@ -4,13 +4,8 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 60x28
-          RenderText {TEXT} at (14,14) size 20x28
-            text run at (14,14) width 20: "fo"
-          RenderInline {SPAN} at (0,0) size 28x28
-            RenderText {TEXT} at (34,14) size 28x28
-              text run at (34,14) width 28: "\x{9}"
-          RenderText {TEXT} at (62,14) size 12x28
-            text run at (62,14) width 12: "o"
+        RenderInline {SPAN} at (0,0) size 56x28
+          RenderText {TEXT} at (14,14) size 56x28
+            text run at (14,14) width 56: "fo    o"
         RenderText {TEXT} at (0,0) size 0x0
-caret: position 1 of child 0 {TEXT} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
+caret: position 6 of child 0 {TEXT} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
index 9fe0f5789aa7383956df08f8eb321af4221ca382..fc40a5aef46456eb3eb075a69021ece336bd403d 100644 (file)
@@ -17,7 +17,8 @@ function editingTest() {
         moveSelectionForwardByCharacterCommand();
     typeCharacterCommand('\t');
     typeCharacterCommand('\t');
-    deleteCommand();
+    for (i = 0; i < 4; i++)
+        deleteCommand();
 }
 
 </script>
index 30bac16c2e1dad464a72a3e70073e3f3504cbda4..477cf06201135124db2987bf3e747fbb6d5b2da8 100644 (file)
@@ -4,12 +4,9 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x84 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 80x56
+        RenderInline {SPAN} at (0,0) size 56x56
           RenderBR {BR} at (14,14) size 0x28
-          RenderInline {SPAN} at (0,0) size 48x28
-            RenderText {TEXT} at (14,42) size 48x28
-              text run at (14,42) width 48: "\x{9}"
-          RenderText {TEXT} at (62,42) size 32x28
-            text run at (62,42) width 32: "foo"
+          RenderText {TEXT} at (14,42) size 56x28
+            text run at (14,42) width 56: "    foo"
         RenderText {TEXT} at (0,0) size 0x0
-caret: position 1 of child 0 {TEXT} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
+caret: position 4 of child 1 {TEXT} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
index 88f1d2835548f675fdbee96ec80155807ce0626e..3e953241694eb01d977632435c240b83747073fd 100644 (file)
@@ -16,7 +16,8 @@ function editingTest() {
     insertLineBreakCommand();
     typeCharacterCommand('\t');
     typeCharacterCommand('\t');
-    deleteCommand();
+    for (i = 0; i < 4; i++)
+        deleteCommand();
 }
 
 </script>
index 503a8076266eaf72cc7917595c15c5dabc3b3ce7..87fd304e29ba50276d98b3acd09b761903bbdd0d 100644 (file)
@@ -4,11 +4,8 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 80x28
-          RenderInline {SPAN} at (0,0) size 48x28
-            RenderText {TEXT} at (14,14) size 48x28
-              text run at (14,14) width 48: "\x{9}"
-          RenderText {TEXT} at (62,14) size 32x28
-            text run at (62,14) width 32: "foo"
+        RenderInline {SPAN} at (0,0) size 56x28
+          RenderText {TEXT} at (14,14) size 56x28
+            text run at (14,14) width 56: "    foo"
         RenderText {TEXT} at (0,0) size 0x0
-caret: position 1 of child 0 {TEXT} of child 0 {SPAN} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
+caret: position 4 of child 0 {TEXT} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
index 6d3c4f1d2855fc5d77062d4bf62eda3e9fa4b0a6..e1571e9ba7b02da5229cb4525d60092497c074d8 100644 (file)
@@ -4,11 +4,8 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 48x28
-          RenderText {TEXT} at (14,14) size 32x28
-            text run at (14,14) width 32: "foo"
-          RenderInline {SPAN} at (0,0) size 16x28
-            RenderText {TEXT} at (46,14) size 16x28
-              text run at (46,14) width 16: "\x{9}"
+        RenderInline {SPAN} at (0,0) size 56x28
+          RenderText {TEXT} at (14,14) size 56x28
+            text run at (14,14) width 56: "foo    "
         RenderText {TEXT} at (0,0) size 0x0
-caret: position 1 of child 0 {TEXT} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
+caret: position 7 of child 0 {TEXT} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
index 7d4663106d2e23fe1843e2345bec4bcbc82ad3d2..bc7d6e4af1589ad325d24111e3349d42680d8064 100644 (file)
@@ -4,13 +4,8 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 60x28
-          RenderText {TEXT} at (14,14) size 20x28
-            text run at (14,14) width 20: "fo"
-          RenderInline {SPAN} at (0,0) size 28x28
-            RenderText {TEXT} at (34,14) size 28x28
-              text run at (34,14) width 28: "\x{9}"
-          RenderText {TEXT} at (62,14) size 12x28
-            text run at (62,14) width 12: "o"
+        RenderInline {SPAN} at (0,0) size 56x28
+          RenderText {TEXT} at (14,14) size 56x28
+            text run at (14,14) width 56: "fo    o"
         RenderText {TEXT} at (0,0) size 0x0
-caret: position 1 of child 0 {TEXT} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
+caret: position 6 of child 0 {TEXT} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
index 30bac16c2e1dad464a72a3e70073e3f3504cbda4..477cf06201135124db2987bf3e747fbb6d5b2da8 100644 (file)
@@ -4,12 +4,9 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x84 [border: (2px solid #FF0000)]
-        RenderInline {SPAN} at (0,0) size 80x56
+        RenderInline {SPAN} at (0,0) size 56x56
           RenderBR {BR} at (14,14) size 0x28
-          RenderInline {SPAN} at (0,0) size 48x28
-            RenderText {TEXT} at (14,42) size 48x28
-              text run at (14,42) width 48: "\x{9}"
-          RenderText {TEXT} at (62,42) size 32x28
-            text run at (62,42) width 32: "foo"
+          RenderText {TEXT} at (14,42) size 56x28
+            text run at (14,42) width 56: "    foo"
         RenderText {TEXT} at (0,0) size 0x0
-caret: position 1 of child 0 {TEXT} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
+caret: position 4 of child 1 {TEXT} of child 1 {SPAN} of child 1 {DIV} of child 1 {BODY} of child 0 {HTML} of document
index d3bd5cd1a67f8f8b09d532570e85ccb35a499dff..db8fa09b63f52efae98f9811286a20b652765566 100644 (file)
@@ -4,8 +4,9 @@ layer at (0,0) size 800x414
   RenderBlock {HTML} at (0,0) size 800x414
     RenderBody {BODY} at (8,16) size 784x18
       RenderBlock {P} at (0,0) size 784x18
-        RenderText {TEXT} at (0,0) size 416x18
-          text run at (0,0) width 358: "This test case should produce a sine-wave stroked with 1"
-          text run at (358,0) width 58: "px black."
+        RenderText {TEXT} at (0,0) size 420x18
+          text run at (0,0) width 358: "\x{9}\x{9}\x{9}This test case should produce a sine-wave stroked with 1"
+          text run at (358,0) width 62: "px black. "
+          text run at (420,0) width 0: "\x{9}\x{9}"
     RenderBlock (anonymous) at (0,50) size 800x364
       RenderCanvasImage {CANVAS} at (0,0) size 480x360
index f657389855f6c318b4e35a6765148c451b1c015a..3968b0a4031a16d0f90ba53c8949f0df9cbdb8e4 100644 (file)
@@ -17,7 +17,7 @@ Your result: "-t's th- -nd -f th- w-rld -s w- kn-w -t, -nd - f--l f-n-."
 Support for String.replace(/…/,myFunction)
 
 function Capitalize(s){
-       return s.toUpperCase();
+        return s.toUpperCase();
 }
 result = foo.replace(vowels,Capitalize);
 Expected result: "It's thE End Of thE wOrld As wE knOw It, And I fEEl fInE."
@@ -26,7 +26,7 @@ Your result: "It's thE End Of thE wOrld As wE knOw It, And I fEEl fInE."
 Support for String.replace(/…/,myFunction), using RegExp
 
 function Capitalize(){
-       return RegExp.$1.toUpperCase()+RegExp.$2;
+        return RegExp.$1.toUpperCase()+RegExp.$2;
 }
 result = foo.replace(/([aeiou])([a-z])/g,Capitalize);
 Expected result: "It's the End Of the wOrld As we knOw It, And I fEel fIne."
@@ -35,7 +35,7 @@ Your result: "It's the End Of the wOrld As we knOw It, And I fEel fIne."
 Support for String.replace(/…/,myFunction), using parameters
 
 function Capitalize(orig,re1,re2){
-       return re1.toUpperCase()+re2;
+        return re1.toUpperCase()+re2;
 }
 result = foo.replace(/([aeiou])([a-z])/g,Capitalize);
 Expected result: "It's the End Of the wOrld As we knOw It, And I fEel fIne."
index 410d41cd288ae3826d3401a78894a75374ed7b08..2b8a6bb18e22baa7aa1c84894dbaf993c961dfec 100644 (file)
@@ -42,11 +42,19 @@ layer at (0,0) size 800x600
           RenderText {TEXT} at (0,0) size 49x18
             text run at (0,0) width 49: "Row 0:"
         RenderText {TEXT} at (49,0) size 170x18
-          text run at (49,0) width 170: " (1,1)\x{9}(1,2)\x{9}(1,3)\x{9}(1,4)\x{9}(1,5)"
+          text run at (49,0) width 38: " (1,1) "
+          text run at (87,0) width 34: "(1,2) "
+          text run at (121,0) width 34: "(1,3) "
+          text run at (155,0) width 34: "(1,4) "
+          text run at (189,0) width 30: "(1,5)"
         RenderBR {BR} at (0,0) size 0x0
         RenderInline {B} at (0,0) size 49x18
           RenderText {TEXT} at (0,18) size 49x18
             text run at (0,18) width 49: "Row 1:"
         RenderText {TEXT} at (49,18) size 170x18
-          text run at (49,18) width 170: " (2,1)\x{9}(2,2)\x{9}(2,3)\x{9}(2,4)\x{9}(2,5)"
+          text run at (49,18) width 38: " (2,1) "
+          text run at (87,18) width 34: "(2,2) "
+          text run at (121,18) width 34: "(2,3) "
+          text run at (155,18) width 34: "(2,4) "
+          text run at (189,18) width 30: "(2,5)"
         RenderBR {BR} at (0,0) size 0x0
index 17c9c521091f9cac873aa895f8e21d65bf9e86e9..e1fefbf4748a9b474e7154214ac8750bf15b0351 100644 (file)
@@ -17,9 +17,9 @@ layer at (0,0) size 800x1438
           text run at (333,0) width 172: "The styles applied here are:"
       RenderBlock {PRE} at (0,92) size 784x180
         RenderText {TEXT} at (0,0) size 688x180
-          text run at (0,0) width 152: "TABLE\x{9}{ margin: 1"
+          text run at (0,0) width 152: "TABLE   { margin: 1"
           text run at (152,0) width 256: "em; border: medium solid blue; }"
-          text run at (0,15) width 368: "TD\x{9}{ border: thin solid green; padding: 5"
+          text run at (0,15) width 368: "TD      { border: thin solid green; padding: 5"
           text run at (368,15) width 40: "px; }"
           text run at (0,30) width 352: "TH { border: medium solid purple; padding: 5"
           text run at (352,30) width 40: "px; }"
@@ -34,7 +34,7 @@ layer at (0,0) size 800x1438
           text run at (0,120) width 328: "TABLE.five { border-collapse: separate; }"
           text run at (0,135) width 464: "TABLE.five, TABLE.five TD, TABLE.five TH { border: none; }"
           text run at (0,150) width 688: "TABLE.five TR, TABLE.five COL, TABLE.five COLGROUP, TABLE.five TBODY, TABLE.five THEAD"
-          text run at (0,165) width 296: "\x{9}{ border: medium solid red; }"
+          text run at (0,165) width 296: "        { border: medium solid red; }"
       RenderTable {TABLE} at (16,288) size 752x163
         RenderTableSection {TBODY} at (0,0) size 0x163
           RenderTableRow {TR} at (0,0) size 0x0
index 3b09c3741caeb973fe1ee7743b693d8f1cbfabfe..cafc5c39fa99e62729bcb669bc499e7cb37538ea 100644 (file)
@@ -4,7 +4,7 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderText {TEXT} at (0,0) size 55x18
-        text run at (0,0) width 55: "TEST...\x{9}"
+        text run at (0,0) width 55: "TEST... "
       RenderText {TEXT} at (0,0) size 0x0
       RenderText {TEXT} at (0,0) size 0x0
       RenderText {TEXT} at (55,0) size 232x18
index 32d40ffca5c1ef00ab4ee71563d63a81ad51b282..84cd90a1c4a710435dc6ae6424d73647ed6fd8ca 100644 (file)
@@ -1,3 +1,127 @@
+2005-07-05  Adele Peterson  <adele@apple.com>
+
+       Rolling out changes for <rdar://problem/3792529> REGRESSION (Mail): Tabs do not work the way they did in Panther (especially useful in plain text mail)
+       since it caused a 2% performance regression.
+
+        * khtml/editing/apply_style_command.cpp:
+        (khtml::createStyleSpanElement):
+        (khtml::ApplyStyleCommand::removeCSSStyle):
+        (khtml::ApplyStyleCommand::addInlineStyleIfNeeded):
+        * khtml/editing/delete_selection_command.cpp:
+        (khtml::DeleteSelectionCommand::saveTypingStyleState):
+        * khtml/editing/edit_command.cpp:
+        (khtml::EditCommand::styleAtPosition):
+        * khtml/editing/html_interchange.h:
+        * khtml/editing/htmlediting.cpp:
+        (khtml::isSpecialElement):
+        * khtml/editing/htmlediting.h:
+        * khtml/editing/insert_text_command.cpp:
+        (khtml::InsertTextCommand::prepareForTextInsertion):
+        (khtml::InsertTextCommand::input):
+        * khtml/editing/insert_text_command.h:
+        * khtml/editing/markup.cpp:
+        (khtml::createFragmentFromText):
+        * khtml/editing/replace_selection_command.cpp:
+        (khtml::ReplacementFragment::removeStyleNodes):
+        * khtml/html/htmltokenizer.cpp:
+        (khtml::HTMLTokenizer::begin):
+        (khtml::HTMLTokenizer::processListing):
+        (khtml::HTMLTokenizer::parseEntity):
+        (khtml::HTMLTokenizer::parseTag):
+        (khtml::HTMLTokenizer::addPending):
+        (khtml::HTMLTokenizer::write):
+        * khtml/html/htmltokenizer.h:
+        (khtml::HTMLTokenizer::):
+        * khtml/rendering/bidi.cpp:
+        (khtml::addRun):
+        (khtml::RenderBlock::computeHorizontalPositionsForLine):
+        (khtml::RenderBlock::skipWhitespace):
+        (khtml::RenderBlock::findNextLineBreak):
+        (khtml::RenderBlock::checkLinesForTextOverflow):
+        * khtml/rendering/break_lines.cpp:
+        (khtml::isBreakable):
+        * khtml/rendering/font.cpp:
+        (Font::drawHighlightForText):
+        (Font::drawText):
+        (Font::floatWidth):
+        (Font::floatCharacterWidths):
+        (Font::checkSelectionPoint):
+        (Font::width):
+        * khtml/rendering/font.h:
+        * khtml/rendering/render_block.cpp:
+        (khtml::stripTrailingSpace):
+        (khtml::RenderBlock::calcInlineMinMaxWidth):
+        * khtml/rendering/render_block.h:
+        * khtml/rendering/render_br.h:
+        (khtml::RenderBR::width):
+        * khtml/rendering/render_flexbox.cpp:
+        (khtml::RenderFlexibleBox::layoutVerticalBox):
+        * khtml/rendering/render_image.cpp:
+        (RenderImage::setPixmap):
+        (RenderImage::paint):
+        * khtml/rendering/render_line.cpp:
+        (khtml::EllipsisBox::paint):
+        * khtml/rendering/render_line.h:
+        (khtml::InlineBox::width):
+        (khtml::InlineBox::xPos):
+        (khtml::InlineBox::yPos):
+        (khtml::InlineBox::height):
+        (khtml::InlineBox::baseline):
+        * khtml/rendering/render_list.cpp:
+        (RenderListMarker::paint):
+        (RenderListMarker::calcMinMaxWidth):
+        * khtml/rendering/render_object.cpp:
+        (RenderObject::recalcMinMaxWidths):
+        * khtml/rendering/render_object.h:
+        * khtml/rendering/render_replaced.cpp:
+        * khtml/rendering/render_text.cpp:
+        (InlineTextBox::selectionRect):
+        (InlineTextBox::paint):
+        (InlineTextBox::paintSelection):
+        (InlineTextBox::paintMarkedTextBackground):
+        (InlineTextBox::offsetForPosition):
+        (InlineTextBox::positionForOffset):
+        (RenderText::cacheWidths):
+        (RenderText::widthFromCache):
+        (RenderText::trimmedMinMaxWidth):
+        (RenderText::calcMinMaxWidth):
+        (RenderText::containsOnlyWhitespace):
+        (RenderText::width):
+        * khtml/rendering/render_text.h:
+        * kwq/KWQFontMetrics.h:
+        * kwq/KWQFontMetrics.mm:
+        (QFontMetrics::width):
+        (QFontMetrics::charWidth):
+        (QFontMetrics::floatWidth):
+        (QFontMetrics::floatCharacterWidths):
+        (QFontMetrics::checkSelectionPoint):
+        (QFontMetrics::boundingRect):
+        (QFontMetrics::size):
+        * kwq/KWQPainter.h:
+        * kwq/KWQPainter.mm:
+        (QPainter::drawText):
+        (QPainter::drawHighlightForText):
+        * kwq/WebCoreTextRenderer.h:
+        * kwq/WebCoreTextRendererFactory.mm:
+        (WebCoreInitializeEmptyTextStyle):
+        * layout-tests/editing/deleting/delete-tab-001-expected.txt:
+        * layout-tests/editing/deleting/delete-tab-001.html:
+        * layout-tests/editing/deleting/delete-tab-002-expected.txt:
+        * layout-tests/editing/deleting/delete-tab-002.html:
+        * layout-tests/editing/deleting/delete-tab-003-expected.txt:
+        * layout-tests/editing/deleting/delete-tab-003.html:
+        * layout-tests/editing/deleting/delete-tab-004-expected.txt:
+        * layout-tests/editing/deleting/delete-tab-004.html:
+        * layout-tests/editing/inserting/insert-tab-001-expected.txt:
+        * layout-tests/editing/inserting/insert-tab-002-expected.txt:
+        * layout-tests/editing/inserting/insert-tab-003-expected.txt:
+        * layout-tests/editing/inserting/insert-tab-004-expected.txt:
+        * layout-tests/fast/dom/quadraticCurveTo-expected.txt:
+        * layout-tests/fast/js/string-replace-2-expected.txt:
+        * layout-tests/fast/table/039-expected.txt:
+        * layout-tests/fast/table/border-collapsing/004-expected.txt:
+        * layout-tests/fast/tokenizer/script_extra_close-expected.txt:
+
 2005-07-05  Beth Dakin  <bdakin@apple.com>
 
        Adding colspan test for HTMLTableElement and bdo test for HTMLElement.
index 838a0f280c65a40e6cf150159ee381330b9ce4df..f91aa30ba88cb53978a77a7a3b1063b44affbe66 100644 (file)
@@ -32,7 +32,6 @@
 #include "css/cssparser.h"
 #include "css/cssproperties.h"
 #include "dom/dom_string.h"
-#include "htmlediting.h"
 #include "html/html_elementimpl.h"
 #include "misc/htmltags.h"
 #include "misc/htmlattrs.h"
@@ -285,7 +284,7 @@ static ElementImpl *createFontElement(DocumentImpl *document)
 ElementImpl *createStyleSpanElement(DocumentImpl *document)
 {
     int exceptionCode = 0;
-    ElementImpl *styleElement = document->createHTMLElement("span", exceptionCode);
+    ElementImpl *styleElement = document->createHTMLElement("SPAN", exceptionCode);
     ASSERT(exceptionCode == 0);
     styleElement->setAttribute(ATTR_CLASS, styleSpanClassString());
     return styleElement;
@@ -679,8 +678,6 @@ void ApplyStyleCommand::removeCSSStyle(CSSMutableStyleDeclarationImpl *style, HT
         int propertyID = (*it).id();
         CSSValueImpl *value = decl->getPropertyCSSValue(propertyID);
         if (value) {
-            if (propertyID == CSS_PROP_WHITE_SPACE && isTabSpanNode(elem))
-                continue;
             value->ref();
             removeCSSProperty(decl, propertyID);
             value->deref();
@@ -1251,10 +1248,6 @@ void ApplyStyleCommand::addInlineStyleIfNeeded(CSSMutableStyleDeclarationImpl *s
     StyleChange styleChange(style, Position(startNode, 0), StyleChange::styleModeForParseMode(document()->inCompatMode()));
     int exceptionCode = 0;
     
-    // Prevent style changes to our tab spans, because it might remove the whitespace:pre we are after
-    if (isTabSpanTextNode(startNode))
-        return;
-    
     //
     // Font tags need to go outside of CSS so that CSS font sizes override leagcy font sizes.
     //
index 1dbbe6e7a646268635c40f7793c0c3bbb0ca50e1..b8d2c76e4165aad1f9258acb1828e42f7dc395ad 100644 (file)
@@ -267,7 +267,7 @@ void DeleteSelectionCommand::saveTypingStyleState()
     // Figure out the typing style in effect before the delete is done.
     // FIXME: Improve typing style.
     // See this bug: <rdar://problem/3769899> Implementation of typing style needs improvement
-    CSSComputedStyleDeclarationImpl *computedStyle = positionBeforeTabSpan(m_selectionToDelete.start()).computedStyle();
+    CSSComputedStyleDeclarationImpl *computedStyle = m_selectionToDelete.start().computedStyle();
     computedStyle->ref();
     m_typingStyle = computedStyle->copyInheritableProperties();
     m_typingStyle->ref();
index 5874477b1d0efe31cc9b70c4f9dc9d263c8ba49c..beaaef6ffe4f2d8b1e71ed05d7541cb01ce4c053 100644 (file)
@@ -26,7 +26,6 @@
 #include "edit_command.h"
 #include "selection.h"
 #include "khtml_part.h"
-#include "htmlediting.h"
 
 #include "xml/dom_position.h"
 #include "xml/dom_docimpl.h"
@@ -390,7 +389,7 @@ bool EditCommand::isTypingCommand() const
 
 CSSMutableStyleDeclarationImpl *EditCommand::styleAtPosition(const Position &pos)
 {
-    CSSComputedStyleDeclarationImpl *computedStyle = positionBeforeTabSpan(pos).computedStyle();
+    CSSComputedStyleDeclarationImpl *computedStyle = pos.computedStyle();
     computedStyle->ref();
     CSSMutableStyleDeclarationImpl *style = computedStyle->copyInheritableProperties();
     computedStyle->deref();
index 85a4cb971c6b79ab18b8ac3053bfe501f5d18f7c..24f6fb395f88d4faceb0fd9a118fe4ef8b81951f 100644 (file)
@@ -32,7 +32,6 @@ class QString;
 #define AppleConvertedSpace       "Apple-converted-space"
 #define ApplePasteAsQuotation     "Apple-paste-as-quotation"
 #define AppleStyleSpanClass       "Apple-style-span"
-#define AppleTabSpanClass         "Apple-tab-span"
 
 enum EAnnotateForInterchange { DoNotAnnotateForInterchange, AnnotateForInterchange };
 
index e475712c3cce92e9f64c785c88fca36d041f4784..5159d135212556fd85e064e0fe6453eb75c895bd 100644 (file)
@@ -126,11 +126,8 @@ static int maxRangeOffset(NodeImpl *n)
     return 1;
 }
 
-bool isSpecialElement(const NodeImpl *n)
+bool isSpecialElement(NodeImpl *n)
 {
-    if (!n)
-        return false;
-        
     if (!n->isHTMLElement())
         return false;
 
@@ -141,18 +138,16 @@ bool isSpecialElement(const NodeImpl *n)
         return true;
 
     RenderObject *renderer = n->renderer();
-    if (!renderer)
-        return false;
-        
-    if (renderer->style()->display() == TABLE || renderer->style()->display() == INLINE_TABLE)
+
+    if (renderer && (renderer->style()->display() == TABLE || renderer->style()->display() == INLINE_TABLE))
         return true;
 
-    if (renderer->style()->isFloating())
+    if (renderer && renderer->style()->isFloating())
         return true;
 
-    if (renderer->style()->position() != STATIC)
+    if (renderer && renderer->style()->position() != STATIC)
         return true;
-        
+
     return false;
 }
 
@@ -285,50 +280,6 @@ ElementImpl *createBreakElement(DocumentImpl *document)
     return breakNode;
 }
 
-bool isTabSpanNode(const NodeImpl *node)
-{
-    return (node && node->isElementNode() && static_cast<const ElementImpl *>(node)->getAttribute("class") == AppleTabSpanClass);
-}
-
-bool isTabSpanTextNode(const NodeImpl *node)
-{
-    return (node && node->parentNode() && isTabSpanNode(node->parentNode()));
-}
-
-Position positionBeforeTabSpan(const Position& pos)
-{
-    NodeImpl *node = pos.node();
-    if (isTabSpanTextNode(node))
-        node = node->parent();
-    else if (!isTabSpanNode(node))
-        return pos;
-    
-    return Position(node->parentNode(), node->nodeIndex());
-}
-
-ElementImpl *createTabSpanElement(DocumentImpl *document, NodeImpl *tabTextNode)
-{
-    // make the span to hold the tab
-    int exceptionCode = 0;
-    ElementImpl *spanElement = document->createHTMLElement("span", exceptionCode);
-    assert(exceptionCode == 0);
-    spanElement->setAttribute(ATTR_CLASS, AppleTabSpanClass);
-    spanElement->setAttribute(ATTR_STYLE, "white-space:pre");
-
-    // add tab text to that span
-    if (!tabTextNode)
-        tabTextNode = document->createEditingTextNode("\t");
-    spanElement->appendChild(tabTextNode, exceptionCode);
-    assert(exceptionCode == 0);
-
-    return spanElement;
-}
-
-ElementImpl *createTabSpanElement(DocumentImpl *document, QString *tabText)
-{
-    return createTabSpanElement(document, document->createTextNode(*tabText));
-}
-
 bool isNodeRendered(const NodeImpl *node)
 {
     if (!node)
index cd4b8c6e0ae0cc1b8731376f58c19735716fcff7..daa7a4b345ec2a084267485465648f6cac4ce204 100644 (file)
@@ -58,21 +58,15 @@ void derefNodesInList(QPtrList<DOM::NodeImpl> &list);
 
 //------------------------------------------------------------------------------------------
 
-bool isSpecialElement(const DOM::NodeImpl *n);
-
 DOM::ElementImpl *createDefaultParagraphElement(DOM::DocumentImpl *document);
 DOM::ElementImpl *createBreakElement(DOM::DocumentImpl *document);
 
-bool isTabSpanNode(const DOM::NodeImpl *node);
-bool isTabSpanTextNode(const DOM::NodeImpl *node);
-DOM::Position positionBeforeTabSpan(const DOM::Position& pos);
-DOM::ElementImpl *createTabSpanElement(DOM::DocumentImpl *document, DOM::NodeImpl *tabTextNode=0);
-DOM::ElementImpl *createTabSpanElement(DOM::DocumentImpl *document, QString *tabText);
-
 bool isNodeRendered(const DOM::NodeImpl *);
 bool isMailBlockquote(const DOM::NodeImpl *);
 DOM::NodeImpl *nearestMailBlockquote(const DOM::NodeImpl *);
 
+bool isSpecialElement(DOM::NodeImpl *n);
+
 //------------------------------------------------------------------------------------------
 
 bool isTableStructureNode(const DOM::NodeImpl *node);
index 28a768df5b6badb0ec77f6d80c446b57a452e89f..cd78c563bd76343e0413c35062f3d9164925e4b4 100644 (file)
 
 #include "khtml_part.h"
 #include "htmlediting.h"
-#include "html_interchange.h"
 #include "visible_position.h"
 #include "visible_text.h"
 #include "visible_units.h"
-#include "misc/htmlattrs.h"
 #include "xml/dom_docimpl.h"
 #include "xml/dom_position.h"
 #include "xml/dom_textimpl.h"
@@ -62,10 +60,23 @@ void InsertTextCommand::doApply()
 {
 }
 
-Position InsertTextCommand::prepareForTextInsertion(const Position& pos)
+Position InsertTextCommand::prepareForTextInsertion(bool adjustDownstream)
 {
-    // Prepare for text input by looking at the specified position.
+    // Prepare for text input by looking at the current position.
     // It may be necessary to insert a text node to receive characters.
+    Selection selection = endingSelection();
+    ASSERT(selection.isCaret());
+    
+    Position pos = selection.start();
+    if (adjustDownstream)
+        pos = pos.downstream();
+    else
+        pos = pos.upstream();
+    
+    Selection typingStyleRange;
+
+    pos = positionOutsideContainingSpecialElement(pos);
+
     if (!pos.node()->isTextNode()) {
         NodeImpl *textNode = document()->createEditingTextNode("");
         NodeImpl *nodeToInsert = textNode;
@@ -86,35 +97,14 @@ Position InsertTextCommand::prepareForTextInsertion(const Position& pos)
         else
             ASSERT_NOT_REACHED();
         
-        return Position(textNode, 0);
-    }
-
-    if (isTabSpanTextNode(pos.node())) {
-        Position tempPos = pos;
-//#ifndef COALESCE_TAB_SPANS
-#if 0
-        NodeImpl *node = pos.node()->parentNode();
-        if (pos.offset() > pos.node()->caretMinOffset())
-            tempPos = Position(node->parentNode(), node->nodeIndex() + 1);
-        else
-            tempPos = Position(node->parentNode(), node->nodeIndex());
-#endif        
-        NodeImpl *textNode = document()->createEditingTextNode("");
-        NodeImpl *originalTabSpan = tempPos.node()->parent();
-        if (tempPos.offset() <= tempPos.node()->caretMinOffset()) {
-            insertNodeBefore(textNode, originalTabSpan);
-        } else if (tempPos.offset() >= tempPos.node()->caretMaxOffset()) {
-            insertNodeAfter(textNode, originalTabSpan);
-        } else {
-            splitTextNodeContainingElement(static_cast<TextImpl *>(tempPos.node()), tempPos.offset());
-            insertNodeBefore(textNode, originalTabSpan);
-        }
-        return Position(textNode, 0);
+        pos = Position(textNode, 0);
     }
 
     return pos;
 }
 
+static const int spacesPerTab = 4;
+
 static inline bool isNBSP(const QChar &c)
 {
     return c.unicode() == 0xa0;
@@ -135,51 +125,59 @@ void InsertTextCommand::input(const DOMString &text, bool selectInsertedText)
     // out correctly after the insertion.
     selection = endingSelection();
     deleteInsignificantTextDownstream(selection.end().trailingWhitespacePosition(selection.endAffinity()));
-
-    // Figure out the startPosition
-    Position startPosition = selection.start();
+    
+    // Make sure the document is set up to receive text
+    Position startPosition = prepareForTextInsertion(adjustDownstream);
+    
     Position endPosition;
-    if (adjustDownstream)
-        startPosition = startPosition.downstream();
-    else
-        startPosition = startPosition.upstream();
-    startPosition = positionOutsideContainingSpecialElement(startPosition);
+
+    TextImpl *textNode = static_cast<TextImpl *>(startPosition.node());
+    long offset = startPosition.offset();
+
+    // Now that we are about to add content, check to see if a placeholder element
+    // can be removed.
+    removeBlockPlaceholder(textNode->enclosingBlockFlowElement());
     
+    // These are temporary implementations for inserting adjoining spaces
+    // into a document. We are working on a CSS-related whitespace solution
+    // that will replace this some day. We hope.
     if (text == "\t") {
-        endPosition = insertTab(startPosition);
-        startPosition = endPosition.previous();
-        removeBlockPlaceholder(startPosition.node()->enclosingBlockFlowElement());
-        m_charactersAdded += 1;
-    } else {
-        // Make sure the document is set up to receive text
-        startPosition = prepareForTextInsertion(startPosition);
-        removeBlockPlaceholder(startPosition.node()->enclosingBlockFlowElement());
-        TextImpl *textNode = static_cast<TextImpl *>(startPosition.node());
-        long offset = startPosition.offset();
-
-        if (text == " ") {
+        // Treat a tab like a number of spaces. This seems to be the HTML editing convention,
+        // although the number of spaces varies (we choose four spaces). 
+        // Note that there is no attempt to make this work like a real tab stop, it is merely 
+        // a set number of spaces. This also seems to be the HTML editing convention.
+        for (int i = 0; i < spacesPerTab; i++) {
             insertSpace(textNode, offset);
-            endPosition = Position(textNode, offset + 1);
-
-            m_charactersAdded++;
             rebalanceWhitespace();
+            document()->updateLayout();
         }
-        else {
-            const DOMString &existingText = textNode->data();
-            if (textNode->length() >= 2 && offset >= 2 && isNBSP(existingText[offset - 1]) && !isCollapsibleWhitespace(existingText[offset - 2])) {
-                // DOM looks like this:
-                // character nbsp caret
-                // As we are about to insert a non-whitespace character at the caret
-                // convert the nbsp to a regular space.
-                // EDIT FIXME: This needs to be improved some day to convert back only
-                // those nbsp's added by the editor to make rendering come out right.
-                replaceTextInNode(textNode, offset - 1, 1, " ");
-            }
-            insertTextIntoNode(textNode, offset, text);
-            endPosition = Position(textNode, offset + text.length());
-
-            m_charactersAdded += text.length();
+        
+        endPosition = Position(textNode, offset + spacesPerTab);
+
+        m_charactersAdded += spacesPerTab;
+    }
+    else if (text == " ") {
+        insertSpace(textNode, offset);
+        endPosition = Position(textNode, offset + 1);
+
+        m_charactersAdded++;
+        rebalanceWhitespace();
+    }
+    else {
+        const DOMString &existingText = textNode->data();
+        if (textNode->length() >= 2 && offset >= 2 && isNBSP(existingText[offset - 1]) && !isCollapsibleWhitespace(existingText[offset - 2])) {
+            // DOM looks like this:
+            // character nbsp caret
+            // As we are about to insert a non-whitespace character at the caret
+            // convert the nbsp to a regular space.
+            // EDIT FIXME: This needs to be improved some day to convert back only
+            // those nbsp's added by the editor to make rendering come out right.
+            replaceTextInNode(textNode, offset - 1, 1, " ");
         }
+        insertTextIntoNode(textNode, offset, text);
+        endPosition = Position(textNode, offset + text.length());
+
+        m_charactersAdded += text.length();
     }
 
     setEndingSelection(Selection(startPosition, DOWNSTREAM, endPosition, SEL_DEFAULT_AFFINITY));
@@ -195,56 +193,6 @@ void InsertTextCommand::input(const DOMString &text, bool selectInsertedText)
         setEndingSelection(endingSelection().end(), endingSelection().endAffinity());
 }
 
-DOM::Position InsertTextCommand::insertTab(Position pos)
-{
-    Position insertPos = VisiblePosition(pos, DOWNSTREAM).deepEquivalent();
-    NodeImpl *node = insertPos.node();
-    unsigned int offset = insertPos.offset();
-
-//#ifdef COALESCE_TAB_SPANS
-#if 1
-    // keep tabs coalesced in tab span
-    if (isTabSpanTextNode(node)) {
-        insertTextIntoNode(static_cast<TextImpl *>(node), offset, "\t");
-        return Position(node, offset + 1);
-    }
-#else
-    if (isTabSpanTextNode(node)) {
-        node = node->parentNode();
-        if (offset > (unsigned int) node->caretMinOffset())
-            insertPos = Position(node->parentNode(), node->nodeIndex() + 1);
-        else
-            insertPos = Position(node->parentNode(), node->nodeIndex());
-        node = insertPos.node();
-        offset = insertPos.offset();
-    }
-#endif
-    
-    // create new tab span
-    DOM::ElementImpl * spanNode = createTabSpanElement(document());
-    
-    // place it
-    if (!node->isTextNode()) {
-        insertNodeAt(spanNode, node, offset);
-    } else {
-        TextImpl *textNode = static_cast<TextImpl *>(node);
-        if (offset >= textNode->length()) {
-            insertNodeAfter(spanNode, textNode);
-        } else {
-            // split node to make room for the span
-            // NOTE: splitTextNode uses textNode for the
-            // second node in the split, so we need to
-            // insert the span before it.
-            if (offset > 0)
-                splitTextNode(textNode, offset);
-            insertNodeBefore(spanNode, textNode);
-        }
-    }
-    
-    // return the position following the new tab
-    return Position(spanNode->lastChild(), spanNode->lastChild()->caretMaxOffset());
-}
-
 void InsertTextCommand::insertSpace(TextImpl *textNode, unsigned long offset)
 {
     ASSERT(textNode);
index 48cd7dc7c9e1ee5c30848a47fbff03ae753040c7..dcee4c324cf45be8c03b0286da62dd82a0ae897b 100644 (file)
@@ -45,9 +45,8 @@ public:
 private:
     virtual bool isInsertTextCommand() const;
 
-    DOM::Position prepareForTextInsertion(const DOM::Position& pos);
+    DOM::Position prepareForTextInsertion(bool adjustDownstream);
     void insertSpace(DOM::TextImpl *textNode, unsigned long offset);
-    DOM::Position insertTab(DOM::Position pos);
 
     unsigned long m_charactersAdded;
 };
index 86d5ada11b5508183f6b9f340a30d966843add40..7e6b248573d4ffd93e203357fbfb733f2b3c3349 100644 (file)
@@ -485,53 +485,6 @@ QString createMarkup(const DOM::NodeImpl *node, EChildrenOnly includeChildren,
     return markup(node, includeChildren, false, nodes);
 }
 
-static void createParagraphContentsFromString(DOM::DocumentImpl *document, ElementImpl *paragraph, const QString &string)
-{
-    int exceptionCode = 0;
-    if (string.isEmpty()) {
-        NodeImpl *placeHolder = createBlockPlaceholderElement(document);
-        paragraph->appendChild(placeHolder, exceptionCode);
-        ASSERT(exceptionCode == 0);
-        return;
-    }
-
-    assert(string.find('\n') == -1);
-
-    QStringList tabList = QStringList::split('\t', string, true);
-    QString tabText = "";
-    while (!tabList.isEmpty()) {
-        QString s = tabList.first();
-        tabList.pop_front();
-
-        // append the non-tab textual part
-        if (!s.isEmpty()) {
-            if (tabText != "") {
-                paragraph->appendChild(createTabSpanElement(document, &tabText), exceptionCode);
-                ASSERT(exceptionCode == 0);
-                tabText = "";
-            }
-            NodeImpl *textNode = document->createTextNode(s);
-            paragraph->appendChild(textNode, exceptionCode);
-            ASSERT(exceptionCode == 0);
-        }
-
-        // there is a tab after every entry, except the last entry
-        // (if the last character is a tab, the list gets an extra empty entry)
-        if (!tabList.isEmpty()) {
-//#ifdef COALESCE_TAB_SPANS
-#if 1
-            tabText += '\t';
-#else
-            paragraph->appendChild(createTabSpanElement(document), exceptionCode);
-            ASSERT(exceptionCode == 0);
-#endif
-        } else if (tabText != "") {
-            paragraph->appendChild(createTabSpanElement(document, &tabText), exceptionCode);
-            ASSERT(exceptionCode == 0);
-        }
-    }
-}
-
 DOM::DocumentFragmentImpl *createFragmentFromText(DOM::DocumentImpl *document, const QString &text)
 {
     if (!document)
@@ -543,6 +496,10 @@ DOM::DocumentFragmentImpl *createFragmentFromText(DOM::DocumentImpl *document, c
     if (!text.isEmpty()) {
         QString string = text;
 
+        // Replace tabs with four plain spaces.
+        // These spaces will get converted along with the other existing spaces below.
+        string.replace('\t', "    ");
+
         // FIXME: Wrap the NBSP's in a span that says "converted space".
         int offset = 0;
         int stringLength = string.length();
@@ -588,8 +545,16 @@ DOM::DocumentFragmentImpl *createFragmentFromText(DOM::DocumentImpl *document, c
                 element->setAttribute(ATTR_CLASS, AppleInterchangeNewline);            
             } else {
                 element = createDefaultParagraphElement(document);
-                createParagraphContentsFromString(document, element, s);
+                NodeImpl *paragraphContents;
+                if (s.isEmpty()) {
+                    paragraphContents = createBlockPlaceholderElement(document);
+                } else {
+                    paragraphContents = document->createTextNode(s);
+                    ASSERT(exceptionCode == 0);
+                }
                 element->ref();
+                element->appendChild(paragraphContents, exceptionCode);
+                ASSERT(exceptionCode == 0);
             }
             fragment->appendChild(element, exceptionCode);
             ASSERT(exceptionCode == 0);
index d79354adb047b24aa8d1d84b29a6c44244ea4445..9392da403bd531def02e119355d51b5b0f45c370 100644 (file)
@@ -500,7 +500,7 @@ int ReplacementFragment::countRenderedBlocks(NodeImpl *holder)
 void ReplacementFragment::removeStyleNodes()
 {
     // Since style information has been computed and cached away in
-    // computeStylesUsingTestRendering(), these style nodes can be removed, since
+    // computeStylesForNodes(), these style nodes can be removed, since
     // the correct styles will be added back in fixupNodeStyles().
     NodeImpl *node = m_fragment->firstChild();
     while (node) {
@@ -522,9 +522,7 @@ void ReplacementFragment::removeStyleNodes()
             isStyleSpan(node)) {
             removeNodePreservingChildren(node);
         }
-        // need to skip tab span because fixupNodeStyles() is not called
-        // when replace is matching style
-        else if (node->isHTMLElement() && !isTabSpanNode(node)) {
+        else if (node->isHTMLElement()) {
             HTMLElementImpl *elem = static_cast<HTMLElementImpl *>(node);
             CSSMutableStyleDeclarationImpl *inlineStyleDecl = elem->inlineStyleDecl();
             if (inlineStyleDecl) {
index 5121c244e793ec4ccffa366ace3829552cac83e2..80b8b53bbf3454053a8a36b4c0116903c5630070 100644 (file)
@@ -311,6 +311,8 @@ void HTMLTokenizer::begin()
     tag = NoTag;
     pending = NonePending;
     discard = NoneDiscard;
+    pre = false;
+    prePos = 0;
     plaintext = false;
     xmp = false;
     processingInstruction = false;
@@ -347,11 +349,16 @@ void HTMLTokenizer::setForceSynchronous(bool force)
 
 void HTMLTokenizer::processListing(TokenizerString list)
 {
+    bool old_pre = pre;
     // This function adds the listing 'list' as
     // preformatted text-tokens to the token-collection
+    // thereby converting TABs.
+    if(!style) pre = true;
+    prePos = 0;
+
     while ( !list.isEmpty() )
     {
-        checkBuffer();
+        checkBuffer(3*TAB_SIZE);
 
         if (skipLF && ( *list != '\n' ))
         {
@@ -384,11 +391,14 @@ void HTMLTokenizer::processListing(TokenizerString list)
             }
             ++list;
         }
-        else if ( *list == ' ' )
+        else if (( *list == ' ' ) || ( *list == '\t'))
         {
             if (pending)
                 addPending();
-            pending = SpacePending;
+            if (*list == ' ')
+                pending = SpacePending;
+            else
+                pending = TabPending;
 
             ++list;
         }
@@ -398,6 +408,7 @@ void HTMLTokenizer::processListing(TokenizerString list)
             if (pending)
                 addPending();
 
+            prePos++;
             *dest++ = *list;
             ++list;
         }
@@ -406,6 +417,10 @@ void HTMLTokenizer::processListing(TokenizerString list)
 
     if (pending)
         addPending();
+
+    prePos = 0;
+
+    pre = old_pre;
 }
 
 void HTMLTokenizer::parseSpecial(TokenizerString &src)
@@ -926,6 +941,8 @@ void HTMLTokenizer::parseEntity(TokenizerString &src, QChar *&dest, bool start)
                 for(unsigned int i = 0; i < cBufferPos; i++)
                     dest[i] = cBuffer[i];
                 dest += cBufferPos;
+                if (pre)
+                    prePos += cBufferPos+1;
             }
 
             Entity = NoEntity;
@@ -1397,8 +1414,17 @@ void HTMLTokenizer::parseTag(TokenizerString &src)
 
             processToken();
 
+            // we have to take care to close the pre block in
+            // case we encounter an unallowed element....
+            if(pre && beginTag && !DOM::checkChild(ID_PRE, tagID, !parser->doc()->inCompatMode())) {
+                kdDebug(6036) << " not allowed in <pre> " << (int)tagID << endl;
+                pre = false;
+            }
+
             switch( tagID ) {
             case ID_PRE:
+                prePos = 0;
+                pre = beginTag;
                 discard = LFDiscard; // Discard the first LF after we open a pre.
                 break;
             case ID_SCRIPT:
@@ -1469,24 +1495,40 @@ void HTMLTokenizer::addPending()
     else if ( textarea || script )
     {
         switch(pending) {
-        case LFPending:  *dest++ = '\n'; break;
-        case SpacePending: *dest++ = ' '; break;
+        case LFPending:  *dest++ = '\n'; prePos = 0; break;
+        case SpacePending: *dest++ = ' '; ++prePos; break;
+        case TabPending: *dest++ = '\t'; prePos += TAB_SIZE - (prePos % TAB_SIZE); break;
         case NonePending:
             assert(0);
         }
     }
     else
     {
+        int p;
+
         switch (pending)
         {
         case SpacePending:
             // Insert a breaking space
             *dest++ = QChar(' ');
+            prePos++;
             break;
 
         case LFPending:
             *dest = '\n';
             dest++;
+            prePos = 0;
+            break;
+
+        case TabPending:
+            p = TAB_SIZE - ( prePos % TAB_SIZE );
+#ifdef TOKEN_DEBUG
+            qDebug("tab pending, prePos: %d, toadd: %d", prePos, p);
+#endif
+
+            for ( int x = 0; x < p; x++ )
+                *dest++ = QChar(' ');
+            prePos += p;
             break;
 
         case NonePending:
@@ -1641,7 +1683,9 @@ void HTMLTokenizer::write(const TokenizerString &str, bool appendData)
             }; // end case
 
             if ( pending ) {
-                if ( script || (!parser->selectMode() && (!parser->noSpaces() || dest > buffer )))
+                // pre context always gets its spaces/linefeeds
+                if ( pre || script || (!parser->selectMode() &&
+                             (!parser->noSpaces() || dest > buffer )))
                     addPending();
                 // just forget it
                 else
@@ -1711,7 +1755,7 @@ void HTMLTokenizer::write(const TokenizerString &str, bool appendData)
             }
             ++src;
         }
-        else if (cc == ' ')
+        else if (( cc == ' ' ) || ( cc == '\t' ))
         {
            if (select && !script) {
                 if(discard == SpaceDiscard)
@@ -1728,7 +1772,10 @@ void HTMLTokenizer::write(const TokenizerString &str, bool appendData)
             
                 if (pending)
                     addPending();
-                pending = SpacePending;
+                if (cc == ' ')
+                    pending = SpacePending;
+                else
+                    pending = TabPending;
             }
             
             ++src;
@@ -1739,6 +1786,10 @@ void HTMLTokenizer::write(const TokenizerString &str, bool appendData)
                 addPending();
 
             discard = NoneDiscard;
+            if ( pre )
+            {
+                prePos++;
+            }
 #if QT_VERSION < 300
             unsigned char row = src->row();
             if ( row > 0x05 && row < 0x10 || row > 0xfd )
index 3a2fc02f83a2d759b6a6cdd83205d3a6013a17f4..ac41a98dd4fc56d509dd382c4f468f15c626e8f8 100644 (file)
@@ -116,6 +116,9 @@ public:
     bool flat;
 };
 
+// The count of spaces used for each tab.
+#define TAB_SIZE 8
+
 //-----------------------------------------------------------------------------
 
 class HTMLTokenizer : public Tokenizer, public CachedObjectClient
@@ -204,6 +207,7 @@ protected:
         NonePending = 0,
         SpacePending,
         LFPending,
+        TabPending
     } pending;
 
     // Discard line breaks immediately after start-tags
@@ -251,6 +255,12 @@ protected:
     // are we in a <script> ... </script block
     bool script;
 
+    // Are we in a <pre> ... </pre> block
+    bool pre;
+
+    // if 'pre == true' we track in which column we are
+    int prePos;
+
     // Are we in a <style> ... </style> block
     bool style;
 
index 24d8f25a80a65c16819725a2503047bf34d14b85..acb22035615f84c59161bf69cb6e180f4c126f63 100644 (file)
@@ -386,7 +386,7 @@ static void addRun(BidiRun* bidiRun)
         if (text->text()) {
             for (int i = bidiRun->start; i < bidiRun->stop; i++) {
                 const QChar c = text->text()[i];
-                if (c == ' ' || c == '\n' || c == '\t')
+                if (c == ' ' || c == '\n')
                     numSpaces++;
             }
         }
@@ -714,20 +714,6 @@ RootInlineBox* RenderBlock::constructLine(const BidiIterator &start, const BidiI
     return lastRootBox();
 }
 
-// usage: tw - (xpos % tw);
-int RenderBlock::tabWidth(bool isWhitespacePre)
-{
-    if (!isWhitespacePre)
-        return 0;
-    
-    QChar   spaceChar(' ');
-    const Font& font = style()->htmlFont();
-    int tw = font.width(&spaceChar, 1, 0, 0);
-    tw *= 8;
-        
-    return tw;
-}
-
 void RenderBlock::computeHorizontalPositionsForLine(RootInlineBox* lineBox, BidiState &bidi)
 {
     // First determine our total width.
@@ -739,7 +725,7 @@ void RenderBlock::computeHorizontalPositionsForLine(RootInlineBox* lineBox, Bidi
             continue; // Positioned objects are only participating to figure out their
                       // correct static x position.  They have no effect on the width.
         if (r->obj->isText()) {
-            int textWidth = static_cast<RenderText *>(r->obj)->width(r->start, r->stop-r->start, totWidth, m_firstLine);
+            int textWidth = static_cast<RenderText *>(r->obj)->width(r->start, r->stop-r->start, m_firstLine);
             if (!r->compact) {
                 RenderStyle *style = r->obj->style();
                 if (style->whiteSpace() == NORMAL && style->khtmlLineBreak() == AFTER_WHITE_SPACE) {
@@ -811,7 +797,7 @@ void RenderBlock::computeHorizontalPositionsForLine(RootInlineBox* lineBox, Bidi
                 int spaces = 0;
                 for ( int i = r->start; i < r->stop; i++ ) {
                     const QChar c = static_cast<RenderText *>(r->obj)->text()[i];
-                    if (c == ' ' || c == '\n' || c == '\t')
+                    if (c == ' ' || c == '\n')
                         spaces++;
                 }
 
@@ -1790,7 +1776,7 @@ int RenderBlock::skipWhitespace(BidiIterator &it, BidiState &bidi)
     // object iteration process.
     int w = lineWidth(m_height);
     while (!it.atEnd() && (it.obj->isInlineFlow() || (it.obj->style()->whiteSpace() != PRE && !it.obj->isBR() &&
-          (it.current() == ' ' || it.current() == '\t' || it.current() == '\n' || 
+          (it.current() == ' ' || it.current() == '\n' || 
            skipNonBreakingSpace(it) || it.obj->isFloatingOrPositioned())))) {
         if (it.obj->isFloatingOrPositioned()) {
             RenderObject *o = it.obj;
@@ -2000,12 +1986,12 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                 // item, then this is all moot. -dwh
                 RenderObject* next = Bidinext( start.par, o, bidi );
                 if (!m_pre && next && next->isText() && static_cast<RenderText*>(next)->stringLength() > 0) {
-                    RenderText *nextText = static_cast<RenderText*>(next);
-                    QChar nextChar = nextText->text()[0];
-
-                    if (nextText->style()->whiteSpace() != PRE && 
-                        (nextChar == ' ' || nextChar == '\n' || nextChar == '\t' ||
-                        nextChar.unicode() == nonBreakingSpace && next->style()->nbspMode() == SPACE)) {
+                    if (static_cast<RenderText*>(next)->text()[0].unicode() == nonBreakingSpace &&
+                        o->style()->whiteSpace() == NORMAL && o->style()->nbspMode() == SPACE) {
+                        currentCharacterIsWS = true;
+                    }
+                    if (static_cast<RenderText*>(next)->text()[0].unicode() == ' ' ||
+                        static_cast<RenderText*>(next)->text()[0] == '\n') {
                         currentCharacterIsSpace = true;
                         currentCharacterIsWS = true;
                         ignoringSpaces = true;
@@ -2036,7 +2022,7 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                 bool previousCharacterIsSpace = currentCharacterIsSpace;
                 bool previousCharacterIsWS = currentCharacterIsWS;
                 const QChar c = str[pos];
-                currentCharacterIsSpace = c == ' ' || (!isPre && (c == '\n' || c == '\t'));
+                currentCharacterIsSpace = c == ' ' || (!isPre && c == '\n');
                 
                 if (isPre || !currentCharacterIsSpace)
                     isLineEmpty = false;
@@ -2049,12 +2035,12 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                         addMidpoint(endMid);
                         
                         // Add the width up to but not including the hyphen.
-                        tmpW += t->width(lastSpace, pos - lastSpace, f, w+tmpW);
+                        tmpW += t->width(lastSpace, pos - lastSpace, f);
                         
                         // For whitespace normal only, include the hyphen.  We need to ensure it will fit
                         // on the line if it shows when we break.
                         if (o->style()->whiteSpace() == NORMAL)
-                            tmpW += t->width(pos, 1, f, w+tmpW);
+                            tmpW += t->width(pos, 1, f);
                         
                         BidiIterator startMid(0, o, pos+1);
                         addMidpoint(startMid);
@@ -2074,8 +2060,8 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                 currentCharacterIsWS = currentCharacterIsSpace || (breakNBSP && c.unicode() == nonBreakingSpace);
 
                 if (breakWords)
-                    wrapW += t->width(pos, 1, f, w+wrapW);
-                if (c == '\n' || (!isPre && isBreakable(str, pos, strlen, breakNBSP)) || (breakWords && wrapW > width)) {
+                    wrapW += t->width(pos, 1, f);
+                if ((isPre && c == '\n') || (!isPre && isBreakable(str, pos, strlen, breakNBSP)) || (breakWords && wrapW > width)) {
                     if (ignoringSpaces) {
                         if (!currentCharacterIsSpace) {
                             // Stop ignoring spaces and begin at this
@@ -2092,7 +2078,7 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                         }
                     }
 
-                    tmpW += t->width(lastSpace, pos - lastSpace, f, w+tmpW);
+                    tmpW += t->width(lastSpace, pos - lastSpace, f);
                     if (!appliedStartWidth) {
                         tmpW += inlineWidth(o, true, false);
                         appliedStartWidth = true;
@@ -2128,7 +2114,7 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                     if (o->style()->whiteSpace() == NORMAL) {
                         // In AFTER_WHITE_SPACE mode, consider the current character
                         // as candidate width for this line.
-                        int charWidth = o->style()->khtmlLineBreak() == AFTER_WHITE_SPACE ? t->width(pos, 1, f, w+tmpW) : 0;
+                        int charWidth = o->style()->khtmlLineBreak() == AFTER_WHITE_SPACE ? t->width(pos, 1, f) : 0;
                         if (w + tmpW + charWidth > width) {
                             if (o->style()->khtmlLineBreak() == AFTER_WHITE_SPACE) {
                                 // Check if line is too big even without the extra space
@@ -2146,7 +2132,7 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                         }
                         else if (pos > 1 && str[pos-1].unicode() == SOFT_HYPHEN)
                             // Subtract the width of the soft hyphen out since we fit on a line.
-                            tmpW -= t->width(pos-1, 1, f, w+tmpW);
+                            tmpW -= t->width(pos-1, 1, f);
                     }
 
                     if( *(str+pos) == '\n' && isPre) {
@@ -2218,7 +2204,7 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
             
             // IMPORTANT: pos is > length here!
             if (!ignoringSpaces)
-                tmpW += t->width(lastSpace, pos - lastSpace, f, w+tmpW);
+                tmpW += t->width(lastSpace, pos - lastSpace, f);
             if (!appliedStartWidth)
                 tmpW += inlineWidth(o, true, false);
             if (!appliedEndWidth)
@@ -2422,8 +2408,8 @@ void RenderBlock::checkLinesForTextOverflow()
     static AtomicString ellipsisStr(ellipsis);
     const Font& firstLineFont = style(true)->htmlFont();
     const Font& font = style()->htmlFont();
-    int firstLineEllipsisWidth = firstLineFont.width(&ellipsis, 1, 0, 0);
-    int ellipsisWidth = (font == firstLineFont) ? firstLineEllipsisWidth : font.width(&ellipsis, 1, 0, 0);
+    int firstLineEllipsisWidth = firstLineFont.width(&ellipsis, 1, 0);
+    int ellipsisWidth = (font == firstLineFont) ? firstLineEllipsisWidth : font.width(&ellipsis, 1, 0);
 
     // For LTR text truncation, we want to get the right edge of our padding box, and then we want to see
     // if the right edge of a line box exceeds that.  For RTL, we use the left edge of the padding box and
index a3822bd9e34d57ffb9cdf8595f4ca7e24eac994c..ef8df0f01c029be1a9deaf1f2dd7f064952a93c3 100644 (file)
@@ -73,7 +73,7 @@ bool isBreakable(const QChar *s, int pos, int len, bool breakNBSP)
        else // no asian font
            return c->isSpace();
     } else {
-       if ( ch == ' ' || ch == '\t' || ch == '\n' )
+       if ( ch == ' ' || ch == '\n' )
            return true;
     }
     return false;
@@ -89,7 +89,7 @@ bool isBreakable(const QChar *s, int pos, int len, bool breakNBSP)
     // at the moment whether this behavior is correct or not.  Since Tiger is also not allowing breaks on spaces
     // after hyphen-like characters, this does not seem ideal for the Web.  Therefore for now we override space
     // characters up front and bypass the Unicode line breaking routines.
-    if (ch == ' ' || ch == '\n' || ch == '\t' || (breakNBSP && ch == 0xa0))
+    if (ch == '\n' || ch == ' ' || (breakNBSP && ch == 0xa0))
         return true;
 
     // If current character, or the previous character aren't simple latin1 then
index 8ade73fba9011008e1c94a12a4b67bdc41ba2805..f910777e9ecaf01d7053e0abd155a031de5bfff2 100644 (file)
 using namespace khtml;
 
 #if APPLE_CHANGES
-void Font::drawHighlightForText( QPainter *p, int x, int y, int h, int tabWidth, int xpos, 
+void Font::drawHighlightForText( QPainter *p, int x, int y, int h, 
                      QChar *str, int slen, int pos, int len,
                      int toAdd, QPainter::TextDirection d, bool visuallyOrdered, int from, int to, QColor bg) const
 {
-    p->drawHighlightForText(x, y, h, tabWidth, xpos, str + pos, std::min(slen - pos, len), from, to, toAdd, bg, d, visuallyOrdered,
+    p->drawHighlightForText(x, y, h, str + pos, std::min(slen - pos, len), from, to, toAdd, bg, d, visuallyOrdered,
                 letterSpacing, wordSpacing, fontDef.smallCaps);
 }
 #endif
                      
-void Font::drawText( QPainter *p, int x, int y, int tabWidth, int xpos, QChar *str, int slen, int pos, int len,
+void Font::drawText( QPainter *p, int x, int y, QChar *str, int slen, int pos, int len,
                      int toAdd, QPainter::TextDirection d, bool visuallyOrdered, int from, int to, QColor bg ) const
 {
 #if APPLE_CHANGES
-    p->drawText(x, y, tabWidth, xpos, str + pos, std::min(slen - pos, len), from, to, toAdd, bg, d, visuallyOrdered,
+    p->drawText(x, y, str + pos, std::min(slen - pos, len), from, to, toAdd, bg, d, visuallyOrdered,
                 letterSpacing, wordSpacing, fontDef.smallCaps);
 #else
     QString qstr = QConstString(str, slen).string();
@@ -72,7 +72,7 @@ void Font::drawText( QPainter *p, int x, int y, int tabWidth, int xpos, QChar *s
     // ### fixme for RTL
     if ( !letterSpacing && !wordSpacing && !toAdd && from==-1 ) {
         // simply draw it
-        p->drawText( x, y, tabWidth, xpos, qstr, pos, len, d );
+        p->drawText( x, y, qstr, pos, len, d );
     } else {
         int numSpaces = 0;
         if ( toAdd ) {
@@ -104,7 +104,7 @@ void Font::drawText( QPainter *p, int x, int y, int tabWidth, int xpos, QChar *s
                 if ( bg.isValid() )
                     p->fillRect( x, y-fm.ascent(), chw, fm.height(), bg );
 
-                p->drawText( x, y, tabWidth, xpos, qstr, pos+i, 1, d );
+                p->drawText( x, y, qstr, pos+i, 1, d );
             }
             if ( d != QPainter::RTL )
                 x += chw;
@@ -115,31 +115,31 @@ void Font::drawText( QPainter *p, int x, int y, int tabWidth, int xpos, QChar *s
 
 #if APPLE_CHANGES
 
-float Font::floatWidth( QChar *chs, int slen, int pos, int len, int tabWidth, int xpos ) const
+float Font::floatWidth( QChar *chs, int slen, int pos, int len ) const
 {
-    return fm.floatWidth(chs, slen, pos, len, tabWidth, xpos, letterSpacing, wordSpacing, fontDef.smallCaps);
+    return fm.floatWidth(chs, slen, pos, len, letterSpacing, wordSpacing, fontDef.smallCaps);
 }
 
 
-void Font::floatCharacterWidths( QChar *str, int slen, int pos, int len, int toAdd, int tabWidth, int xpos, float *buffer) const
+void Font::floatCharacterWidths( QChar *str, int slen, int pos, int len, int toAdd, float *buffer) const
 {
-    fm.floatCharacterWidths(str, slen, pos, len, toAdd, tabWidth, xpos, buffer, letterSpacing, wordSpacing, fontDef.smallCaps);
+    fm.floatCharacterWidths(str, slen, pos, len, toAdd, buffer, letterSpacing, wordSpacing, fontDef.smallCaps);
 }
 
-int Font::checkSelectionPoint (QChar *s, int slen, int pos, int len, int toAdd, int tabWidth, int xpos, int x, bool reversed, bool includePartialGlyphs) const
+int Font::checkSelectionPoint (QChar *s, int slen, int pos, int len, int toAdd, int x, bool reversed, bool includePartialGlyphs) const
 {
-    return fm.checkSelectionPoint (s, slen, pos, len, toAdd, tabWidth, xpos, letterSpacing, wordSpacing, fontDef.smallCaps, x, reversed, includePartialGlyphs);
+    return fm.checkSelectionPoint (s, slen, pos, len, toAdd, letterSpacing, wordSpacing, fontDef.smallCaps, x, reversed, includePartialGlyphs);
 }
 
 #endif
 
-int Font::width( QChar *chs, int slen, int pos, int len, int tabWidth, int xpos ) const
+int Font::width( QChar *chs, int slen, int pos, int len ) const
 {
 #if APPLE_CHANGES
 #ifndef ROUND_TO_INT
 #define ROUND_TO_INT(x) (unsigned int)((x)+.5)
 #endif
-    return ROUND_TO_INT(fm.floatWidth(chs+pos, slen-pos, 0, len, tabWidth, xpos, letterSpacing, wordSpacing, fontDef.smallCaps));
+    return ROUND_TO_INT(fm.floatWidth(chs+pos, slen-pos, 0, len, letterSpacing, wordSpacing, fontDef.smallCaps));
 //    return fm.width(chs + pos, len);
 #else
     QString qstr = QConstString(chs+pos, len).string();
@@ -170,11 +170,11 @@ int Font::width( QChar *chs, int slen, int pos, int len, int tabWidth, int xpos
 #endif
 }
 
-int Font::width( QChar *chs, int slen, int tabWidth, int xpos ) const
+int Font::width( QChar *chs, int slen, int pos ) const
 {
 #if APPLE_CHANGES
-//    return ROUND_TO_INT(fm.floatWidth(chs, slen, pos, 1, tabWidth, xpos, letterSpacing, wordSpacing));
-    return width(chs, slen, 0, 1, tabWidth, xpos);
+//    return ROUND_TO_INT(fm.floatWidth(chs, slen, pos, 1, letterSpacing, wordSpacing));
+    return width(chs, slen, pos, 1);
 #else
     int w;
     if ( !fontDef.hasNbsp && (chs+pos)->unicode() == 0xa0 )
@@ -186,7 +186,7 @@ int Font::width( QChar *chs, int slen, int tabWidth, int xpos ) const
        w += letterSpacing;
 
     if ( wordSpacing && (chs+pos)->isSpace() )
-        w += wordSpacing;
+               w += wordSpacing;
     return w;
 #endif
 }
index 0e228ac71ebd5140bfba81e1ac0844cb746a2dc7..07a4f4bd9529c691aa5648717c315756547225a5 100644 (file)
@@ -120,22 +120,22 @@ public:
 
                    
 #if !APPLE_CHANGES
-    void drawText( QPainter *p, int x, int y, int tabWidth, int xpos, QChar *str, int slen, int pos, int len, int width,
+    void drawText( QPainter *p, int x, int y, QChar *str, int slen, int pos, int len, int width,
                    QPainter::TextDirection d, int from=-1, int to=-1, QColor bg=QColor() ) const;
 
 #else
-    void drawText( QPainter *p, int x, int y, int tabWidth, int xpos, QChar *str, int slen, int pos, int len, int width,
+    void drawText( QPainter *p, int x, int y, QChar *str, int slen, int pos, int len, int width,
                    QPainter::TextDirection d, bool visuallyOrdered = false, int from=-1, int to=-1, QColor bg=QColor() ) const;
-    float floatWidth( QChar *str, int slen, int pos, int len, int tabWidth, int xpos ) const;
-    void floatCharacterWidths( QChar *str, int slen, int pos, int len, int toAdd, int tabWidth, int xpos, float *buffer) const;
+    float floatWidth( QChar *str, int slen, int pos, int len ) const;
+    void floatCharacterWidths( QChar *str, int slen, int pos, int len, int toAdd, float *buffer) const;
     bool isFixedPitch() const;
-    int checkSelectionPoint (QChar *s, int slen, int pos, int len, int toAdd, int tabWidth, int xpos, int x, bool reversed, bool includePartialGlyphs) const;
-    void drawHighlightForText( QPainter *p, int x, int y, int h, int tabWidth, int xpos, 
+    int checkSelectionPoint (QChar *s, int slen, int pos, int len, int toAdd, int x, bool reversed, bool includePartialGlyphs) const;
+    void drawHighlightForText( QPainter *p, int x, int y, int h, 
                    QChar *str, int slen, int pos, int len, int width,
                    QPainter::TextDirection d, bool visuallyOrdered = false, int from=-1, int to=-1, QColor bg=QColor()) const;
 #endif
-    int width( QChar *str, int slen, int pos, int len, int tabWidth, int xpos ) const;
-    int width( QChar *str, int slen, int tabWidth, int xpos ) const;
+    int width( QChar *str, int slen, int pos, int len ) const;
+    int width( QChar *str, int slen, int pos ) const;
 
     bool isSmallCaps() const { return fontDef.smallCaps; }
     
index 3ca5166b92096bcfeb5ccbaf34df5ebb589e33cb..f8596ef9d3fd9c5be8e5d8cf28ec7a254f605520 100644 (file)
@@ -2796,7 +2796,7 @@ static void stripTrailingSpace(bool pre,
         RenderText* t = static_cast<RenderText *>(trailingSpaceChild);
         const Font *f = t->htmlFont( false );
         QChar space[1]; space[0] = ' ';
-        int spaceWidth = f->width(space, 1, 0, 0);
+        int spaceWidth = f->width(space, 1, 0);
         inlineMax -= spaceWidth;
         if (inlineMin > inlineMax)
             inlineMin = inlineMax;
@@ -2959,8 +2959,8 @@ void RenderBlock::calcInlineMinMaxWidth()
                 int beginMin, endMin;
                 bool beginWS, endWS;
                 int beginMax, endMax;
-                t->trimmedMinMaxWidth(inlineMax, beginMin, beginWS, endMin, endWS,
-                                      hasBreakableChar, hasBreak, beginMax, endMax,
+                t->trimmedMinMaxWidth(beginMin, beginWS, endMin, endWS, hasBreakableChar,
+                                      hasBreak, beginMax, endMax,
                                       childMin, childMax, stripFrontSpaces);
 
                 // This text object is insignificant and will not be rendered.  Just
index a3cfc6df9215dea5191fca125b91e011081b0640..fd865a29eedd2c3b952bef7b4030092f9129ecc3 100644 (file)
@@ -131,7 +131,6 @@ public:
     BidiIterator findNextLineBreak(BidiIterator &start, BidiState &info );
     RootInlineBox* constructLine(const BidiIterator& start, const BidiIterator& end);
     InlineFlowBox* createLineBoxes(RenderObject* obj);
-    int tabWidth(bool isWhitespacePre);
     void computeHorizontalPositionsForLine(RootInlineBox* lineBox, BidiState &bidi);
     void computeVerticalPositionsForLine(RootInlineBox* lineBox);
     void checkLinesForOverflow();
index 03bf5b34341dee43a8cd9a72bc9a922baf6999db..9202444de9694c16ca0c74116c3b0dfa05baaf48 100644 (file)
@@ -44,8 +44,8 @@ public:
  
     virtual QRect selectionRect() { return QRect(); }
 
-    virtual unsigned int width(unsigned int from, unsigned int len, const Font *f, int xpos) const { return 0; }
-    virtual unsigned int width(unsigned int from, unsigned int len, int xpos, bool firstLine = false) const { return 0; }
+    virtual unsigned int width(unsigned int, unsigned int, const Font *) const { return 0; }
+    virtual unsigned int width( unsigned int, unsigned int, bool) const { return 0; }
 
     virtual short lineHeight(bool firstLine, bool isRootLineBox=false) const;
     virtual short baselinePosition( bool firstLine, bool isRootLineBox=false) const;
index 54bb45e4e98b395857e29ce03ccbc867cd63d5b9..74d7f211017ff154df603ac8c6ae30d2e0e2ea24 100644 (file)
@@ -755,7 +755,7 @@ void RenderFlexibleBox::layoutVerticalBox(bool relayoutChildren)
                 const unsigned short ellipsisAndSpace[2] = { 0x2026, ' ' };
                 static AtomicString ellipsisAndSpaceStr(ellipsisAndSpace, 2);
                 const Font& font = style(numVisibleLines == 1)->htmlFont();
-                int ellipsisAndSpaceWidth = font.width(const_cast<QChar*>(ellipsisAndSpaceStr.unicode()), 2, 0, 2, 0, 0);
+                int ellipsisAndSpaceWidth = font.width(const_cast<QChar*>(ellipsisAndSpaceStr.unicode()), 2, 0, 2);
 
                 // Get ellipsis width + " " + anchor width
                 int totalWidth = ellipsisAndSpaceWidth + anchorBox->width();
index a164a62059b439323b244978ce88620d7daabd77..a1ec490ef7481e253438b028778d418f28411e19 100644 (file)
@@ -114,7 +114,7 @@ void RenderImage::setPixmap( const QPixmap &p, const QRect& r, CachedImage *o)
         // we have an alt and the user meant it (its not a text we invented)
         if (!alt.isEmpty()) {
             const QFontMetrics &fm = style()->fontMetrics();
-            QRect br = fm.boundingRect (  0, 0, 1024, 256, Qt::AlignAuto|Qt::WordBreak, alt.string(), 0, 0);  // FIX: correct tabwidth?
+            QRect br = fm.boundingRect (  0, 0, 1024, 256, Qt::AlignAuto|Qt::WordBreak, alt.string() );
             if ( br.width() > iw )
                 iw = br.width();
             if ( br.height() > ih )
@@ -309,12 +309,13 @@ void RenderImage::paint(PaintInfo& i, int _tx, int _ty)
                 
                 // Only draw the alt text if it'll fit within the content box,
                 // and only if it fits above the error image.
-                int textWidth = fm.width (text, 0, 0, text.length());
+                int textWidth = fm.width (text, text.length());
                 if (errorPictureDrawn) {
                     if (usableWidth >= textWidth && fm.height() <= imageY)
-                        p->drawText(ax, ay+ascent, tabWidth(), 0, 0 /* ignored */, 0 /* ignored */, Qt::WordBreak  /* not supported */, text );
-                } else if (usableWidth >= textWidth && cHeight >= fm.height())
-                    p->drawText(ax, ay+ascent, tabWidth(), 0, 0 /* ignored */, 0 /* ignored */, Qt::WordBreak  /* not supported */, text );
+                        p->drawText(ax, ay+ascent, 0 /* ignored */, 0 /* ignored */, Qt::WordBreak  /* not supported */, text );
+                }
+                else if (usableWidth >= textWidth && cHeight >= fm.height())
+                    p->drawText(ax, ay+ascent, 0 /* ignored */, 0 /* ignored */, Qt::WordBreak  /* not supported */, text );
             }
 #else /* not APPLE_CHANGES */
             if ( !berrorPic ) {
@@ -337,7 +338,7 @@ void RenderImage::paint(PaintInfo& i, int _tx, int _ty)
                 int ay = _ty + topBorder + topPad + 2;
                 const QFontMetrics &fm = style()->fontMetrics();
                 if (cWidth>5 && cHeight>=fm.height())
-                    p->drawText(ax, ay+1, tabWidth(), 0, cWidth - 4, cHeight - 4, Qt::WordBreak, text );
+                    p->drawText(ax, ay+1, cWidth - 4, cHeight - 4, Qt::WordBreak, text );
             }
 #endif /* APPLE_CHANGES not defined */
         }
index 569168dfcb75ebc7afd2c824acb0ef22ff4d1960..677a9d454731899a8979cb95864fae6cd274f337 100644 (file)
@@ -1042,7 +1042,6 @@ void EllipsisBox::paint(RenderObject::PaintInfo& i, int _tx, int _ty)
     const DOMString& str = m_str.string();
     font->drawText(p, m_x + _tx, 
                       m_y + _ty + m_baseline,
-                      0, 0,
                       (str.implementation())->s,
                       str.length(), 0, str.length(),
                       0, 
index 6a3701913a27ca3e3c7a8a214a7caeee5a3d24fe..1e959acbd5f14a1a8ccf22bac4cfeb74516fc14f 100644 (file)
@@ -118,19 +118,19 @@ public:
     RootInlineBox* root();
     
     void setWidth(int w) { m_width = w; }
-    int width() const { return m_width; }
+    int width() { return m_width; }
 
     void setXPos(int x) { m_x = x; }
-    int xPos() const { return m_x; }
+    int xPos() { return m_x; }
 
     void setYPos(int y) { m_y = y; }
-    int yPos() const { return m_y; }
+    int yPos() { return m_y; }
 
     void setHeight(int h) { m_height = h; }
-    int height() const { return m_height; }
+    int height() { return m_height; }
     
     void setBaseline(int b) { m_baseline = b; }
-    int baseline() const { return m_baseline; }
+    int baseline() { return m_baseline; }
 
     virtual bool hasTextChildren() { return true; }
 
index d97e1565505e007996d356ae0d8347f2c2ac6fb5..22f1a79b3c775b11ed7685d6b27919b329cd1222 100644 (file)
@@ -479,25 +479,25 @@ void RenderListMarker::paint(PaintInfo& i, int _tx, int _ty)
 
             if (isInside()) {
                if( style()->direction() == LTR) {
-                    p->drawText(_tx, _ty, 0, 0, 0, 0, Qt::AlignLeft|Qt::DontClip, m_item);
-                    p->drawText(_tx + fm.width(m_item, 0, 0), _ty, 0, 0, 0, 0, Qt::AlignLeft|Qt::DontClip, 
-                            QString::fromLatin1(". "));
+                    p->drawText(_tx, _ty, 0, 0, Qt::AlignLeft|Qt::DontClip, m_item);
+                    p->drawText(_tx + fm.width(m_item), _ty, 0, 0, Qt::AlignLeft|Qt::DontClip, 
+                                QString::fromLatin1(". "));
                 }
                else {
                     const QString& punct(QString::fromLatin1(" ."));
-                    p->drawText(_tx, _ty, 0, 0, 0, 0, Qt::AlignLeft|Qt::DontClip, punct);
-                   p->drawText(_tx + fm.width(punct, 0, 0), _ty, 0, 0, 0, 0, Qt::AlignLeft|Qt::DontClip, m_item);
+                    p->drawText(_tx, _ty, 0, 0, Qt::AlignLeft|Qt::DontClip, punct);
+                   p->drawText(_tx + fm.width(punct), _ty, 0, 0, Qt::AlignLeft|Qt::DontClip, m_item);
                 }
             } else {
                 if (style()->direction() == LTR) {
                     const QString& punct(QString::fromLatin1(". "));
-                    p->drawText(_tx-offset/2, _ty, 0, 0, 0, 0, Qt::AlignRight|Qt::DontClip, punct);
-                    p->drawText(_tx-offset/2-fm.width(punct, 0, 0), _ty, 0, 0, 0, 0, Qt::AlignRight|Qt::DontClip, m_item);
+                    p->drawText(_tx-offset/2, _ty, 0, 0, Qt::AlignRight|Qt::DontClip, punct);
+                    p->drawText(_tx-offset/2-fm.width(punct), _ty, 0, 0, Qt::AlignRight|Qt::DontClip, m_item);
                 }
                else {
                     const QString& punct(QString::fromLatin1(" ."));
-                   p->drawText(_tx+offset/2, _ty, 0, 0, 0, 0, Qt::AlignLeft|Qt::DontClip, punct);
-                    p->drawText(_tx+offset/2+fm.width(punct, 0, 0), _ty, 0, 0, 0, 0, Qt::AlignLeft|Qt::DontClip, m_item);
+                   p->drawText(_tx+offset/2, _ty, 0, 0, Qt::AlignLeft|Qt::DontClip, punct);
+                    p->drawText(_tx+offset/2+fm.width(punct), _ty, 0, 0, Qt::AlignLeft|Qt::DontClip, m_item);
                 }
             }
         }
@@ -601,9 +601,8 @@ void RenderListMarker::calcMinMaxWidth()
         break;
     }
 
-    if (isInside()) {
-        m_width = fm.width(m_item, 0, 0) + fm.width(QString::fromLatin1(". "), 0, 0);
-    }
+    if (isInside())
+        m_width = fm.width(m_item) + fm.width(QString::fromLatin1(". "));
 
 end:
 
index 0884073c01581cec09c5b3192bd95a16c459eb96..3746931045ab920f45a8e93f57c5c90587c2895e 100644 (file)
@@ -1736,11 +1736,6 @@ int RenderObject::paddingRight() const
     return w;
 }
 
-int RenderObject::tabWidth() const
-{
-    return containingBlock()->tabWidth(style()->whiteSpace() == PRE);
-}
-
 RenderCanvas* RenderObject::canvas() const
 {
     return static_cast<RenderCanvas*>(document()->renderer());
@@ -2053,6 +2048,9 @@ void RenderObject::recalcMinMaxWidths()
     
     RenderObject *child = firstChild();
     while( child ) {
+        // gcc sucks. if anybody knows a trick to get rid of the
+        // warning without adding an extra (unneeded) initialisation,
+        // go ahead
        int cmin = 0;
        int cmax = 0;
        bool test = false;
index defc199a61fb6031e75d72cc31dc09b11a753350..de2d0ab5079a17907be51042449c2706fcd317f5 100644 (file)
@@ -387,8 +387,6 @@ public:
     virtual short verticalPositionHint( bool firstLine ) const;
     // the offset of baseline from the top of the object.
     virtual short baselinePosition( bool firstLine, bool isRootLineBox=false ) const;
-    // width of tab character
-    int tabWidth() const;
 
     /*
      * Paint the object and its children, clipped by (x|y|w|h).
index 1b8861e286ffc5a2c67086b7b0791ad3f68a4ff7..5143a90d1d3ec09f7daa5b58d61b4925e681df33 100644 (file)
@@ -125,8 +125,6 @@ long RenderReplaced::caretMinOffset() const
 
 // Returns 1 since a replaced element can have the caret positioned 
 // at its beginning (0), or at its end (1).
-// NOTE: Yet, "select" elements can have any number of "option" elements
-// as children, so this "0 or 1" idea does not really hold up.
 long RenderReplaced::caretMaxOffset() const 
 { 
     return 1; 
index f8019ded88365b1e4d37ca84c1e420c56578138a..376331204a5d6d01f617ed893c012f2969133935 100644 (file)
@@ -143,12 +143,12 @@ QRect InlineTextBox::selectionRect(int tx, int ty, int startPos, int endPos)
     int selEnd = selStart;
     int selTop = rootBox->selectionTop();
     int selHeight = rootBox->selectionHeight();
-
+    
     // FIXME: For justified text, just return the entire text box's rect.  At the moment there's still no easy
     // way to get the width of a run including the justification padding.
     if (sPos > 0 && !m_toAdd) {
         // The selection begins in the middle of our run.
-        int w = textObject()->width(m_start, sPos, m_firstLine, m_x);
+        int w = textObject()->width(m_start, sPos, m_firstLine);
         if (m_reversed)
             selStart -= w;
         else
@@ -162,14 +162,14 @@ QRect InlineTextBox::selectionRect(int tx, int ty, int startPos, int endPos)
             selEnd = m_x + m_width;
     }
     else {
-        // Our run is partially selected, and so we need to measure.
+        // Our run is partially selected, and so we have to actually do a measurement.
         int w = textObject()->width(sPos + m_start, ePos - sPos, m_firstLine);
         if (m_reversed)
             selEnd = selStart - w;
         else
             selEnd = selStart + w;
     }
-    
+
     int selLeft = m_reversed ? selEnd : selStart;
     int selRight = m_reversed ? selStart : selEnd;
 
@@ -383,7 +383,7 @@ void InlineTextBox::paint(RenderObject::PaintInfo& i, int tx, int ty)
         int endPoint = m_len;
         if (m_truncation != cNoTruncation)
             endPoint = m_truncation - m_start;
-        font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, textObject()->tabWidth(), textPos(),
+        font->drawText(i.p, m_x + tx, m_y + ty + m_baseline,
                        textObject()->string()->s, textObject()->string()->l, m_start, endPoint,
                        m_toAdd, m_reversed ? QPainter::RTL : QPainter::LTR, styleToUse->visuallyOrdered());
     } else {
@@ -392,18 +392,18 @@ void InlineTextBox::paint(RenderObject::PaintInfo& i, int tx, int ty)
         if (paintSelectedTextSeparately) {
             // paint only the text that is not selected
             if (sPos >= ePos) {
-                font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, textObject()->tabWidth(), textPos(),
+                font->drawText(i.p, m_x + tx, m_y + ty + m_baseline,
                                textObject()->string()->s, textObject()->string()->l, m_start, m_len,
                                m_toAdd, m_reversed ? QPainter::RTL : QPainter::LTR, styleToUse->visuallyOrdered());
             } else {
                 if (sPos - 1 >= 0) {
-                    font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, textObject()->tabWidth(), textPos(),
-                                   textObject()->string()->s, textObject()->string()->l, m_start, m_len,
+                    font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, textObject()->string()->s,
+                                   textObject()->string()->l, m_start, m_len,
                                    m_toAdd, m_reversed ? QPainter::RTL : QPainter::LTR, styleToUse->visuallyOrdered(), 0, sPos);
                 }
                 if (ePos < m_start + m_len) {
-                    font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, textObject()->tabWidth(), textPos(),
-                                   textObject()->string()->s, textObject()->string()->l, m_start, m_len,
+                    font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, textObject()->string()->s,
+                                   textObject()->string()->l, m_start, m_len,
                                    m_toAdd, m_reversed ? QPainter::RTL : QPainter::LTR, styleToUse->visuallyOrdered(), ePos, -1);
                 }
             }
@@ -419,8 +419,8 @@ void InlineTextBox::paint(RenderObject::PaintInfo& i, int tx, int ty)
                                selectionTextShadow->y,
                                selectionTextShadow->blur,
                                selectionTextShadow->color);
-            font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, textObject()->tabWidth(), textPos(),
-                           textObject()->string()->s, textObject()->string()->l, m_start, m_len,
+            font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, textObject()->string()->s,
+                           textObject()->string()->l, m_start, m_len,
                            m_toAdd, m_reversed ? QPainter::RTL : QPainter::LTR, styleToUse->visuallyOrdered(), sPos, ePos);
             if (selectionTextShadow)
                 i.p->clearShadow();
@@ -524,9 +524,10 @@ void InlineTextBox::paintSelection(QPainter* p, int tx, int ty, RenderStyle* sty
     p->save();
     p->setPen(c); // Don't draw text at all!
     RootInlineBox* r = root();
+    int x = m_x + tx;
     int y = r->selectionTop();
     int h = r->selectionHeight();
-    f->drawHighlightForText(p, m_x + tx, y + ty, h, textObject()->tabWidth(), textPos(), 
+    f->drawHighlightForText(p, x, y + ty, h,
                             textObject()->str->s, textObject()->str->l, m_start, m_len,
                             m_toAdd, m_reversed ? QPainter::RTL : QPainter::LTR, style->visuallyOrdered(), sPos, ePos, c);
     p->restore();
@@ -548,9 +549,10 @@ void InlineTextBox::paintMarkedTextBackground(QPainter* p, int tx, int ty, Rende
     p->setPen(c); // Don't draw text at all!
 
     RootInlineBox* r = root();
+    int x = m_x + tx;
     int y = r->selectionTop();
     int h = r->selectionHeight();
-    f->drawHighlightForText(p, m_x + tx, y + ty, h, textObject()->tabWidth(), textPos(), textObject()->str->s, textObject()->str->l, m_start, m_len,
+    f->drawHighlightForText(p, x, y + ty, h, textObject()->str->s, textObject()->str->l, m_start, m_len,
             m_toAdd, m_reversed ? QPainter::RTL : QPainter::LTR, style->visuallyOrdered(), sPos, ePos, c);
     p->restore();
 }
@@ -725,21 +727,11 @@ long RenderText::nextOffset (long current) const
     return current + 1;
 }
 
-int InlineTextBox::textPos() const
-{
-    if (xPos() == 0)
-        return 0;
-        
-    RenderBlock *blockElement = object()->containingBlock();
-    return m_reversed ? xPos() - blockElement->borderRight() - blockElement->paddingRight()
-                      : xPos() - blockElement->borderLeft() - blockElement->paddingLeft();
-}
-
 int InlineTextBox::offsetForPosition(int _x, bool includePartialGlyphs) const
 {
     RenderText* text = static_cast<RenderText*>(m_object);
     const Font* f = text->htmlFont(m_firstLine);
-    return f->checkSelectionPoint(text->str->s, text->str->l, m_start, m_len, m_toAdd, text->tabWidth(), textPos(), _x - m_x, m_reversed, includePartialGlyphs);
+    return f->checkSelectionPoint(text->str->s, text->str->l, m_start, m_len, m_toAdd, _x - m_x, m_reversed, includePartialGlyphs);
 }
 
 int InlineTextBox::positionForOffset(int offset) const
@@ -749,13 +741,13 @@ int InlineTextBox::positionForOffset(int offset) const
 
     int left;
     if (m_reversed) {
-       long len = m_start + m_len - offset;
-       QString string(text->str->s + offset, len);
-       left = m_x + fm.boundingRect(string, text->tabWidth(), textPos(), len).right();
+        long len = m_start + m_len - offset;
+        QString string(text->str->s + offset, len);
+        left = m_x + fm.boundingRect(string, len).right();
     } else {
-       long len = offset - m_start;
-       QString string(text->str->s + m_start, len);
-       left = m_x + fm.boundingRect(string, text->tabWidth(), textPos(), len).right();
+        long len = offset - m_start;
+        QString string(text->str->s + m_start, len);
+        left = m_x + fm.boundingRect(string, len).right();
     }
     // FIXME: Do we need to add rightBearing here?
     return left;
@@ -1149,7 +1141,7 @@ bool RenderText::shouldUseMonospaceCache(const Font *f) const
     return (f && f->isFixedPitch() && allAscii() && !style()->htmlFont().isSmallCaps());
 }
 
-// We cache the width of the ' ' character for <pre> text.  We could go further
+// We cache the width of the ' ' character for <pre> text.  We could go futher
 // and cache a widths array for all styles, at the expense of increasing the size of the
 // RenderText.
 void RenderText::cacheWidths()
@@ -1159,7 +1151,7 @@ void RenderText::cacheWidths()
     if (shouldUseMonospaceCache(f)){
         float fw;
         QChar c(' ');
-        f->floatCharacterWidths( &c, 1, 0, 1, 0, 0, 0, &fw);
+        f->floatCharacterWidths( &c, 1, 0, 1, 0, &fw);
         m_monospaceCharacterWidth = (int)fw;
     }
     else
@@ -1167,27 +1159,20 @@ void RenderText::cacheWidths()
 }
 
 
-inline int RenderText::widthFromCache(const Font *f, int start, int len, int tabWidth, int xpos) const
+inline int RenderText::widthFromCache(const Font *f, int start, int len) const
 {
     if (m_monospaceCharacterWidth != 0){
         int i, w = 0;
         for (i = start; i < start+len; i++){
-            QChar c = str->s[i];
-            int dir = c.direction();
-            if (dir != QChar::DirNSM && dir != QChar::DirBN) {
-                if (c == '\t' && tabWidth != 0) {
-                    w += tabWidth - ((xpos + w) % tabWidth);
-                } else
-                    w += m_monospaceCharacterWidth;
-            }
+            int dir = str->s[i].direction();
+            if (dir != QChar::DirNSM && dir != QChar::DirBN)
+                w += m_monospaceCharacterWidth;
         }
-
         return w;
     }
     
-    return f->width(str->s, str->l, start, len, tabWidth, xpos);
+    return f->width(str->s, str->l, start, len);
 }
-
 #ifdef XXX
 inline int RenderText::widthFromCache(const Font *f, int start, int len) const
 {
@@ -1201,8 +1186,7 @@ inline int RenderText::widthFromCache(const Font *f, int start, int len) const
 
 #endif
 
-void RenderText::trimmedMinMaxWidth(int leadWidth,
-                                    int& beginMinW, bool& beginWS, 
+void RenderText::trimmedMinMaxWidth(int& beginMinW, bool& beginWS, 
                                     int& endMinW, bool& endWS,
                                     bool& hasBreakableChar, bool& hasBreak,
                                     int& beginMaxW, int& endMaxW,
@@ -1219,10 +1203,6 @@ void RenderText::trimmedMinMaxWidth(int leadWidth,
         return;
     }
     
-    // if the text has a variable width tab, we need to call 
-    if (m_hasTab)
-        calcMinMaxWidth(leadWidth);
-    
     minW = m_minWidth;
     maxW = m_maxWidth;
     beginWS = stripFrontSpaces ? false : m_hasBeginWS;
@@ -1234,10 +1214,10 @@ void RenderText::trimmedMinMaxWidth(int leadWidth,
     hasBreakableChar = m_hasBreakableChar;
     hasBreak = m_hasBreak;
 
-    if (stripFrontSpaces && (str->s[0] == ' ' || (!isPre && (str->s[0] == '\n' || str->s[0] == '\t')))) {
+    if (stripFrontSpaces && (str->s[0] == ' ' || (!isPre && str->s[0] == '\n'))) {
         const Font *f = htmlFont( false );
         QChar space[1]; space[0] = ' ';
-        int spaceWidth = f->width(space, 1, 0, 0);
+        int spaceWidth = f->width(space, 1, 0);
         maxW -= spaceWidth;
     }
     
@@ -1262,13 +1242,12 @@ void RenderText::trimmedMinMaxWidth(int leadWidth,
             if (linelen)
             {
 #if !APPLE_CHANGES
-                endMaxW = f->width(str->s, str->l, i, linelen, tabWidth(), leadWidth + endMaxW); 
+                endMaxW = f->width(str->s, str->l, i, linelen);
 #else
-                endMaxW = widthFromCache(f, i, linelen, tabWidth(), leadWidth + endMaxW);
+                endMaxW = widthFromCache(f, i, linelen);
 #endif
                 if (firstLine) {
                     firstLine = false;
-                    leadWidth = 0;
                     beginMaxW = endMaxW;
                 }
                 i += linelen;
@@ -1276,7 +1255,6 @@ void RenderText::trimmedMinMaxWidth(int leadWidth,
             else if (firstLine) {
                 beginMaxW = 0;
                 firstLine = false;
-                leadWidth = 0;
             }
     
             if (i == len-1)
@@ -1289,14 +1267,8 @@ void RenderText::trimmedMinMaxWidth(int leadWidth,
 
 void RenderText::calcMinMaxWidth()
 {
-    // Use 0 for the leadWidth.   If the text contains a variable width tab, the real width
-    // will get measured when trimmedMinMaxWidth calls again with the real leadWidth.
     KHTMLAssert( !minMaxKnown() );
-    calcMinMaxWidth(0);
-}
 
-void RenderText::calcMinMaxWidth(int leadWidth)
-{
     // ### calc Min and Max width...
     m_minWidth = m_beginMinWidth = m_endMinWidth = 0;
     m_maxWidth = 0;
@@ -1306,7 +1278,7 @@ void RenderText::calcMinMaxWidth(int leadWidth)
         
     int currMinWidth = 0;
     int currMaxWidth = 0;
-    m_hasBreakableChar = m_hasBreak = m_hasTab = m_hasBeginWS = m_hasEndWS = false;
+    m_hasBreakableChar = m_hasBreak = m_hasBeginWS = m_hasEndWS = false;
     
     // ### not 100% correct for first-line
     const Font *f = htmlFont( false );
@@ -1329,13 +1301,8 @@ void RenderText::calcMinMaxWidth(int leadWidth)
                 m_hasBreak = true;
                 isNewline = true;
                 isSpace = false;
-            } else
-                isSpace = true;
-        } else if (c == '\t') {
-            if (isPre) {
-                m_hasTab = true;
-                isSpace = false;
-            } else
+            }
+            else
                 isSpace = true;
         } else {
             isSpace = c == ' ';
@@ -1351,14 +1318,12 @@ void RenderText::calcMinMaxWidth(int leadWidth)
         
         if (ignoringSpaces && !isSpace)
             ignoringSpaces = false;
-        
-        // Ignore spaces and soft hyphens
-        if (ignoringSpaces || (i > 0 && c.unicode() == SOFT_HYPHEN)) {
+            
+        if (ignoringSpaces || (i > 0 && c.unicode() == SOFT_HYPHEN)) // Ignore spaces and soft hyphens
             continue;
-        }
         
         int wordlen = 0;
-        while (i+wordlen < len && str->s[i+wordlen] != '\n' && str->s[i+wordlen] != ' ' && str->s[i+wordlen] != '\t' &&
+        while (i+wordlen < len && str->s[i+wordlen] != '\n' && str->s[i+wordlen] != ' ' &&
                (i+wordlen == 0 || str->s[i+wordlen].unicode() != SOFT_HYPHEN) && // Skip soft hyphens
                (wordlen == 0 || !isBreakable( str->s, i+wordlen, str->l)))
             wordlen++;
@@ -1366,20 +1331,20 @@ void RenderText::calcMinMaxWidth(int leadWidth)
         if (wordlen)
         {
 #if !APPLE_CHANGES
-            int w = f->width(str->s, str->l, i, wordlen, tabWidth(), leadWidth + currMaxWidth);
+            int w = f->width(str->s, str->l, i, wordlen);
 #else
-            int w = widthFromCache(f, i, wordlen, tabWidth(), leadWidth + currMaxWidth);
+            int w = widthFromCache(f, i, wordlen);
 #endif
             currMinWidth += w;
             currMaxWidth += w;
             
-            bool isBreakableCharSpace = (i+wordlen < len) ? ((!isPre && (str->s[i+wordlen] == '\n' || str->s[i+wordlen] == '\t')) || 
+            bool isBreakableCharSpace = (i+wordlen < len) ? ((!isPre && str->s[i+wordlen] == '\n') || 
                                                              str->s[i+wordlen] == ' ') : false;
 
             if (i+wordlen < len && style()->whiteSpace() == NORMAL)
                 m_hasBreakableChar = true;
             
-            // Add in wordSpacing to our currMaxWidth, but not if this is the last word on a line or the
+            // Add in wordspacing to our maxwidth, but not if this is the last word on a line or the
             // last word in the run.
             if (wordSpacing && isBreakableCharSpace && !containsOnlyWhitespace(i+wordlen, len-(i+wordlen)))
                 currMaxWidth += wordSpacing;
@@ -1403,7 +1368,7 @@ void RenderText::calcMinMaxWidth(int leadWidth)
         }
         else {
             // Nowrap can never be broken, so don't bother setting the
-            // breakable character boolean. Pre can only be broken if we encounter a newline.     
+            // breakable character boolean. Pre can only be broken if we encounter a newline.
             if (style()->whiteSpace() == NORMAL || isNewline)
                 m_hasBreakableChar = true;
 
@@ -1414,7 +1379,6 @@ void RenderText::calcMinMaxWidth(int leadWidth)
             {
                 if (firstLine) {
                     firstLine = false;
-                    leadWidth = 0;
                     m_beginMinWidth = currMaxWidth;
                 }
                 
@@ -1423,14 +1387,14 @@ void RenderText::calcMinMaxWidth(int leadWidth)
             }
             else
             {
-                currMaxWidth += f->width(str->s, str->l, i + wordlen, 1, tabWidth(), leadWidth + currMaxWidth);
+                currMaxWidth += f->width( str->s, str->l, i + wordlen );
             }
         }
     }
-
+    
     if(currMinWidth > m_minWidth) m_minWidth = currMinWidth;
     if(currMaxWidth > m_maxWidth) m_maxWidth = currMaxWidth;
-        
+
     if (style()->whiteSpace() != NORMAL)
         m_minWidth = m_maxWidth;
 
@@ -1448,7 +1412,7 @@ bool RenderText::containsOnlyWhitespace(unsigned int from, unsigned int len) con
 {
     unsigned int currPos;
     for (currPos = from; 
-         currPos < from+len && (str->s[currPos] == '\n' || str->s[currPos].unicode() == ' ' || str->s[currPos] == '\t'); 
+         currPos < from+len && (str->s[currPos] == '\n' || str->s[currPos].unicode() == ' '); 
          currPos++);
     return currPos >= (from+len);
 }
@@ -1695,37 +1659,37 @@ void RenderText::position(InlineBox* box, int from, int len, bool reverse)
     s->m_len = len;
 }
 
-unsigned int RenderText::width(unsigned int from, unsigned int len, int xpos, bool firstLine) const
+unsigned int RenderText::width(unsigned int from, unsigned int len, bool firstLine) const
 {
     if(!str->s || from > str->l ) return 0;
     if ( from + len > str->l ) len = str->l - from;
 
     const Font *f = htmlFont( firstLine );
-    return width( from, len, f, xpos );
+    return width( from, len, f );
 }
 
-unsigned int RenderText::width(unsigned int from, unsigned int len, const Font *f, int xpos) const
+unsigned int RenderText::width(unsigned int from, unsigned int len, const Font *f) const
 {
     if(!str->s || from > str->l ) return 0;
     if ( from + len > str->l ) len = str->l - from;
 
     int w;
-    if ( style()->whiteSpace() != PRE && f == &style()->htmlFont() && from == 0 && len == str->l ) {
+    if ( f == &style()->htmlFont() && from == 0 && len == str->l )
         w = m_maxWidth;
 #if APPLE_CHANGES
-    } else if (f == &style()->htmlFont()) {
-        w = widthFromCache (f, from, len, tabWidth(), xpos);
+    else if (f == &style()->htmlFont())
+        w = widthFromCache (f, from, len);
 #endif
-    } else {
-       w = f->width(str->s, str->l, from, len, tabWidth(), xpos );
-    }
-        
+    else
+        w = f->width(str->s, str->l, from, len );
+
     //kdDebug( 6040 ) << "RenderText::width(" << from << ", " << len << ") = " << w << endl;
     return w;
 }
 
 int RenderText::width() const
 {
+    int w;
     int minx = 100000000;
     int maxx = 0;
     // slooow
@@ -1736,7 +1700,9 @@ int RenderText::width() const
             maxx = s->m_x + s->m_width;
     }
 
-    return kMax(0, maxx-minx);
+    w = kMax(0, maxx-minx);
+
+    return w;
 }
 
 QRect RenderText::getAbsoluteRepaintRect()
index c54b2ab3b522f388c8d89142d9979f36697dfad9..d3d2ad38cedac7e60941bd601ada2a94e9ad9cab 100644 (file)
@@ -124,7 +124,6 @@ public:
     virtual long caretMaxOffset() const;
     virtual unsigned long caretMaxRenderedOffset() const;
     
-    int textPos() const;
     int offsetForPosition(int _x, bool includePartialGlyphs = true) const;
     int positionForOffset(int offset) const;
     
@@ -191,8 +190,8 @@ public:
     unsigned int stringLength() const { return str->l; } // non virtual implementation of length()
     virtual void position(InlineBox* box, int from, int len, bool reverse);
 
-    virtual unsigned int width(unsigned int from, unsigned int len, const Font *f, int xpos) const;
-    virtual unsigned int width(unsigned int from, unsigned int len, int xpos, bool firstLine = false) const;
+    virtual unsigned int width(unsigned int from, unsigned int len, const Font *f) const;
+    virtual unsigned int width(unsigned int from, unsigned int len, bool firstLine = false) const;
     virtual int width() const;
     virtual int height() const;
 
@@ -204,11 +203,7 @@ public:
     virtual void calcMinMaxWidth();
     virtual int minWidth() const { return m_minWidth; }
     virtual int maxWidth() const { return m_maxWidth; }
-
-    // widths
-    void calcMinMaxWidth(int leadWidth);
-    virtual void trimmedMinMaxWidth(int leadWidth,
-                                    int& beginMinW, bool& beginWS, 
+    virtual void trimmedMinMaxWidth(int& beginMinW, bool& beginWS, 
                                     int& endMinW, bool& endWS,
                                     bool& hasBreakableChar, bool& hasBreak,
                                     int& beginMaxW, int& endMaxW,
@@ -253,7 +248,7 @@ public:
     virtual InlineBox *inlineBox(long offset, EAffinity affinity = UPSTREAM);
 
 #if APPLE_CHANGES
-    int widthFromCache(const Font *, int start, int len, int tabWidth, int xpos) const;
+    int widthFromCache(const Font *, int start, int len) const;
     bool shouldUseMonospaceCache(const Font *) const;
     void cacheWidths();
     bool allAscii() const;
@@ -285,7 +280,6 @@ protected: // members
     SelectionState m_selectionState : 3 ;
     bool m_hasBreakableChar : 1; // Whether or not we can be broken into multiple lines.
     bool m_hasBreak : 1; // Whether or not we have a hard break (e.g., <pre> with '\n').
-    bool m_hasTab : 1; // Whether or not we have a variable width tab character (e.g., <pre> with '\t').
     bool m_hasBeginWS : 1; // Whether or not we begin with WS (only true if we aren't pre)
     bool m_hasEndWS : 1; // Whether or not we end with WS (only true if we aren't pre)
     
index 0f2772e7264208dd41e57638884a724eac1b7732..ec13e59315de2520e2578fa9cefb16263667a9d3 100644 (file)
@@ -51,22 +51,22 @@ public:
     int lineSpacing() const;
     float xHeight() const;
     
-    int width(QChar, int tabWidth, int xpos) const;
-    int width(char, int tabWidth, int xpos) const;
-    int width(const QString &, int tabWidth, int xpos, int len=-1) const;
-    int charWidth(const QString &, int pos, int tabWidth, int xpos) const;
-    int width(const QChar *, int len, int tabWidth, int xpos) const;
+    int width(QChar) const;
+    int width(char) const;
+    int width(const QString &, int len=-1) const;
+    int charWidth(const QString &, int pos) const;
+    int width(const QChar *, int len) const;
     float floatWidth(const QChar *, int slen, int pos, int len,
-                     int tabWidth, int xpos, int letterSpacing, int wordSpacing, bool smallCaps) const;
-    float floatCharacterWidths(const QChar *, int slen, int pos, int len, int toAdd, int tabWidth, int xpos, float *buffer,
+                     int letterSpacing, int wordSpacing, bool smallCaps) const;
+    float floatCharacterWidths(const QChar *, int slen, int pos, int len, int toAdd, float *buffer,
                                int letterSpacing, int wordSpacing, bool smallCaps) const;
-    int checkSelectionPoint (QChar *s, int slen, int pos, int len, int toAdd, int tabWidth, int xpos, int letterSpacing, int wordSpacing, bool smallCaps, int x, bool reversed, bool includePartialGlyphs) const;
+    int checkSelectionPoint (QChar *s, int slen, int pos, int len, int toAdd, int letterSpacing, int wordSpacing, bool smallCaps, int x, bool reversed, bool includePartialGlyphs) const;
 
     QRect boundingRect(QChar) const;
-    QRect boundingRect(const QString &, int tabWidth, int xpos, int len=-1) const;
-    QRect boundingRect(int, int, int, int, int, const QString &, int tabWidth, int xpos) const;
+    QRect boundingRect(const QString &, int len=-1) const;
+    QRect boundingRect(int, int, int, int, int, const QString &) const;
 
-    QSize size(int, const QString &, int tabWidth, int xpos) const;
+    QSize size(int, const QString &) const;
 
     int baselineOffset() const { return ascent(); }
     
index 2559f2feb178273d9186362e676c6227c0e61445..75c5e21014613e8ed0fef6883fd2504d4c57a435 100644 (file)
@@ -158,7 +158,7 @@ float QFontMetrics::xHeight() const
     return [data->getRenderer() xHeight];
 }
 
-int QFontMetrics::width(QChar qc, int tabWidth, int xpos) const
+int QFontMetrics::width(QChar qc) const
 {
     if (data.isNull()) {
         ERROR("called width on an empty QFontMetrics");
@@ -175,18 +175,16 @@ int QFontMetrics::width(QChar qc, int tabWidth, int xpos) const
     WebCoreTextStyle style;
     WebCoreInitializeEmptyTextStyle(&style);
     style.families = families;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
 
     return ROUND_TO_INT([data->getRenderer() floatWidthForRun:&run style:&style widths:0]);
 }
 
-int QFontMetrics::charWidth(const QString &s, int pos, int tabWidth, int xpos) const
+int QFontMetrics::charWidth(const QString &s, int pos) const
 {
-    return width(s[pos], tabWidth, xpos);
+    return width(s[pos]);
 }
 
-int QFontMetrics::width(char c, int tabWidth, int xpos) const
+int QFontMetrics::width(char c) const
 {
     if (data.isNull()) {
         ERROR("called width on an empty QFontMetrics");
@@ -203,13 +201,11 @@ int QFontMetrics::width(char c, int tabWidth, int xpos) const
     WebCoreTextStyle style;
     WebCoreInitializeEmptyTextStyle(&style);
     style.families = families;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
 
     return ROUND_TO_INT([data->getRenderer() floatWidthForRun:&run style:&style widths:0]);
 }
 
-int QFontMetrics::width(const QString &qstring, int tabWidth, int xpos, int len) const
+int QFontMetrics::width(const QString &qstring, int len) const
 {
     if (data.isNull()) {
         ERROR("called width on an empty QFontMetrics");
@@ -226,13 +222,11 @@ int QFontMetrics::width(const QString &qstring, int tabWidth, int xpos, int len)
     WebCoreTextStyle style;
     WebCoreInitializeEmptyTextStyle(&style);
     style.families = families;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
 
     return ROUND_TO_INT([data->getRenderer() floatWidthForRun:&run style:&style widths:0]);
 }
 
-int QFontMetrics::width(const QChar *uchars, int len, int tabWidth, int xpos) const
+int QFontMetrics::width(const QChar *uchars, int len) const
 {
     if (data.isNull()) {
         ERROR("called width on an empty QFontMetrics");
@@ -247,14 +241,12 @@ int QFontMetrics::width(const QChar *uchars, int len, int tabWidth, int xpos) co
     WebCoreTextStyle style;
     WebCoreInitializeEmptyTextStyle(&style);
     style.families = families;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
 
     return ROUND_TO_INT([data->getRenderer() floatWidthForRun:&run style:&style widths:0]);
 }
 
 float QFontMetrics::floatWidth(const QChar *uchars, int slen, int pos, int len,
-                               int tabWidth, int xpos, int letterSpacing, int wordSpacing, bool smallCaps) const
+                               int letterSpacing, int wordSpacing, bool smallCaps) const
 {
     if (data.isNull()) {
         ERROR("called floatWidth on an empty QFontMetrics");
@@ -268,8 +260,6 @@ float QFontMetrics::floatWidth(const QChar *uchars, int slen, int pos, int len,
     
     WebCoreTextStyle style;
     WebCoreInitializeEmptyTextStyle(&style);
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
     style.letterSpacing = letterSpacing;
     style.wordSpacing = wordSpacing;
     style.smallCaps = smallCaps;
@@ -278,7 +268,7 @@ float QFontMetrics::floatWidth(const QChar *uchars, int slen, int pos, int len,
     return ROUND_TO_INT([data->getRenderer() floatWidthForRun:&run style:&style widths:0]);
 }
 
-float QFontMetrics::floatCharacterWidths(const QChar *uchars, int slen, int pos, int len, int toAdd, int tabWidth, int xpos, float *buffer, int letterSpacing, int wordSpacing, bool smallCaps) const
+float QFontMetrics::floatCharacterWidths(const QChar *uchars, int slen, int pos, int len, int toAdd, float *buffer, int letterSpacing, int wordSpacing, bool smallCaps) const
 {
     if (data.isNull()) {
         ERROR("called floatCharacterWidths on an empty QFontMetrics");
@@ -296,14 +286,12 @@ float QFontMetrics::floatCharacterWidths(const QChar *uchars, int slen, int pos,
     style.wordSpacing = wordSpacing;
     style.smallCaps = smallCaps;
     style.padding = toAdd;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
     style.families = families;
 
     return [data->getRenderer() floatWidthForRun:&run style:&style widths:buffer];
 }
 
-int QFontMetrics::checkSelectionPoint (QChar *s, int slen, int pos, int len, int toAdd, int tabWidth, int xpos, int letterSpacing, int wordSpacing, bool smallCaps, int x, bool reversed, bool includePartialGlyphs) const
+int QFontMetrics::checkSelectionPoint (QChar *s, int slen, int pos, int len, int toAdd, int letterSpacing, int wordSpacing, bool smallCaps, int x, bool reversed, bool includePartialGlyphs) const
 {
     if (data.isNull()) {
         ERROR("called floatWidth on an empty QFontMetrics");
@@ -321,8 +309,6 @@ int QFontMetrics::checkSelectionPoint (QChar *s, int slen, int pos, int len, int
     style.smallCaps = smallCaps;
     style.families = families;
     style.padding = toAdd;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
     style.rtl = reversed;
 
     return [data->getRenderer() pointToOffset:&run style:&style position:x reversed:reversed includePartialGlyphs:includePartialGlyphs];
@@ -330,21 +316,21 @@ int QFontMetrics::checkSelectionPoint (QChar *s, int slen, int pos, int len, int
 
 QRect QFontMetrics::boundingRect(QChar c) const
 {
-    return QRect(0, 0, width(c, 0, 0), height());
+    return QRect(0, 0, width(c), height());
 }
 
-QRect QFontMetrics::boundingRect(const QString &qstring, int tabWidth, int xpos, int len) const
+QRect QFontMetrics::boundingRect(const QString &qstring, int len) const
 {
-    return QRect(0, 0, width(qstring, tabWidth, xpos, len), height());
+    return QRect(0, 0, width(qstring, len), height());
 }
 
-QRect QFontMetrics::boundingRect(int x, int y, int width, int height, int flags, const QString &str, int tabWidth, int xpos) const
+QRect QFontMetrics::boundingRect(int x, int y, int width, int height, int flags, const QString &str) const
 {
     // FIXME: need to support word wrapping?
-    return QRect(x, y, width, height).intersect(boundingRect(str, tabWidth, xpos));
+    return QRect(x, y, width, height).intersect(boundingRect(str));
 }
 
-QSize QFontMetrics::size(int, const QString &qstring, int tabWidth, int xpos) const
+QSize QFontMetrics::size(int, const QString &qstring) const
 {
-    return QSize(width(qstring, tabWidth, xpos), height());
+    return QSize(width(qstring), height());
 }
index dc1022e2cf920b7ff99d3ecf16ab6fe2d15aa40b..27ada0bc74e28d95637a33788ee001e860b0f92d 100644 (file)
@@ -101,12 +101,12 @@ public:
     RasterOp rasterOp() const;
     void setRasterOp(RasterOp);
 
-    void drawText(int x, int y, int tabWidth, int xpos, int, int, int alignmentFlags, const QString &);
-    void drawHighlightForText(int x, int y, int h, int tabWidth, int xpos,
+    void drawText(int x, int y, int, int, int alignmentFlags, const QString &);
+    void drawHighlightForText(int x, int y, int h, 
                   const QChar *, int length, int from, int to, int toAdd,
                   const QColor& backgroundColor, QPainter::TextDirection d, bool visuallyOrdered,
                   int letterSpacing, int wordSpacing, bool smallCaps);
-    void drawText(int x, int y, int tabWidth, int xpos, const QChar *, int length, int from, int to, int toAdd,
+    void drawText(int x, int y, const QChar *, int length, int from, int to, int toAdd,
                   const QColor& backgroundColor, QPainter::TextDirection d, bool visuallyOrdered,
                   int letterSpacing, int wordSpacing, bool smallCaps);
     void drawLineForText(int x, int y, int yOffset, int width);
index f54d7ebca0d4f700bae22912fb38b28e3882cfee..546105eb24bb39412fc0c408e92d2101985de78c 100644 (file)
@@ -597,7 +597,7 @@ void QPainter::_updateRenderer()
     }
 }
     
-void QPainter::drawText(int x, int y, int tabWidth, int xpos, int, int, int alignmentFlags, const QString &qstring)
+void QPainter::drawText(int x, int y, int, int, int alignmentFlags, const QString &qstring)
 {
     if (data->state.paintingDisabled)
         return;
@@ -617,8 +617,6 @@ void QPainter::drawText(int x, int y, int tabWidth, int xpos, int, int, int alig
     WebCoreInitializeEmptyTextStyle(&style);
     style.textColor = data->state.pen.color().getNSColor();
     style.families = families;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
     
     if (alignmentFlags & Qt::AlignRight)
         x -= ROUND_TO_INT([data->textRenderer floatWidthForRun:&run style:&style widths:0]);
@@ -626,10 +624,11 @@ void QPainter::drawText(int x, int y, int tabWidth, int xpos, int, int, int alig
     WebCoreTextGeometry geometry;
     WebCoreInitializeEmptyTextGeometry(&geometry);
     geometry.point = NSMakePoint(x, y);
+     
     [data->textRenderer drawRun:&run style:&style geometry:&geometry];
 }
 
-void QPainter::drawText(int x, int y, int tabWidth, int xpos, const QChar *str, int len, int from, int to, int toAdd, const QColor &backgroundColor, QPainter::TextDirection d, bool visuallyOrdered, int letterSpacing, int wordSpacing, bool smallCaps)
+void QPainter::drawText(int x, int y, const QChar *str, int len, int from, int to, int toAdd, const QColor &backgroundColor, QPainter::TextDirection d, bool visuallyOrdered, int letterSpacing, int wordSpacing, bool smallCaps)
 {
     if (data->state.paintingDisabled || len <= 0)
         return;
@@ -658,15 +657,14 @@ void QPainter::drawText(int x, int y, int tabWidth, int xpos, const QChar *str,
     style.smallCaps = smallCaps;
     style.families = families;
     style.padding = toAdd;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
     WebCoreTextGeometry geometry;
     WebCoreInitializeEmptyTextGeometry(&geometry);
     geometry.point = NSMakePoint(x, y);
+    
     [data->textRenderer drawRun:&run style:&style geometry:&geometry];
 }
 
-void QPainter::drawHighlightForText(int x, int y, int h, int tabWidth, int xpos,
+void QPainter::drawHighlightForText(int x, int y, int h, 
     const QChar *str, int len, int from, int to, int toAdd, const QColor &backgroundColor, 
     QPainter::TextDirection d, bool visuallyOrdered, int letterSpacing, int wordSpacing, bool smallCaps)
 {
@@ -697,8 +695,6 @@ void QPainter::drawHighlightForText(int x, int y, int h, int tabWidth, int xpos,
     style.smallCaps = smallCaps;
     style.families = families;    
     style.padding = toAdd;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
     WebCoreTextGeometry geometry;
     WebCoreInitializeEmptyTextGeometry(&geometry);
     geometry.point = NSMakePoint(x, y);
index cc4c9e930be582a62901d43ae0959340c880d9d1..bfa82c194abb7bae8a256de9f15a897c6fdaa5b8 100644 (file)
@@ -36,8 +36,6 @@ struct WebCoreTextStyle
     int letterSpacing;
     int wordSpacing;
     int padding;
-    int tabWidth;
-    int xpos;
     NSString **families;
     unsigned smallCaps : 1;
     unsigned rtl : 1;
index 23bd04c4e2789d62224556d8c04d0cdc226c0d02..be13240f54612ac32cd5d0697d42fa23bb0f73a0 100644 (file)
@@ -42,8 +42,6 @@ void WebCoreInitializeTextRun(WebCoreTextRun *run, const UniChar *characters, un
 void WebCoreInitializeEmptyTextStyle(WebCoreTextStyle *style)
 {
     style->padding = 0;
-    style->tabWidth = 0;
-    style->xpos = 0;
     style->textColor = nil;
     style->backgroundColor = nil;
     style->rtl = false;
index 84bf2b37ca0ec6fdbaefee4f10f2614466358684..8661630e9ab5b1108af97b47c2ab4a02f957ce14 100644 (file)
@@ -1,3 +1,17 @@
+2005-07-05  Adele Peterson  <adele@apple.com>
+
+       Rolling out changes for <rdar://problem/3792529> REGRESSION (Mail): Tabs do not work the way they did in Panther (especially useful in plain text mail)
+       since it caused a 2% performance regression.
+
+        * WebCoreSupport.subproj/WebTextRenderer.m:
+        (isSpace):
+        (-[WebTextRenderer _CG_drawHighlightForRun:style:geometry:]):
+        (-[WebTextRenderer _CG_floatWidthForRun:style:widths:fonts:glyphs:startPosition:numGlyphs:]):
+        (-[WebTextRenderer _extendCharacterToGlyphMapToInclude:]):
+        (-[WebTextRenderer _CG_pointToOffset:style:position:reversed:includePartialGlyphs:]):
+        (initializeCharacterWidthIterator):
+        (widthForNextCharacter):
+
 2005-07-05  John Sullivan  <sullivan@apple.com>
 
         Reviewed by Chris Blumenberg.
index 7e47991a50680b459d725e570265be995bbe175c..5d2369962bf10b7786594fec9a90fa6c3c7f8a0a 100644 (file)
@@ -179,11 +179,11 @@ struct CharacterWidthIterator
 
 static inline BOOL isSpace(UniChar c)
 {
-    return c == SPACE || c == '\t' || c == '\n' || c == NO_BREAK_SPACE;
+    return c == SPACE || c == '\n' || c == NO_BREAK_SPACE;
 }
 
 static const uint8_t isRoundingHackCharacterTable[0x100] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 1 /*\t*/, 1 /*\n*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 /*\n*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     1 /*space*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 /*-*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 /*?*/,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -287,7 +287,7 @@ static inline WebGlyphWidth widthForGlyph (WebTextRenderer *renderer, ATSGlyphRe
 
 // Iterator functions
 static void initializeCharacterWidthIterator (CharacterWidthIterator *iterator, WebTextRenderer *renderer, const WebCoreTextRun *run , const WebCoreTextStyle *style);
-static float widthForNextCharacter (CharacterWidthIterator *iterator, float leadWidth, ATSGlyphRef *glyphUsed, NSFont **fontUsed);
+static float widthForNextCharacter (CharacterWidthIterator *iterator, ATSGlyphRef *glyphUsed, NSFont **fontUsed);
 
 
 // Misc.
@@ -1008,13 +1008,13 @@ static void _drawGlyphs(NSFont *font, NSColor *color, CGGlyph *glyphs, CGSize *a
     // The starting point needs to be adjusted to account for the width of
     // the glyphs at the start of the run.
     while (widthIterator.currentCharacter < (unsigned)run->from) {
-        startPosition += widthForNextCharacter(&widthIterator, style->xpos + startPosition, 0, 0);
+        startPosition += widthForNextCharacter(&widthIterator, 0, 0);
     }
     float startX = startPosition + geometry->point.x;
     
     float backgroundWidth = 0.0;
     while (widthIterator.currentCharacter < (unsigned)run->to) {
-        backgroundWidth += widthForNextCharacter(&widthIterator, style->xpos + startPosition + backgroundWidth, 0, 0);
+        backgroundWidth += widthForNextCharacter(&widthIterator, 0, 0);
     }
 
     if (style->backgroundColor != nil){
@@ -1028,7 +1028,7 @@ static void _drawGlyphs(NSFont *font, NSColor *color, CGGlyph *glyphs, CGSize *a
         if (style->rtl){
             float completeRunWidth = startPosition + backgroundWidth;
             while (widthIterator.currentCharacter < run->length) {
-                completeRunWidth += widthForNextCharacter(&widthIterator, completeRunWidth, 0, 0);
+                completeRunWidth += widthForNextCharacter(&widthIterator, 0, 0);
             }
 
             [NSBezierPath fillRect:NSMakeRect(geometry->point.x + completeRunWidth - startPosition - backgroundWidth, yPos, backgroundWidth, height)];
@@ -1203,7 +1203,7 @@ static const char *joiningNames[] = {
     initializeCharacterWidthIterator(&widthIterator, self, run, style);
     if (startPosition)
         *startPosition = widthIterator.widthToStart;
-    while ((_nextWidth = widthForNextCharacter(&widthIterator, _totalWidth+style->xpos, &glyphUsed, &fontUsed)) != INVALID_WIDTH){
+    while ((_nextWidth = widthForNextCharacter(&widthIterator, &glyphUsed, &fontUsed)) != INVALID_WIDTH){
         if (fontBuffer)
             fontBuffer[numGlyphs] = fontUsed;
         if (glyphBuffer)
@@ -1339,9 +1339,8 @@ static const char *joiningNames[] = {
             buffer[i] = ZERO_WIDTH_SPACE;
         buffer[0x7F] = ZERO_WIDTH_SPACE;
 
-        // But \n, \t, and nonbreaking space must render as a space.
+        // But both \n and nonbreaking space must render as a space.
         buffer['\n'] = ' ';
-        buffer['\t'] = ' ';
         buffer[NO_BREAK_SPACE] = ' ';
     }
 
@@ -1757,8 +1756,7 @@ static WebCoreTextRun reverseCharactersInRun(const WebCoreTextRun *run)
 - (int)_CG_pointToOffset:(const WebCoreTextRun *)run style:(const WebCoreTextStyle *)style position:(int)x reversed:(BOOL)reversed includePartialGlyphs:(BOOL)includePartialGlyphs
 {
     float delta = (float)x;
-    float width;   ///  FIX: CHECK THIS
-    float leadWidth = style->xpos;
+    float width;
     unsigned offset = run->from;
     CharacterWidthIterator widthIterator;
     
@@ -1768,8 +1766,7 @@ static WebCoreTextRun reverseCharactersInRun(const WebCoreTextRun *run)
         width = [self floatWidthForRun:run style:style widths:nil];
         delta -= width;
         while (offset < run->length) {
-            float w = widthForNextCharacter(&widthIterator, leadWidth, 0, 0);
-            leadWidth += w;
+            float w = widthForNextCharacter(&widthIterator, 0, 0);
             if (w == INVALID_WIDTH) {
                 // Something very bad happened, like we only have half of a surrogate pair.
                 break;
@@ -1789,8 +1786,7 @@ static WebCoreTextRun reverseCharactersInRun(const WebCoreTextRun *run)
         }
     } else {
         while (offset < run->length) {
-            float w = widthForNextCharacter(&widthIterator, leadWidth, 0, 0);
-            leadWidth += w;
+            float w = widthForNextCharacter(&widthIterator, 0, 0);
             if (w == INVALID_WIDTH) {
                 // Something very bad happened, like we only have half of a surrogate pair.
                 break;
@@ -1946,7 +1942,7 @@ static void initializeCharacterWidthIterator (CharacterWidthIterator *iterator,
         initializeCharacterWidthIterator (&startPositionIterator, renderer, &startPositionRun, style);
         
         while (startPositionIterator.currentCharacter < (unsigned)startPositionRun.to){
-            widthForNextCharacter(&startPositionIterator, startPositionIterator.runWidthSoFar+style->xpos, 0, 0);
+            widthForNextCharacter(&startPositionIterator, 0, 0);
         }
         iterator->widthToStart = startPositionIterator.runWidthSoFar;
     }
@@ -1965,7 +1961,7 @@ static inline float ceilCurrentWidth (CharacterWidthIterator *iterator)
 #define HIRAGANA_KATAKANA_VOICING_MARKS 8
 
 // Return INVALID_WIDTH if an error is encountered or we're at the end of the range in the run.
-static float widthForNextCharacter(CharacterWidthIterator *iterator, float leadWidth, ATSGlyphRef *glyphUsed, NSFont **fontUsed)
+static float widthForNextCharacter(CharacterWidthIterator *iterator, ATSGlyphRef *glyphUsed, NSFont **fontUsed)
 {
     WebTextRenderer *renderer = iterator->renderer;
     const WebCoreTextRun *run = iterator->run;
@@ -2073,19 +2069,15 @@ static float widthForNextCharacter(CharacterWidthIterator *iterator, float leadW
     }
 
     // Now that we have glyph and font, get its width.
-    WebGlyphWidth width;
-    if (c == '\t' && style->tabWidth != 0) {
-        width = style->tabWidth - (CEIL_TO_INT(leadWidth) % style->tabWidth);
-    } else {
-        width = widthForGlyph(renderer, *glyphUsed, *fontUsed);
-        // We special case spaces in two ways when applying word rounding.
-        // First, we round spaces to an adjusted width in all fonts.
-        // Second, in fixed-pitch fonts we ensure that all characters that
-        // match the width of the space character have the same width as the space character.
-        if ((renderer->treatAsFixedPitch ? width == renderer->spaceWidth : *glyphUsed == renderer->spaceGlyph) && iterator->style->applyWordRounding)
-            width = renderer->adjustedSpaceWidth;
-    }
+    WebGlyphWidth width = widthForGlyph(renderer, *glyphUsed, *fontUsed);
     
+    // We special case spaces in two ways when applying word rounding.
+    // First, we round spaces to an adjusted width in all fonts.
+    // Second, in fixed-pitch fonts we ensure that all characters that
+    // match the width of the space character have the same width as the space character.
+    if ((renderer->treatAsFixedPitch ? width == renderer->spaceWidth : *glyphUsed == renderer->spaceGlyph) && iterator->style->applyWordRounding)
+        width = renderer->adjustedSpaceWidth;
+
     // Try to find a substitute font if this font didn't have a glyph for a character in the
     // string.  If one isn't found we end up drawing and measuring the 0 glyph, usually a box.
     if (*glyphUsed == 0 && iterator->style->attemptFontSubstitution) {