⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 95697 in webkit


Ignore:
Timestamp:
Sep 21, 2011, 8:29:50 PM (15 years ago)
Author:
Beth Dakin
Message:

https://bugs.webkit.org/show_bug.cgi?id=67415
Text drawn via -webkit-background-clip:text is blurry at device scale factors >1.0
-and corresponding-
<rdar://problem/10060379>

Reviewed by Darin Adler.

New helper function RenderBoxModelObject scales the mask image by the
deviceScaleFactor to get an image of the appropriate resolution. It also scales
the image's GraphicsContext so that the clip is set up on the same scale. Back in
paintFillLayerExtended() we still clip the image to the original maskRect to get
everything scaled back to the appropriate size.

  • rendering/RenderBoxModelObject.cpp:

(WebCore::createDeviceScaledImageBuffer):
(WebCore::RenderBoxModelObject::paintFillLayerExtended):

Make the deviceScaleFactor convenience function just a namespace-level function in
Page rather than a static member or Page.

  • page/Page.cpp:

(WebCore::deviceScaleFactor):

  • page/Page.h:


Pre-existing callers of Page::deviceScaleFactor(Frame*) must now use
WebCore::deviceScaleFactor(Frame*)

  • editing/DeleteButtonController.cpp:

(WebCore::DeleteButtonController::createDeletionUI):

  • rendering/RenderImage.cpp:

(WebCore::RenderImage::imageSizeForError):
(WebCore::RenderImage::paintReplaced):

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::drawPlatformResizerImage):

Location:
trunk/Source/WebCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r95695 r95697  
     12011-09-21  Beth Dakin  <bdakin@apple.com>
     2
     3        https://bugs.webkit.org/show_bug.cgi?id=67415
     4        Text drawn via -webkit-background-clip:text is blurry at device scale factors >1.0
     5        -and corresponding-
     6        <rdar://problem/10060379>
     7
     8        Reviewed by Darin Adler.
     9
     10        New helper function RenderBoxModelObject scales the mask image by the
     11        deviceScaleFactor to get an image of the appropriate resolution. It also scales
     12        the image's GraphicsContext so that the clip is set up on the same scale. Back in
     13        paintFillLayerExtended() we still clip the image to the original maskRect to get
     14        everything scaled back to the appropriate size.
     15        * rendering/RenderBoxModelObject.cpp:
     16        (WebCore::createDeviceScaledImageBuffer):
     17        (WebCore::RenderBoxModelObject::paintFillLayerExtended):
     18
     19        Make the deviceScaleFactor convenience function just a namespace-level function in
     20        Page rather than a static member or Page.
     21        * page/Page.cpp:
     22        (WebCore::deviceScaleFactor):
     23        * page/Page.h:
     24       
     25        Pre-existing callers of Page::deviceScaleFactor(Frame*) must now use
     26        WebCore::deviceScaleFactor(Frame*)
     27        * editing/DeleteButtonController.cpp:
     28        (WebCore::DeleteButtonController::createDeletionUI):
     29        * rendering/RenderImage.cpp:
     30        (WebCore::RenderImage::imageSizeForError):
     31        (WebCore::RenderImage::paintReplaced):
     32        * rendering/RenderLayer.cpp:
     33        (WebCore::RenderLayer::drawPlatformResizerImage):
     34
    1352011-09-21  Tim Horton  <timothy_horton@apple.com>
    236
  • trunk/Source/WebCore/editing/DeleteButtonController.cpp

    r95244 r95697  
    256256    style->setProperty(CSSPropertyVisibility, CSSValueVisible);
    257257
    258     float deviceScaleFactor = Page::deviceScaleFactor(m_frame);
     258    float deviceScaleFactor = WebCore::deviceScaleFactor(m_frame);
    259259    RefPtr<Image> buttonImage;
    260260    if (deviceScaleFactor >= 2)
  • trunk/Source/WebCore/page/Page.cpp

    r95548 r95697  
    110110}
    111111
     112float deviceScaleFactor(Frame* frame)
     113{
     114    if (!frame)
     115        return 1;
     116    Page* page = frame->page();
     117    if (!page)
     118        return 1;
     119    return page->deviceScaleFactor();
     120}
     121
    112122Page::Page(PageClients& pageClients)
    113123    : m_chrome(adoptPtr(new Chrome(this, pageClients.chromeClient)))
     
    657667}
    658668
    659 float Page::deviceScaleFactor(Frame* frame)
    660 {
    661     if (!frame)
    662         return 1;
    663     Page* page = frame->page();
    664     if (!page)
    665         return 1;
    666     return page->deviceScaleFactor();
    667 }
    668 
    669669void Page::didMoveOnscreen()
    670670{
  • trunk/Source/WebCore/page/Page.h

    r94900 r95697  
    9595    enum FindDirection { FindDirectionForward, FindDirectionBackward };
    9696
     97    float deviceScaleFactor(Frame*);
     98
    9799    class Page {
    98100        WTF_MAKE_NONCOPYABLE(Page);
     
    250252        float deviceScaleFactor() const { return m_deviceScaleFactor; }
    251253        void setDeviceScaleFactor(float);
    252         static float deviceScaleFactor(Frame*);
    253254
    254255        // Notifications when the Page starts and stops being presented via a native window.
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r95121 r95697  
    596596}
    597597
     598static PassOwnPtr<ImageBuffer> createDeviceScaledImageBuffer(IntSize imageSize, float deviceScaleFactor)
     599{
     600    // To create an image of the appropriate resolution, we need to scale imageRect's size
     601    // by the device scale factor.
     602    IntSize scaledImageSize = imageSize;
     603    scaledImageSize.scale(deviceScaleFactor);
     604
     605    OwnPtr<ImageBuffer> scaledImageBuffer = ImageBuffer::create(scaledImageSize);
     606    if (!scaledImageBuffer)
     607        return nullptr;
     608
     609    // Scale the whole context by the device scale factor so that all of the clips set up at
     610    // the appropriate size.
     611    scaledImageBuffer->context()->scale(FloatSize(deviceScaleFactor, deviceScaleFactor));
     612
     613    return scaledImageBuffer.release();
     614}
     615
    598616void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, const Color& color, const FillLayer* bgLayer, const LayoutRect& rect,
    599617    BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* box, const LayoutSize& boxSize, CompositeOperator op, RenderObject* backgroundObject)
     
    689707       
    690708        // Now create the mask.
    691         OwnPtr<ImageBuffer> maskImage = ImageBuffer::create(maskRect.size());
     709        OwnPtr<ImageBuffer> maskImage = createDeviceScaledImageBuffer(maskRect.size(), WebCore::deviceScaleFactor(frame()));
    692710        if (!maskImage)
    693711            return;
  • trunk/Source/WebCore/rendering/RenderImage.cpp

    r95502 r95697  
    8787    IntSize imageSize;
    8888    if (newImage->willPaintBrokenImage()) {
    89         float deviceScaleFactor = Page::deviceScaleFactor(frame());
     89        float deviceScaleFactor = WebCore::deviceScaleFactor(frame());
    9090        pair<Image*, float> brokenImageAndImageScaleFactor = newImage->brokenImage(deviceScaleFactor);
    9191        imageSize = brokenImageAndImageScaleFactor.first->size();
     
    278278
    279279            if (m_imageResource->errorOccurred() && !image->isNull() && usableWidth >= image->width() && usableHeight >= image->height()) {
    280                 float deviceScaleFactor = Page::deviceScaleFactor(frame());
     280                float deviceScaleFactor = WebCore::deviceScaleFactor(frame());
    281281                // Call brokenImage() explicitly to ensure we get the broken image icon at the appropriate resolution.
    282282                pair<Image*, float> brokenImageAndImageScaleFactor = m_imageResource->cachedImage()->brokenImage(deviceScaleFactor);
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r95694 r95697  
    24172417void RenderLayer::drawPlatformResizerImage(GraphicsContext* context, LayoutRect resizerCornerRect)
    24182418{
    2419     float deviceScaleFactor = Page::deviceScaleFactor(renderer()->frame());
     2419    float deviceScaleFactor = WebCore::deviceScaleFactor(renderer()->frame());
    24202420
    24212421    RefPtr<Image> resizeCornerImage;
Note: See TracChangeset for help on using the changeset viewer.