1/*
2 * Copyright (C) 2006 Apple Computer, Inc.
3 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@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
30namespace WebCore {
31
32RenderSVGBlock::RenderSVGBlock(SVGElement* node)
33    : RenderBlock(node)
34{
35}
36
37void 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
52void 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
71void 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
77void RenderSVGBlock::destroy()
78{
79    SVGResourcesCache::clientDestroyed(this);
80    RenderBlock::destroy();
81}
82
83void RenderSVGBlock::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
84{
85    if (diff == StyleDifferenceLayout)
86        setNeedsBoundariesUpdate();
87    RenderBlock::styleWillChange(diff, newStyle);
88}
89
90void RenderSVGBlock::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
91{
92    RenderBlock::styleDidChange(diff, oldStyle);
93    SVGResourcesCache::clientStyleChanged(this, diff, style());
94}
95
96void RenderSVGBlock::updateFromElement()
97{
98    RenderBlock::updateFromElement();
99    SVGResourcesCache::clientUpdatedFromElement(this, style());
100}
101
102}
103
104#endif
105