Changeset 21211 in webkit


Ignore:
Timestamp:
May 1, 2007 3:10:41 PM (17 years ago)
Author:
darin
Message:

LayoutTests:

Reviewed by Hyatt.

  • fast/canvas/canvas-size-change-after-layout-expected.checksum: Added.
  • fast/canvas/canvas-size-change-after-layout-expected.png: Added.
  • fast/canvas/canvas-size-change-after-layout-expected.txt: Added.
  • fast/canvas/canvas-size-change-after-layout.html: Added.

WebCore:

Reviewed by Hyatt.

  • remove intrinsicWidth/Height functions from RenderObject

Test: fast/canvas/canvas-size-change-after-layout.html

  • html/HTMLCanvasElement.cpp: (WebCore::HTMLCanvasElement::createRenderer): Removed code to set the intrinsic size, because the renderer now takes care of this in its constructor. (WebCore::HTMLCanvasElement::reset): Instead of calling the setIntrinsicWidth/Height functions, call canvasSizeChanged, which takes care of layout, but only if the size actually changed. Also call repaint if the contents of the canvas changed.
  • rendering/RenderApplet.h:
  • rendering/RenderApplet.cpp: (WebCore::RenderApplet::intrinsicSize): Override the new intrinsicSize function. This override still doesn't make sense, so left a FIXME in here.
  • rendering/RenderBox.h: Added an intrinsicSize function here to replace the intrinsicWidth/Height functions removed from RenderObject.
  • rendering/RenderBox.cpp: (WebCore::RenderBox::calcReplacedWidthUsing): Use intrinsicSize instead of intrinsicWidth. (WebCore::RenderBox::calcReplacedHeightUsing): Ditto, but for height.
  • rendering/RenderHTMLCanvas.h: Changed the constructor parameter to be an HTMLCanvasElement* instead of Node*. Also added a canvasSizeChanged function.
  • rendering/RenderHTMLCanvas.cpp: (WebCore::RenderHTMLCanvas::RenderHTMLCanvas): Pass an initial intrinsic size based on the current size of the canvas element. This is now the responsibility of the renderer and the DOM element calls the canvasSizeChanged function when the size changes. (WebCore::RenderHTMLCanvas::paint): Removed checks of the type of the element, and used the node() function because we don't have to worry about the anonymous case in this class. (WebCore::RenderHTMLCanvas::canvasSizeChanged): Added. Changes the size and then calls setNeedsLayout and setPrefWidthsDirty as needed. I based the logic here on careful reading of RenderImage::imageChanged.
  • rendering/RenderImage.cpp: (WebCore::RenderImage::RenderImage): Pass a default intrinsic size of 0,0 instead of calling setIntrinsicWidth/Height. (WebCore::RenderImage::setImageSizeForAltText): Call the new intrinsic size functions instead of the width/height ones. Simplifies the logic since we handle both dimensions at once. (WebCore::RenderImage::imageChanged): Ditto. (WebCore::RenderImage::layout): Ditto. (WebCore::RenderImage::calcAspectRatioWidth): Ditto. (WebCore::RenderImage::calcAspectRatioHeight): Ditto.
  • rendering/RenderObject.h: Removed intrinsicWidth/Height virtual functions.
  • rendering/RenderReplaced.h: Replaced intrinsicWidth, intrinsicHeight, setIntrinsicWidth, setIntrinsicHeight, m_intrinsicWidth, and m_intrinsicHeight with intrinsicSize, setIntrinsicSize, and m_intrinsicSize.
  • rendering/RenderReplaced.cpp: (WebCore::RenderReplaced::RenderReplaced): Added a second contructor that takes an intrinsic size parameter. Also updated constructor since the intrinsic size is now an IntSize instead of two integers. (WebCore::RenderReplaced::intrinsicSize): Added. No point in making this inline because it's a virtual function. (WebCore::RenderReplaced::setIntrinsicSize): Added. Didn't make this inline, partly because in the future we might want this to be more than just a simple setter function, factoring in common code used in both RenderImage and RenderHTMLCanvas.
  • rendering/RenderWidget.h: Removed a stray using declaration that wasn't needed.
Location:
trunk
Files:
4 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r21208 r21211  
     12007-05-01  Darin Adler  <darin@apple.com>
     2
     3        Reviewed by Hyatt.
     4
     5        - test for http://bugs.webkit.org/show_bug.cgi?id=13559
     6          REGRESSION: Canvas aspect ratio is incorrect
     7
     8        * fast/canvas/canvas-size-change-after-layout-expected.checksum: Added.
     9        * fast/canvas/canvas-size-change-after-layout-expected.png: Added.
     10        * fast/canvas/canvas-size-change-after-layout-expected.txt: Added.
     11        * fast/canvas/canvas-size-change-after-layout.html: Added.
     12
    1132007-05-01  Darin Adler  <darin@apple.com>
    214
  • trunk/WebCore/ChangeLog

    r21209 r21211  
     12007-05-01  Darin Adler  <darin@apple.com>
     2
     3        Reviewed by Hyatt.
     4
     5        - fix http://bugs.webkit.org/show_bug.cgi?id=13559
     6          REGRESSION: Canvas aspect ratio is incorrect
     7
     8        - remove intrinsicWidth/Height functions from RenderObject
     9
     10        Test: fast/canvas/canvas-size-change-after-layout.html
     11
     12        * html/HTMLCanvasElement.cpp:
     13        (WebCore::HTMLCanvasElement::createRenderer): Removed code to set
     14        the intrinsic size, because the renderer now takes care of this
     15        in its constructor.
     16        (WebCore::HTMLCanvasElement::reset): Instead of calling the
     17        setIntrinsicWidth/Height functions, call canvasSizeChanged, which
     18        takes care of layout, but only if the size actually changed. Also
     19        call repaint if the contents of the canvas changed.
     20
     21        * rendering/RenderApplet.h:
     22        * rendering/RenderApplet.cpp: (WebCore::RenderApplet::intrinsicSize):
     23        Override the new intrinsicSize function. This override still doesn't
     24        make sense, so left a FIXME in here.
     25
     26        * rendering/RenderBox.h: Added an intrinsicSize function here to replace
     27        the intrinsicWidth/Height functions removed from RenderObject.
     28        * rendering/RenderBox.cpp:
     29        (WebCore::RenderBox::calcReplacedWidthUsing): Use intrinsicSize instead
     30        of intrinsicWidth.
     31        (WebCore::RenderBox::calcReplacedHeightUsing): Ditto, but for height.
     32
     33        * rendering/RenderHTMLCanvas.h: Changed the constructor parameter to be
     34        an HTMLCanvasElement* instead of Node*. Also added a canvasSizeChanged
     35        function.
     36        * rendering/RenderHTMLCanvas.cpp:
     37        (WebCore::RenderHTMLCanvas::RenderHTMLCanvas): Pass an initial intrinsic
     38        size based on the current size of the canvas element. This is now the
     39        responsibility of the renderer and the DOM element calls the canvasSizeChanged
     40        function when the size changes.
     41        (WebCore::RenderHTMLCanvas::paint): Removed checks of the type of the element,
     42        and used the node() function because we don't have to worry about the anonymous
     43        case in this class.
     44        (WebCore::RenderHTMLCanvas::canvasSizeChanged): Added. Changes the size and
     45        then calls setNeedsLayout and setPrefWidthsDirty as needed. I based the logic
     46        here on careful reading of RenderImage::imageChanged.
     47
     48        * rendering/RenderImage.cpp:
     49        (WebCore::RenderImage::RenderImage): Pass a default intrinsic size of 0,0
     50        instead of calling setIntrinsicWidth/Height.
     51        (WebCore::RenderImage::setImageSizeForAltText): Call the new intrinsic size
     52        functions instead of the width/height ones. Simplifies the logic since we
     53        handle both dimensions at once.
     54        (WebCore::RenderImage::imageChanged): Ditto.
     55        (WebCore::RenderImage::layout): Ditto.
     56        (WebCore::RenderImage::calcAspectRatioWidth): Ditto.
     57        (WebCore::RenderImage::calcAspectRatioHeight): Ditto.
     58
     59        * rendering/RenderObject.h: Removed intrinsicWidth/Height virtual functions.
     60
     61        * rendering/RenderReplaced.h: Replaced intrinsicWidth, intrinsicHeight,
     62        setIntrinsicWidth, setIntrinsicHeight, m_intrinsicWidth, and m_intrinsicHeight
     63        with intrinsicSize, setIntrinsicSize, and m_intrinsicSize.
     64        * rendering/RenderReplaced.cpp:
     65        (WebCore::RenderReplaced::RenderReplaced): Added a second contructor that takes
     66        an intrinsic size parameter. Also updated constructor since the intrinsic size
     67        is now an IntSize instead of two integers.
     68        (WebCore::RenderReplaced::intrinsicSize): Added. No point in making this inline
     69        because it's a virtual function.
     70        (WebCore::RenderReplaced::setIntrinsicSize): Added. Didn't make this inline,
     71        partly because in the future we might want this to be more than just a simple
     72        setter function, factoring in common code used in both RenderImage and
     73        RenderHTMLCanvas.
     74
     75        * rendering/RenderWidget.h: Removed a stray using declaration that wasn't needed.
     76
    1772007-05-01  David Hyatt  <hyatt@apple.com>
    278
  • trunk/WebCore/html/HTMLCanvasElement.cpp

    r20170 r21211  
    9999    if (document()->frame() && document()->frame()->settings()->isJavaScriptEnabled()) {
    100100        m_rendererIsCanvas = true;
    101         RenderHTMLCanvas* r = new (arena) RenderHTMLCanvas(this);
    102         r->setIntrinsicWidth(width());
    103         r->setIntrinsicHeight(height());
    104         return r;
     101        return new (arena) RenderHTMLCanvas(this);
    105102    }
    106103
     
    148145    if (!ok)
    149146        h = defaultHeight;
     147
     148    IntSize oldSize = m_size;
    150149    m_size = IntSize(w, h);
    151150
    152     if (RenderObject* ro = renderer())
    153         if (m_rendererIsCanvas) {
    154             RenderHTMLCanvas* r = static_cast<RenderHTMLCanvas*>(ro);
    155             r->setIntrinsicWidth(w);
    156             r->setIntrinsicHeight(h);
    157             r->repaint();
    158         }
    159 
     151    bool hadDrawingContext = m_createdDrawingContext;
    160152    m_createdDrawingContext = false;
    161153    fastFree(m_data);
     
    163155    delete m_drawingContext;
    164156    m_drawingContext = 0;
     157
     158    if (RenderObject* ro = renderer())
     159        if (m_rendererIsCanvas) {
     160            if (oldSize != m_size)
     161                static_cast<RenderHTMLCanvas*>(ro)->canvasSizeChanged();
     162            if (hadDrawingContext)
     163                ro->repaint();
     164        }
    165165}
    166166
  • trunk/WebCore/rendering/RenderApplet.cpp

    r21093 r21211  
    4848}
    4949
    50 int RenderApplet::intrinsicWidth() const
     50IntSize RenderApplet::intrinsicSize() const
    5151{
    52     // FIXME: This doesn't make sense.
    53     // After some research we can probably remove this entirely and just call
    54     // setIntrinsicWidth in the constructor.
    55     return m_widget ? 50 : 150;
    56 }
    57 
    58 int RenderApplet::intrinsicHeight() const
    59 {
    60     // FIXME: This doesn't make sense.
    61     // After some research we can probably remove this entirely and just call
    62     // setIntrinsicHeight in the constructor.
    63     return m_widget ? 50 : 150;
     52    // FIXME: This doesn't make sense. We can't just start returning
     53    // a different size once we've created the widget and expect
     54    // layout and sizing to be correct. We should remove this and
     55    // pass the appropriate intrinsic size in the constructor.
     56    return m_widget ? IntSize(50, 50) : IntSize(150, 150);
    6457}
    6558
  • trunk/WebCore/rendering/RenderApplet.h

    r17448 r21211  
    11/*
    2  * This file is part of the HTML widget for KDE.
    3  *
    42 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
    5  * Copyright (C) 2006 Apple Computer, Inc.
     3 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
    64 *
    75 * This library is free software; you can redistribute it and/or
     
    4240
    4341        virtual void layout();
    44         virtual int intrinsicWidth() const;
    45         virtual int intrinsicHeight() const;
     42        virtual IntSize intrinsicSize() const;
    4643
    4744        void createWidgetIfNecessary();
  • trunk/WebCore/rendering/RenderBox.cpp

    r21183 r21211  
    14111411        // fall through
    14121412        default:
    1413             return intrinsicWidth();
     1413            return intrinsicSize().width();
    14141414     }
    14151415 }
     
    14501450        }
    14511451        default:
    1452             return intrinsicHeight();
     1452            return intrinsicSize().height();
    14531453    }
    14541454}
  • trunk/WebCore/rendering/RenderBox.h

    r21183 r21211  
    112112        return style()->htmlHacks() && style()->height().isAuto() && !isFloatingOrPositioned() && (isRoot() || isBody());
    113113    }
     114
     115    virtual IntSize intrinsicSize() const { return IntSize(); }
    114116
    115117    // Whether or not the element shrinks to its intrinsic width (rather than filling the width
  • trunk/WebCore/rendering/RenderHTMLCanvas.cpp

    r21183 r21211  
    11/*
    2  * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved.
     2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3737using namespace HTMLNames;
    3838
    39 RenderHTMLCanvas::RenderHTMLCanvas(Node* node)
    40     : RenderReplaced(node)
     39RenderHTMLCanvas::RenderHTMLCanvas(HTMLCanvasElement* element)
     40    : RenderReplaced(element, element->size())
    4141{
    4242}
     
    6969    }
    7070
    71     if (element() && element()->hasTagName(canvasTag))
    72         static_cast<HTMLCanvasElement*>(element())->paint(paintInfo.context,
    73             IntRect(x + borderLeft() + paddingLeft(), y + borderTop() + paddingTop(), contentWidth(), contentHeight()));
     71    static_cast<HTMLCanvasElement*>(node())->paint(paintInfo.context,
     72        IntRect(x + borderLeft() + paddingLeft(), y + borderTop() + paddingTop(), contentWidth(), contentHeight()));
    7473
    7574    if (drawSelectionTint)
     
    9695}
    9796
     97void RenderHTMLCanvas::canvasSizeChanged()
     98{
     99    IntSize size = static_cast<HTMLCanvasElement*>(node())->size();
     100    if (size == intrinsicSize())
     101        return;
     102
     103    setIntrinsicSize(size);
     104
     105    if (!prefWidthsDirty())
     106        setPrefWidthsDirty(true);
     107
     108    IntSize oldSize = IntSize(m_width, m_height);
     109    calcWidth();
     110    calcHeight();
     111    if (oldSize == IntSize(m_width, m_height))
     112        return;
     113
     114    if (!selfNeedsLayout())
     115        setNeedsLayout(true);
     116}
     117
    98118} // namespace WebCore
  • trunk/WebCore/rendering/RenderHTMLCanvas.h

    r17448 r21211  
    11/*
    2  * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved.
     2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3131namespace WebCore {
    3232
     33    class HTMLCanvasElement;
     34
    3335    class RenderHTMLCanvas : public RenderReplaced {
    3436    public:
    35         RenderHTMLCanvas(Node*);
     37        RenderHTMLCanvas(HTMLCanvasElement*);
    3638
    3739        virtual const char* renderName() const { return "RenderHTMLCanvas"; }
     
    3941        virtual void paint(PaintInfo&, int tx, int ty);
    4042        virtual void layout();
     43
     44        void canvasSizeChanged();
    4145    };
    4246
  • trunk/WebCore/rendering/RenderImage.cpp

    r21183 r21211  
    4747
    4848RenderImage::RenderImage(Node* node)
    49     : RenderReplaced(node)
     49    : RenderReplaced(node, IntSize(0, 0))
    5050    , m_cachedImage(0)
    5151    , m_isAnonymousImage(false)
    5252{
    53     setIntrinsicWidth(0);
    54     setIntrinsicHeight(0);
    5553    updateAltText();
    5654}
     
    110108    }
    111109 
    112     bool imageSizeChanged = false;
    113  
    114     if (imageWidth != intrinsicWidth()) {
    115         setIntrinsicWidth(imageWidth);
    116         imageSizeChanged = true;
    117     }
    118     if (imageHeight != intrinsicHeight()) {
    119         setIntrinsicHeight(imageHeight);
    120         imageSizeChanged = true;
    121     }
    122  
    123     return imageSizeChanged;
     110    IntSize imageSize = IntSize(imageWidth, imageHeight);
     111    if (imageSize == intrinsicSize())
     112        return false;
     113
     114    setIntrinsicSize(imageSize);
     115    return true;
    124116}
    125117
     
    144136
    145137    // Image dimensions have been changed, see what needs to be done
    146     if (newImage->imageSize().width() != intrinsicWidth() || newImage->imageSize().height() != intrinsicHeight() || imageSizeChanged) {
    147         if (!newImage->errorOccurred()) {
    148             setIntrinsicWidth(newImage->imageSize().width());
    149             setIntrinsicHeight(newImage->imageSize().height());
    150         }
     138    if (newImage->imageSize() != intrinsicSize() || imageSizeChanged) {
     139        if (!newImage->errorOccurred())
     140            setIntrinsicSize(newImage->imageSize());
    151141
    152142        // In the case of generated image content using :before/:after, we might not be in the
     
    314304
    315305    // minimum height
    316     m_height = m_cachedImage && m_cachedImage->errorOccurred() ? intrinsicHeight() : 0;
     306    m_height = m_cachedImage && m_cachedImage->errorOccurred() ? intrinsicSize().height() : 0;
    317307
    318308    calcWidth();
     
    417407int RenderImage::calcAspectRatioWidth() const
    418408{
    419     if (!intrinsicHeight())
     409    IntSize size = intrinsicSize();
     410    if (!size.height())
    420411        return 0;
    421412    if (!m_cachedImage || m_cachedImage->errorOccurred())
    422         return intrinsicWidth(); // Don't bother scaling.
    423     return RenderReplaced::calcReplacedHeight() * intrinsicWidth() / intrinsicHeight();
     413        return size.width(); // Don't bother scaling.
     414    return RenderReplaced::calcReplacedHeight() * size.width() / size.height();
    424415}
    425416
    426417int RenderImage::calcAspectRatioHeight() const
    427418{
    428     if (!intrinsicWidth())
     419    IntSize size = intrinsicSize();
     420    if (!size.width())
    429421        return 0;
    430422    if (!m_cachedImage || m_cachedImage->errorOccurred())
    431         return intrinsicHeight(); // Don't bother scaling.
    432     return RenderReplaced::calcReplacedWidth() * intrinsicHeight() / intrinsicWidth();
     423        return size.height(); // Don't bother scaling.
     424    return RenderReplaced::calcReplacedWidth() * size.height() / size.width();
    433425}
    434426
  • trunk/WebCore/rendering/RenderObject.h

    r21120 r21211  
    531531    int contentHeight() const { return clientHeight() - paddingTop() - paddingBottom(); }
    532532
    533     // intrinsic extend of replaced elements. undefined otherwise
    534     virtual int intrinsicWidth() const { return 0; }
    535     virtual int intrinsicHeight() const { return 0; }
    536 
    537533    // used by flexible boxes to impose a flexed width/height override
    538534    virtual int overrideSize() const { return 0; }
  • trunk/WebCore/rendering/RenderReplaced.cpp

    r21079 r21211  
    1 /**
    2  * This file is part of the HTML widget for KDE.
    3  *
     1/*
    42 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
    53 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org)
    6  * Copyright (C) 2004, 2006 Apple Computer, Inc.
     4 * Copyright (C) 2004, 2006,2 007 Apple Inc. All rights reserved.
    75 *
    86 * This library is free software; you can redistribute it and/or
     
    2220 *
    2321 */
     22
    2423#include "config.h"
    2524#include "RenderReplaced.h"
     
    3433RenderReplaced::RenderReplaced(Node* node)
    3534    : RenderBox(node)
    36     , m_intrinsicWidth(300)
    37     , m_intrinsicHeight(150)
     35    , m_intrinsicSize(300, 150)
     36    , m_selectionState(SelectionNone)
     37{
     38    setReplaced(true);
     39}
     40
     41RenderReplaced::RenderReplaced(Node* node, const IntSize& intrinsicSize)
     42    : RenderBox(node)
     43    , m_intrinsicSize(intrinsicSize)
    3844    , m_selectionState(SelectionNone)
    3945{
     
    210216}
    211217
    212 }
     218IntSize RenderReplaced::intrinsicSize() const
     219{
     220    return m_intrinsicSize;
     221}
     222
     223void RenderReplaced::setIntrinsicSize(const IntSize& size)
     224{
     225    m_intrinsicSize = size;
     226}
     227
     228}
  • trunk/WebCore/rendering/RenderReplaced.h

    r21079 r21211  
    11/*
    22 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
    3  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
     3 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc.
    44 *
    55 * This library is free software; you can redistribute it and/or
     
    3030public:
    3131    RenderReplaced(Node*);
     32    RenderReplaced(Node*, const IntSize& intrinsicSize);
    3233
    3334    virtual const char* renderName() const { return "RenderReplaced"; }
     
    4041    virtual void paint(PaintInfo&, int tx, int ty) = 0;
    4142
    42     virtual int intrinsicWidth() const { return m_intrinsicWidth; }
    43     virtual int intrinsicHeight() const { return m_intrinsicHeight; }
    44 
    45     void setIntrinsicWidth(int w) { m_intrinsicWidth = w; }
    46     void setIntrinsicHeight(int h) { m_intrinsicHeight = h; }
     43    virtual IntSize intrinsicSize() const;
    4744
    4845    virtual int caretMinOffset() const;
     
    5956
    6057protected:
     58    void setIntrinsicSize(const IntSize&);
     59
    6160    bool shouldPaint(PaintInfo&, int& tx, int& ty);
    6261
    6362private:
    64     int m_intrinsicWidth;
    65     int m_intrinsicHeight;
     63    IntSize m_intrinsicSize;
    6664   
    6765    unsigned m_selectionState : 3; // SelectionState
  • trunk/WebCore/rendering/RenderWidget.h

    r18677 r21211  
    5757    virtual void setWidget(Widget*);
    5858
    59     using RenderReplaced::element;
    60 
    6159private:
    6260    void resizeWidget(Widget*, int w, int h);
Note: See TracChangeset for help on using the changeset viewer.