Home | History | Annotate | Download | only in svg
      1 /*
      2  * Copyright (C) 2006 Apple Computer, Inc.
      3  * Copyright (C) 2007 Nikolas Zimmermann <zimmermann (at) kde.org>
      4  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
      5  *
      6  * This library is free software; you can redistribute it and/or
      7  * modify it under the terms of the GNU Library General Public
      8  * License as published by the Free Software Foundation; either
      9  * version 2 of the License, or (at your option) any later version.
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Library General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU Library General Public License
     17  * along with this library; see the file COPYING.LIB.  If not, write to
     18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     19  * Boston, MA 02110-1301, USA.
     20  */
     21 
     22 #include "config.h"
     23 
     24 #if ENABLE(SVG)
     25 #include "RenderSVGBlock.h"
     26 
     27 #include "RenderSVGResource.h"
     28 #include "SVGElement.h"
     29 
     30 namespace WebCore {
     31 
     32 RenderSVGBlock::RenderSVGBlock(SVGElement* node)
     33     : RenderBlock(node)
     34 {
     35 }
     36 
     37 void RenderSVGBlock::setStyle(PassRefPtr<RenderStyle> style)
     38 {
     39     RefPtr<RenderStyle> useStyle = style;
     40 
     41     // SVG text layout code expects us to be a block-level style element.
     42     if (useStyle->isDisplayInlineType()) {
     43         RefPtr<RenderStyle> newStyle = RenderStyle::create();
     44         newStyle->inheritFrom(useStyle.get());
     45         newStyle->setDisplay(BLOCK);
     46         useStyle = newStyle.release();
     47     }
     48 
     49     RenderBlock::setStyle(useStyle.release());
     50 }
     51 
     52 void RenderSVGBlock::updateBoxModelInfoFromStyle()
     53 {
     54     RenderBlock::updateBoxModelInfoFromStyle();
     55 
     56     // RenderSVGlock, used by Render(SVGText|ForeignObject), is not allowed to call setHasOverflowClip(true).
     57     // RenderBlock assumes a layer to be present when the overflow clip functionality is requested. Both
     58     // Render(SVGText|ForeignObject) return 'false' on 'requiresLayer'. Fine for RenderSVGText.
     59     //
     60     // If we want to support overflow rules for <foreignObject> we can choose between two solutions:
     61     // a) make RenderSVGForeignObject require layers and SVG layer aware
     62     // b) reactor overflow logic out of RenderLayer (as suggested by dhyatt), which is a large task
     63     //
     64     // Until this is resolved, disable overflow support. Opera/FF don't support it as well at the moment (Feb 2010).
     65     //
     66     // Note: This does NOT affect overflow handling on outer/inner <svg> elements - this is handled
     67     // manually by RenderSVGRoot - which owns the documents enclosing root layer and thus works fine.
     68     setHasOverflowClip(false);
     69 }
     70 
     71 void RenderSVGBlock::absoluteRects(Vector<IntRect>&, int, int)
     72 {
     73     // This code path should never be taken for SVG, as we're assuming useTransforms=true everywhere, absoluteQuads should be used.
     74     ASSERT_NOT_REACHED();
     75 }
     76 
     77 void RenderSVGBlock::destroy()
     78 {
     79     SVGResourcesCache::clientDestroyed(this);
     80     RenderBlock::destroy();
     81 }
     82 
     83 void RenderSVGBlock::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
     84 {
     85     if (diff == StyleDifferenceLayout)
     86         setNeedsBoundariesUpdate();
     87     RenderBlock::styleWillChange(diff, newStyle);
     88 }
     89 
     90 void RenderSVGBlock::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
     91 {
     92     RenderBlock::styleDidChange(diff, oldStyle);
     93     SVGResourcesCache::clientStyleChanged(this, diff, style());
     94 }
     95 
     96 void RenderSVGBlock::updateFromElement()
     97 {
     98     RenderBlock::updateFromElement();
     99     SVGResourcesCache::clientUpdatedFromElement(this, style());
    100 }
    101 
    102 }
    103 
    104 #endif
    105