| Summary: | Subpixel layout: ceiledLayoutUnit()/roundedLayoutUnit() should CSS pixelsnap when subpixel is on. | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Product: | WebKit | Reporter: | zalan <zalan> | ||||||
| Component: | Layout and Rendering | Assignee: | zalan <zalan> | ||||||
| Status: | RESOLVED INVALID | ||||||||
| Severity: | Normal | CC: | hyatt, jonlee, simon.fraser, webkit-bug-importer | ||||||
| Priority: | P2 | Keywords: | InRadar | ||||||
| Version: | 528+ (Nightly build) | ||||||||
| Hardware: | Unspecified | ||||||||
| OS: | Unspecified | ||||||||
| Bug Depends on: | |||||||||
| Bug Blocks: | 126283 | ||||||||
| Attachments: |
|
||||||||
frame #0: 0x0000000104f6874c WebCore`WebCore::LayoutUnit::fromFloatCeil(value=21.202999) + 124 at LayoutUnit.h:130
frame #1: 0x00000001051329a7 WebCore`WebCore::ceiledLayoutUnit(value=21.202999) + 23 at LayoutUnit.h:945
frame #2: 0x0000000105185ebd WebCore`WebCore::updatePreferredWidth(preferredWidth=0x00007fedc2602498, result=0x00007fff5f4afb28) + 29 at RenderBlock.cpp:4250
frame #3: 0x000000010518407a WebCore`WebCore::RenderBlock::computeInlinePreferredLogicalWidths(this=0x00007fedc2602420, minLogicalWidth=0x00007fedc2602498, maxLogicalWidth=0x00007fedc260249c) + 4106 at RenderBlock.cpp:4570
frame #4: 0x0000000105182d10 WebCore`WebCore::RenderBlock::computeIntrinsicLogicalWidths(this=0x00007fedc2602420, minLogicalWidth=0x00007fedc2602498, maxLogicalWidth=0x00007fedc260249c) const + 96 at RenderBlock.cpp:4059
frame #5: 0x0000000105185668 WebCore`WebCore::RenderBlock::computePreferredLogicalWidths(this=0x00007fedc2602420) + 536 at RenderBlock.cpp:4098
frame #6: 0x00000001051d5559 WebCore`WebCore::RenderBox::minPreferredLogicalWidth(this=0x00007fedc2602420) const + 89 at RenderBox.cpp:943
frame #7: 0x00000001051835d1 WebCore`WebCore::RenderBlock::computeInlinePreferredLogicalWidths(this=0x00007fedc2696400, minLogicalWidth=0x00007fedc2696478, maxLogicalWidth=0x00007fedc269647c) + 1377 at RenderBlock.cpp:4386
frame #8: 0x0000000105182d10 WebCore`WebCore::RenderBlock::computeIntrinsicLogicalWidths(this=0x00007fedc2696400, minLogicalWidth=0x00007fedc2696478, maxLogicalWidth=0x00007fedc269647c) const + 96 at RenderBlock.cpp:4059
frame #9: 0x0000000105185668 WebCore`WebCore::RenderBlock::computePreferredLogicalWidths(this=0x00007fedc2696400) + 536 at RenderBlock.cpp:4098
frame #10: 0x00000001051d5559 WebCore`WebCore::RenderBox::minPreferredLogicalWidth(this=0x00007fedc2696400) const + 89 at RenderBox.cpp:943
frame #11: 0x00000001051d2f5f WebCore`WebCore::RenderBox::computeLogicalWidthInRegionUsing(this=0x00007fedc2696400, widthType=MainOrPreferredSize, logicalWidth=0x00007fff5f4b09c8, availableLogicalWidth=LayoutUnit at 0x00007fff5f4b0710, cb=0x00007fedc2695a00, region=0x0000000000000000) const + 799 at RenderBox.cpp:2330
frame #12: 0x00000001051dd08d WebCore`WebCore::RenderBox::computeLogicalWidthInRegion(this=0x00007fedc2696400, computedValues=0x00007fff5f4b0b90, region=0x0000000000000000) const + 2173 at RenderBox.cpp:2243
frame #13: 0x00000001051dc7a7 WebCore`WebCore::RenderBox::updateLogicalWidth(this=0x00007fedc2696400) + 55 at RenderBox.cpp:2179
frame #14: 0x000000010517395f WebCore`WebCore::RenderBlock::updateLogicalWidthAndColumnWidth(this=0x00007fedc2696400) + 63 at RenderBlock.cpp:1562
frame #15: 0x00000001059e7057 WebCore`WebCore::RenderBlockFlow::layoutBlock(this=0x00007fedc2696400, relayoutChildren=false, pageLogicalHeight=LayoutUnit at 0x00007fff5f4b0f30) + 263 at RenderBlockFlow.cpp:315
frame #16: 0x000000010517225d WebCore`WebCore::RenderBlock::layout(this=0x00007fedc2696400) + 125 at RenderBlock.cpp:1323
frame #17: 0x000000010443605c WebCore`WebCore::RenderElement::layoutIfNeeded(this=0x00007fedc2696400) + 60 at RenderElement.h:99
frame #18: 0x00000001059e9d37 WebCore`WebCore::RenderBlockFlow::insertFloatingObject(this=0x00007fedc2695a00, floatBox=0x00007fedc2696400) + 647 at RenderBlockFlow.cpp:2006
frame #19: 0x00000001051c7520 WebCore`WebCore::LineBreaker::insertFloatingObject(this=0x00007fff5f4b2be0, floatBox=0x00007fedc2696400) + 32 at LineBreaker.h:71
frame #20: 0x00000001051bacf1 WebCore`WebCore::BreakingContext::handleFloat(this=0x00007fff5f4b1410) + 65 at BreakingContextInlineHeaders.h:349
frame #21: 0x00000001051b5847 WebCore`WebCore::LineBreaker::nextSegmentBreak(this=0x00007fff5f4b2be0, resolver=0x00007fff5f4b2e78, lineInfo=0x00007fff5f4b3190, renderTextInfo=0x00007fff5f4b2c50, lastFloatFromPreviousLine=0x0000000000000000, consecutiveHyphenatedLines=0, wordMeasurements=0x00007fff5f4b1b30) + 775 at RenderBlockLineLayout.cpp:2077
frame #22: 0x00000001051b28cc WebCore`WebCore::LineBreaker::nextLineBreak(this=0x00007fff5f4b2be0, resolver=0x00007fff5f4b2e78, lineInfo=0x00007fff5f4b3190, renderTextInfo=0x00007fff5f4b2c50, lastFloatFromPreviousLine=0x0000000000000000, consecutiveHyphenatedLines=0, wordMeasurements=0x00007fff5f4b1b30) + 188 at RenderBlockLineLayout.cpp:2007
frame #23: 0x00000001051af0eb WebCore`WebCore::RenderBlockFlow::layoutRunsAndFloatsInRange(this=0x00007fedc2695a00, layoutState=0x00007fff5f4b3190, resolver=0x00007fff5f4b2e78, cleanLineStart=0x00007fff5f4b2e28, cleanLineBidiStatus=0x00007fff5f4b2e10, consecutiveHyphenatedLines=0) + 1579 at RenderBlockLineLayout.cpp:1333
frame #24: 0x00000001051adc79 WebCore`WebCore::RenderBlockFlow::layoutRunsAndFloats(this=0x00007fedc2695a00, layoutState=0x00007fff5f4b3190, hasInlineChild=true) + 1177 at RenderBlockLineLayout.cpp:1094
frame #25: 0x00000001051b3981 WebCore`WebCore::RenderBlockFlow::layoutLineBoxes(this=0x00007fedc2695a00, relayoutChildren=false, repaintLogicalTop=0x00007fff5f4b35e8, repaintLogicalBottom=0x00007fff5f4b35e0) + 1969 at RenderBlockLineLayout.cpp:1686
frame #26: 0x00000001059e8181 WebCore`WebCore::RenderBlockFlow::layoutInlineChildren(this=0x00007fedc2695a00, relayoutChildren=false, repaintLogicalTop=0x00007fff5f4b35e8, repaintLogicalBottom=0x00007fff5f4b35e0) + 433 at RenderBlockFlow.cpp:536
frame #27: 0x00000001059e73f5 WebCore`WebCore::RenderBlockFlow::layoutBlock(this=0x00007fedc2695a00, relayoutChildren=false, pageLogicalHeight=LayoutUnit at 0x00007fff5f4b3670) + 1189 at RenderBlockFlow.cpp:361
frame #28: 0x000000010517225d WebCore`WebCore::RenderBlock::layout(this=0x00007fedc2695a00) + 125 at RenderBlock.cpp:1323
frame #29: 0x00000001052f4f6f WebCore`WebCore::RenderListItem::layout(this=0x00007fedc2695a00) + 111 at RenderListItem.cpp:310
frame #30: 0x00000001059ea7db WebCore`WebCore::RenderBlockFlow::layoutBlockChild(this=0x00007fedc26cfef0, child=0x00007fedc2695a00, marginInfo=0x00007fff5f4b3b28, previousFloatLogicalBottom=0x00007fff5f4b3b08, maxFloatLogicalBottom=0x00007fff5f4b3e08) + 1323 at RenderBlockFlow.cpp:597
frame #31: 0x00000001059e8401 WebCore`WebCore::RenderBlockFlow::layoutBlockChildren(this=0x00007fedc26cfef0, relayoutChildren=false, maxFloatLogicalBottom=0x00007fff5f4b3e08) + 625 at RenderBlockFlow.cpp:516
frame #32: 0x00000001059e7418 WebCore`WebCore::RenderBlockFlow::layoutBlock(this=0x00007fedc26cfef0, relayoutChildren=false, pageLogicalHeight=LayoutUnit at 0x00007fff5f4b3ea0) + 1224 at RenderBlockFlow.cpp:363
frame #33: 0x000000010517225d WebCore`WebCore::RenderBlock::layout(this=0x00007fedc26cfef0) + 125 at RenderBlock.cpp:1323
frame #34: 0x00000001059ea7db WebCore`WebCore::RenderBlockFlow::layoutBlockChild(this=0x00007fedc26b2c60, child=0x00007fedc26cfef0, marginInfo=0x00007fff5f4b4328, previousFloatLogicalBottom=0x00007fff5f4b4308, maxFloatLogicalBottom=0x00007fff5f4b4608) + 1323 at RenderBlockFlow.cpp:597
frame #35: 0x00000001059e8401 WebCore`WebCore::RenderBlockFlow::layoutBlockChildren(this=0x00007fedc26b2c60, relayoutChildren=false, maxFloatLogicalBottom=0x00007fff5f4b4608) + 625 at RenderBlockFlow.cpp:516
frame #36: 0x00000001059e7418 WebCore`WebCore::RenderBlockFlow::layoutBlock(this=0x00007fedc26b2c60, relayoutChildren=false, pageLogicalHeight=LayoutUnit at 0x00007fff5f4b46a0) + 1224 at RenderBlockFlow.cpp:363
frame #37: 0x000000010517225d WebCore`WebCore::RenderBlock::layout(this=0x00007fedc26b2c60) + 125 at RenderBlock.cpp:1323
frame #38: 0x00000001059ea7db WebCore`WebCore::RenderBlockFlow::layoutBlockChild(this=0x00007fedc26cfdb0, child=0x00007fedc26b2c60, marginInfo=0x00007fff5f4b4b28, previousFloatLogicalBottom=0x00007fff5f4b4b08, maxFloatLogicalBottom=0x00007fff5f4b4e08) + 1323 at RenderBlockFlow.cpp:597
frame #39: 0x00000001059e8401 WebCore`WebCore::RenderBlockFlow::layoutBlockChildren(this=0x00007fedc26cfdb0, relayoutChildren=false, maxFloatLogicalBottom=0x00007fff5f4b4e08) + 625 at RenderBlockFlow.cpp:516
frame #40: 0x00000001059e7418 WebCore`WebCore::RenderBlockFlow::layoutBlock(this=0x00007fedc26cfdb0, relayoutChildren=false, pageLogicalHeight=LayoutUnit at 0x00007fff5f4b4ea0) + 1224 at RenderBlockFlow.cpp:363
frame #41: 0x000000010517225d WebCore`WebCore::RenderBlock::layout(this=0x00007fedc26cfdb0) + 125 at RenderBlock.cpp:1323
frame #42: 0x00000001059ea7db WebCore`WebCore::RenderBlockFlow::layoutBlockChild(this=0x00007fedc26393b0, child=0x00007fedc26cfdb0, marginInfo=0x00007fff5f4b5328, previousFloatLogicalBottom=0x00007fff5f4b5308, maxFloatLogicalBottom=0x00007fff5f4b5608) + 1323 at RenderBlockFlow.cpp:597
frame #43: 0x00000001059e8401 WebCore`WebCore::RenderBlockFlow::layoutBlockChildren(this=0x00007fedc26393b0, relayoutChildren=false, maxFloatLogicalBottom=0x00007fff5f4b5608) + 625 at RenderBlockFlow.cpp:516
frame #44: 0x00000001059e7418 WebCore`WebCore::RenderBlockFlow::layoutBlock(this=0x00007fedc26393b0, relayoutChildren=false, pageLogicalHeight=LayoutUnit at 0x00007fff5f4b56a0) + 1224 at RenderBlockFlow.cpp:363
frame #45: 0x000000010517225d WebCore`WebCore::RenderBlock::layout(this=0x00007fedc26393b0) + 125 at RenderBlock.cpp:1323
frame #46: 0x000000010543aa2d WebCore`WebCore::RenderView::layoutContent(this=0x00007fedc26393b0, state=0x00007fedc2624230) + 93 at RenderView.cpp:158
frame #47: 0x000000010543bbd7 WebCore`WebCore::RenderView::layout(this=0x00007fedc26393b0) + 2087 at RenderView.cpp:344
frame #48: 0x00000001044e20be WebCore`WebCore::FrameView::layout(this=0x00007fedc2625970, allowSubtree=true) + 3422 at FrameView.cpp:1261
frame #49: 0x00000001044eb1f9 WebCore`WebCore::FrameView::updateLayoutAndStyleIfNeededRecursive(this=0x00007fedc2625970) + 89 at FrameView.cpp:3627
frame #50: 0x000000010086a680 WebKit`-[WebHTMLView(self=0x00007fedc26afb30, _cmd=0x00007fff87dfa568) _web_updateLayoutAndStyleIfNeededRecursive] + 112 at WebHTMLView.mm:5391
frame #51: 0x0000000100853402 WebKit`-[WebHTMLView(self=0x00007fedc26afb30, _cmd=0x00007fff89d918a3) viewWillDraw] + 98 at WebHTMLView.mm:1267
This and Bug 125874 are more like placeholders to discuss the rounding strategy (if needed at all) I think Dave Hyatt should comment on how RenderBlock::computeInlinePreferredLogicalWidths() should work with subpixel layout enabled. Created attachment 220040 [details]
test case (computeInlinePreferredLogicalWidths ceiling)
While calculating the preferred inline width, we ceil the width value. In case of subpixel off, it ceils to CSS pixel value, while with subpixel on, it ceils to layout unit value.
subpixel off: 138.37451 ceiling -> 139px
subpixel on: 138.37451 converting to layout unit -> 8855.96864 ceiling -> 8856. It later (at painting time) gets rounded to 138px (138.375)
*** Bug 126048 has been marked as a duplicate of this bug. *** (In reply to comment #5) > Created an attachment (id=220040) [details] > test case (computeInlinePreferredLogicalWidths ceiling) > > While calculating the preferred inline width, we ceil the width value. In case of subpixel off, it ceils to CSS pixel value, while with subpixel on, it ceils to layout unit value. > subpixel off: 138.37451 ceiling -> 139px > subpixel on: 138.37451 converting to layout unit -> 8855.96864 ceiling -> 8856. It later (at painting time) gets rounded to 138px (138.375) In this case, the ceiling happens at -> static inline void updatePreferredWidth(LayoutUnit& preferredWidth, float& result) Matches FF's(v26) behavior. |
Created attachment 219390 [details] test case float value: 22.203 LayoutUnit ceiledLayoutUnit(float) subpixel off: ->23 unit -> 23 CSS px/ subpixel on: (22.203 * 64) -> 1420.992 -> ceiled to 1421 unit -> (later) snapped to 22 CSS px in order to preserve the CSS px correctness, these functions need to snap to CSS units instead. simple test case: <html> <head> <style> span { float: left; } </style> </head> <body> <ul> <li><span>foo<span></li> </ul> </body> </html>