[Webkit-unassigned] [Bug 192554] New: [GTK][WPE] Rendering artifact on subpixel positions

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Mon Dec 10 05:09:15 PST 2018


https://bugs.webkit.org/show_bug.cgi?id=192554

            Bug ID: 192554
           Summary: [GTK][WPE] Rendering artifact on subpixel positions
           Product: WebKit
           Version: WebKit Local Build
          Hardware: Unspecified
                OS: Unspecified
            Status: NEW
          Severity: Normal
          Priority: P2
         Component: Layout and Rendering
          Assignee: webkit-unassigned at lists.webkit.org
          Reporter: karl.leplat_ext at softathome.com
                CC: achristensen at apple.com, bfulgham at webkit.org,
                    fred.wang at free.fr, hyatt at apple.com,
                    loic.yhuel at softathome.com, magomez at igalia.com,
                    olivier.blin at softathome.com, simon.fraser at apple.com,
                    zalan at apple.com, zan at falconsigh.net

In compositing mode, rendering artifacts have been detected on the repaint of elements on subpixel position.
We suspect a problem on rounding computing sequences, this bug is reproducible on WebKit GTK and WPE.
This bug is not reproducible with compositing mode disabled.

AncestorGraphicsLayer               1st frame                                    DirtyRect              2nd frame
--------------- 24px           --------------- 24px                                                 --------------
- 24.359375px -                 -     24px   -                                                      - no painted
--------------- 48.359375px    --------------- 48px  (Force compositing mode) ------------- 48px    -------------- 48px
- 24.359375px -                -      25px   -  --> Need display this rect    -    24px   -    -->  -    25px    -
--------------- 72.7187        --------------- 73px                           -------------         -------------- BUG: one pixels line no repainted
- 24.359375px -                -      24px   -                                                      - no painted -
---------------                ---------------                                                      --------------

Source files for logs:
<WebCore/platform/graphics/LayoutRect.h::snapRectToDevicePixels()>
<WebCore/rendering/RenderLayerBacking.cpp::setContentsNeedDisplayInRect()>
<WebCore/platform/graphics/nicosia/NicosiaPaintingEngineBasic.cpp::paint()>
<WebCore/platform/graphics/cairo/CairoOperations.cpp::fillRectWithColor()>

Dump logs with the previous HTML test:

***************************** 1st frame processing ************************************
************** Update tiles in backingStore for GraphicsLayer ******************
setContentsNeedDisplayInRect LayoutRect before: x(48.000000) y(24.000000) w(59.000000) h(24.359375)
snapRectToDevicePixels result after: x(48.000000) y(24.000000) width(59.000000) height(24.000000)
outlineBoundsForRepaint container before: x(0.000000) y(0.000000) w(59.000000) h(24.359375)
snapRectToDevicePixels result after: x(0.000000) y(0.000000) w(59.000000) h(24.000000)

setContentsNeedDisplayInRect LayoutRect before: x(48.000000) y(48.359375) w(59.000000) h(24.359375)
snapRectToDevicePixels result after: x(48.000000) y(48.000000) width(59.000000) height(25.000000)
outlineBoundsForRepaint container before: x(0.000000) y(0.000000) w(59.000000) h(24.359375)
snapRectToDevicePixels result after: x(0.000000) y(0.000000) w(59.000000) h(24) ??????

setContentsNeedDisplayInRect LayoutRecti before: x(48.000000) y(72.718750) w(59.000000) h(24.359375)
snapRectToDevicePixels result after: x(48.000000) y(73.000000) width(59.000000) height(24.000000)
outlineBoundsForRepaint container before: x(0.000000) y(0.000000) w(59.000000) h(24.359375)
snapRectToDevicePixels result after: x(0.000000) y(0.000000) w(59.000000) h(24.000000)
********************************************************************************
************ Paint Web contents ******************************************
********* paint() --> fillRectWithColor() **************
cairo paint fill (Color::transparent) x(0.000000) y(0.000000) width(59.000000) height(25.000000)
cairo paint fill contents x(0.000000) y(0.000000) width(58.000000) height(24.000000)

********* paint() --> fillRectWithColor() **************
new targetRect with size : width(59px) height(25px)
cairo paint fill (Color::transparent) x(0.000000) y(0.000000) width(59.000000) height(25.000000)
------------> TO BE NOTED: this rect that should be updated in the second frame is filled with 25px of height <------------
cairo paint fill contents x(0.000000) y(0.000000) width(58.000000) height(25.000000)

********* paint() --> fillRectWithColor() **************
cairo paint fill (Color::transparent) x(0.000000) y(0.000000) width(59.000000) height(26.000000)
cairo paint fill contents x(0.000000) y(1.000000) width(58.000000) height(24.000000)
************************************* end of frame ********************************************

********************* 2nd frame processing in compositing mode *******************
************** Update tile in backingStore for GraphicsLayer ******************
setContentsNeedDisplayInRect LayoutRect x(0.000000) y(0.000000) w(59.000000) h(24.359375)
snapRectToDevicePixels result: x(0.000000) y(0.000000) width(59.000000) height(24.000000) ?????

The layout position (0.0 , 0.0) is not the same with the previous frame(48.0 , 48.359375)
Results with the two origins and a layout height of 24.359375px :
for position(0.0 , 0.0) we get 0.0 + 24.359375 = int(24)px of height
for position(48.0 , 48.359375) we get 48.359375 ==> 0.359375 + 24.359375 = 24,71875 = int(25)px of height
We can see that for the same dirtyRect we get differents height.
The calculation is done before moving by subpixels offset, perhaps we should take this for the rounding ?
*******************************************************************************
************ Paint Web contents ******************************************
********* paint() --> fillRectWithColor() **************
cairo paint fill (Color::transparent) x(0.000000) y(0.000000) width(59.000000) height(24.000000) ?????
-------> TO BE NOTED: this rect is now filled with only 24px of height why ??
cairo paint fill contents x(0.000000) y(0.000000) width(58.000000) height(25.000000)
********************* end of frame  ******************************************************

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-unassigned/attachments/20181210/1d8452f4/attachment.html>


More information about the webkit-unassigned mailing list