Changeset 76836 in webkit


Ignore:
Timestamp:
Jan 27, 2011 2:02:02 PM (13 years ago)
Author:
rniwa@webkit.org
Message:

2011-01-27 Sheriff Bot <webkit.review.bot@gmail.com>

Unreviewed, rolling out r76825.
http://trac.webkit.org/changeset/76825
https://bugs.webkit.org/show_bug.cgi?id=53256

"caused crashes on GTK and chromium" (Requested by rniwa on
#webkit).

  • rendering/RenderBoxModelObject.cpp: (WebCore::ImageQualityController::keyDestroyed): (WebCore::ImageQualityController::objectDestroyed): (WebCore::ImageQualityController::highQualityRepaintTimerFired): (WebCore::ImageQualityController::shouldPaintAtLowQuality): (WebCore::imageQualityController): (WebCore::RenderBoxModelObject::~RenderBoxModelObject):
Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r76835 r76836  
     12011-01-27  Sheriff Bot  <webkit.review.bot@gmail.com>
     2
     3        Unreviewed, rolling out r76825.
     4        http://trac.webkit.org/changeset/76825
     5        https://bugs.webkit.org/show_bug.cgi?id=53256
     6
     7        "caused crashes on GTK and chromium" (Requested by rniwa on
     8        #webkit).
     9
     10        * rendering/RenderBoxModelObject.cpp:
     11        (WebCore::ImageQualityController::keyDestroyed):
     12        (WebCore::ImageQualityController::objectDestroyed):
     13        (WebCore::ImageQualityController::highQualityRepaintTimerFired):
     14        (WebCore::ImageQualityController::shouldPaintAtLowQuality):
     15        (WebCore::imageQualityController):
     16        (WebCore::RenderBoxModelObject::~RenderBoxModelObject):
     17
    1182011-01-27  Adam Barth  <abarth@webkit.org>
    219
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r76825 r76836  
    5151static const double cLowQualityTimeThreshold = 0.500; // 500 ms
    5252
    53 typedef HashMap<const void*, IntSize> LayerSizeMap;
    54 typedef HashMap<RenderBoxModelObject*, LayerSizeMap> ObjectLayerSizeMap;
     53typedef pair<RenderBoxModelObject*, const void*> LastPaintSizeMapKey;
     54typedef HashMap<LastPaintSizeMapKey, IntSize> LastPaintSizeMap;
    5555
    5656// The HashMap for storing continuation pointers.
     
    6969    ImageQualityController();
    7070    bool shouldPaintAtLowQuality(GraphicsContext*, RenderBoxModelObject*, Image*, const void* layer, const IntSize&);
    71     void removeLayer(RenderBoxModelObject*, LayerSizeMap* innerMap, const void* layer);
    72     void set(RenderBoxModelObject*, LayerSizeMap* innerMap, const void* layer, const IntSize&);
     71    void keyDestroyed(LastPaintSizeMapKey key);
    7372    void objectDestroyed(RenderBoxModelObject*);
    74     bool isEmpty() { return m_objectLayerSizeMap.isEmpty(); }
    7573
    7674private:
     
    7876    void restartTimer();
    7977
    80     ObjectLayerSizeMap m_objectLayerSizeMap;
     78    LastPaintSizeMap m_lastPaintSizeMap;
    8179    Timer<ImageQualityController> m_timer;
    8280    bool m_animatedResizeIsActive;
     
    8987}
    9088
    91 void ImageQualityController::removeLayer(RenderBoxModelObject* object, LayerSizeMap* innerMap, const void* layer)
    92 {
    93     if (innerMap) {
    94         innerMap->remove(layer);
    95         if (innerMap->isEmpty())
    96             objectDestroyed(object);
    97     }
    98 }
    99    
    100 void ImageQualityController::set(RenderBoxModelObject* object, LayerSizeMap* innerMap, const void* layer, const IntSize& size)
    101 {
    102     if (innerMap)
    103         innerMap->set(layer, size);
    104     else {
    105         LayerSizeMap newInnerMap;
    106         newInnerMap.set(layer, size);
    107         m_objectLayerSizeMap.set(object, newInnerMap);
     89void ImageQualityController::keyDestroyed(LastPaintSizeMapKey key)
     90{
     91    m_lastPaintSizeMap.remove(key);
     92    if (m_lastPaintSizeMap.isEmpty()) {
     93        m_animatedResizeIsActive = false;
     94        m_timer.stop();
    10895    }
    10996}
     
    11198void ImageQualityController::objectDestroyed(RenderBoxModelObject* object)
    11299{
    113     m_objectLayerSizeMap.remove(object);
    114     if (m_objectLayerSizeMap.isEmpty()) {
    115         m_animatedResizeIsActive = false;
    116         m_timer.stop();
    117     }
    118 }
    119 
     100    Vector<LastPaintSizeMapKey> keysToDie;
     101    for (LastPaintSizeMap::iterator it = m_lastPaintSizeMap.begin(); it != m_lastPaintSizeMap.end(); ++it)
     102        if (it->first.first == object)
     103            keysToDie.append(it->first);
     104    for (Vector<LastPaintSizeMapKey>::iterator it = keysToDie.begin(); it != keysToDie.end(); ++it)
     105        keyDestroyed(*it);
     106}
     107   
    120108void ImageQualityController::highQualityRepaintTimerFired(Timer<ImageQualityController>*)
    121109{
    122110    if (m_animatedResizeIsActive) {
    123111        m_animatedResizeIsActive = false;
    124         for (ObjectLayerSizeMap::iterator it = m_objectLayerSizeMap.begin(); it != m_objectLayerSizeMap.end(); ++it)
    125             it->first->repaint();
     112        for (LastPaintSizeMap::iterator it = m_lastPaintSizeMap.begin(); it != m_lastPaintSizeMap.end(); ++it)
     113            it->first.first->repaint();
    126114    }
    127115}
     
    143131    IntSize imageSize(image->width(), image->height());
    144132
    145     // Look ourselves up in the hashtables.
    146     ObjectLayerSizeMap::iterator i = m_objectLayerSizeMap.find(object);
    147     LayerSizeMap* innerMap = i != m_objectLayerSizeMap.end() ? &i->second : 0;
    148     IntSize oldSize;
    149     bool isFirstResize = true;
    150     if (innerMap) {
    151         LayerSizeMap::iterator j = innerMap->find(layer);
    152         if (j != innerMap->end()) {
    153             isFirstResize = false;
    154             oldSize = j->second;
    155         }
    156     }
     133    // Look ourselves up in the hashtable.
     134    LastPaintSizeMapKey key(object, layer);
     135    LastPaintSizeMap::iterator i = m_lastPaintSizeMap.find(key);
    157136
    158137    const AffineTransform& currentTransform = context->getCTM();
     
    160139    if (!contextIsScaled && imageSize == size) {
    161140        // There is no scale in effect. If we had a scale in effect before, we can just remove this object from the list.
    162         removeLayer(object, innerMap, layer);
     141        if (i != m_lastPaintSizeMap.end())
     142            m_lastPaintSizeMap.remove(key);
     143
    163144        return false;
    164145    }
     
    170151            return true;
    171152    }
    172 
    173153    // If an animated resize is active, paint in low quality and kick the timer ahead.
    174154    if (m_animatedResizeIsActive) {
    175         set(object, innerMap, layer, size);
     155        m_lastPaintSizeMap.set(key, size);
    176156        restartTimer();
    177157        return true;
     
    180160    // same as the last resize, draw at high res, but record the paint
    181161    // size and set the timer.
    182     if (isFirstResize || oldSize == size) {
     162    if (i == m_lastPaintSizeMap.end() || size == i->second) {
    183163        restartTimer();
    184         set(object, innerMap, layer, size);
     164        m_lastPaintSizeMap.set(key, size);
    185165        return false;
    186166    }
     
    188168    // set the timer.
    189169    if (!m_timer.isActive()) {
    190         removeLayer(object, innerMap, layer);
     170        keyDestroyed(key);
    191171        return false;
    192172    }
     
    194174    // is active, so draw at low quality, set the flag for animated resizes and
    195175    // the object to the list for high quality redraw.
    196     set(object, innerMap, layer, size);
     176    m_lastPaintSizeMap.set(key, size);
    197177    m_animatedResizeIsActive = true;
    198178    restartTimer();
     
    200180}
    201181
    202 static ImageQualityController* gImageQualityController = 0;
    203 
    204182static ImageQualityController* imageQualityController()
    205183{
    206     if (!gImageQualityController)
    207         gImageQualityController = new ImageQualityController;
    208 
    209     return gImageQualityController;
     184    static ImageQualityController* controller = new ImageQualityController;
     185    return controller;
    210186}
    211187
     
    248224    ASSERT(!hasLayer());
    249225    ASSERT(!m_layer);
    250     if (gImageQualityController) {
    251         gImageQualityController->objectDestroyed(this);
    252         if (gImageQualityController->isEmpty()) {
    253             delete gImageQualityController;
    254             gImageQualityController = 0;
    255         }
    256     }
     226    imageQualityController()->objectDestroyed(this);
    257227}
    258228
Note: See TracChangeset for help on using the changeset viewer.