18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc.
3692e5dbf12901edacf14812a6fae25462920af42Steve Block * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
4692e5dbf12901edacf14812a6fae25462920af42Steve Block * Copyright (C) Research In Motion Limited 2010. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSVGBlock.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "RenderSVGResource.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGElement.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderSVGBlock::RenderSVGBlock(SVGElement* node)
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : RenderBlock(node)
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderSVGBlock::setStyle(PassRefPtr<RenderStyle> style)
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<RenderStyle> useStyle = style;
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // SVG text layout code expects us to be a block-level style element.
42692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (useStyle->isDisplayInlineType()) {
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<RenderStyle> newStyle = RenderStyle::create();
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newStyle->inheritFrom(useStyle.get());
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newStyle->setDisplay(BLOCK);
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        useStyle = newStyle.release();
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderBlock::setStyle(useStyle.release());
50692e5dbf12901edacf14812a6fae25462920af42Steve Block}
51692e5dbf12901edacf14812a6fae25462920af42Steve Block
52692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid RenderSVGBlock::updateBoxModelInfoFromStyle()
53692e5dbf12901edacf14812a6fae25462920af42Steve Block{
54692e5dbf12901edacf14812a6fae25462920af42Steve Block    RenderBlock::updateBoxModelInfoFromStyle();
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56692e5dbf12901edacf14812a6fae25462920af42Steve Block    // RenderSVGlock, used by Render(SVGText|ForeignObject), is not allowed to call setHasOverflowClip(true).
57692e5dbf12901edacf14812a6fae25462920af42Steve Block    // RenderBlock assumes a layer to be present when the overflow clip functionality is requested. Both
58692e5dbf12901edacf14812a6fae25462920af42Steve Block    // Render(SVGText|ForeignObject) return 'false' on 'requiresLayer'. Fine for RenderSVGText.
59692e5dbf12901edacf14812a6fae25462920af42Steve Block    //
60692e5dbf12901edacf14812a6fae25462920af42Steve Block    // If we want to support overflow rules for <foreignObject> we can choose between two solutions:
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // a) make RenderSVGForeignObject require layers and SVG layer aware
62692e5dbf12901edacf14812a6fae25462920af42Steve Block    // b) reactor overflow logic out of RenderLayer (as suggested by dhyatt), which is a large task
63692e5dbf12901edacf14812a6fae25462920af42Steve Block    //
64692e5dbf12901edacf14812a6fae25462920af42Steve Block    // Until this is resolved, disable overflow support. Opera/FF don't support it as well at the moment (Feb 2010).
65692e5dbf12901edacf14812a6fae25462920af42Steve Block    //
66692e5dbf12901edacf14812a6fae25462920af42Steve Block    // Note: This does NOT affect overflow handling on outer/inner <svg> elements - this is handled
67692e5dbf12901edacf14812a6fae25462920af42Steve Block    // manually by RenderSVGRoot - which owns the documents enclosing root layer and thus works fine.
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setHasOverflowClip(false);
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid RenderSVGBlock::absoluteRects(Vector<IntRect>&, int, int)
7206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
7306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // This code path should never be taken for SVG, as we're assuming useTransforms=true everywhere, absoluteQuads should be used.
7406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    ASSERT_NOT_REACHED();
7506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
76db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
77db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid RenderSVGBlock::destroy()
78db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
79db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    SVGResourcesCache::clientDestroyed(this);
80db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    RenderBlock::destroy();
81db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
82db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid RenderSVGBlock::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (diff == StyleDifferenceLayout)
865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        setNeedsBoundariesUpdate();
875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    RenderBlock::styleWillChange(diff, newStyle);
885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
90db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid RenderSVGBlock::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
91db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
92db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    RenderBlock::styleDidChange(diff, oldStyle);
93db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    SVGResourcesCache::clientStyleChanged(this, diff, style());
94db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
95db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
96db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid RenderSVGBlock::updateFromElement()
97db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
98db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    RenderBlock::updateFromElement();
99db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    SVGResourcesCache::clientUpdatedFromElement(this, style());
100db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
101db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
104692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
105