15f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian/*
25f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (c) 2009, Google Inc. All rights reserved.
35f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *
45f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Redistribution and use in source and binary forms, with or without
55f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * modification, are permitted provided that the following conditions are
65f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * met:
75f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *
85f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *     * Redistributions of source code must retain the above copyright
95f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * notice, this list of conditions and the following disclaimer.
105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *     * Redistributions in binary form must reproduce the above
115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * copyright notice, this list of conditions and the following disclaimer
125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * in the documentation and/or other materials provided with the
135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * distribution.
145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *     * Neither the name of Google Inc. nor the names of its
155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * contributors may be used to endorse or promote products derived from
165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * this software without specific prior written permission.
175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *
185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian */
305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "config.h"
325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(SVG)
345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "RenderSVGModelObject.h"
355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
36ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "RenderSVGResource.h"
375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SVGStyledElement.h"
385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qiannamespace WebCore {
405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
415f1ab04193ad0130ca8204aadaceae083aca9881Feng QianRenderSVGModelObject::RenderSVGModelObject(SVGStyledElement* node)
425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    : RenderObject(node)
435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
465f1ab04193ad0130ca8204aadaceae083aca9881Feng QianIntRect RenderSVGModelObject::clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer)
475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
48ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return SVGRenderSupport::clippedOverflowRectForRepaint(this, repaintContainer);
495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderSVGModelObject::computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect& repaintRect, bool fixed)
525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
53ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    SVGRenderSupport::computeRectForRepaint(this, repaintContainer, repaintRect, fixed);
545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderSVGModelObject::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed , bool useTransforms, TransformState& transformState) const
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
58ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    SVGRenderSupport::mapLocalToContainer(this, repaintContainer, fixed, useTransforms, transformState);
595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Copied from RenderBox, this method likely requires further refactoring to work easily for both SVG and CSS Box Model content.
62ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block// FIXME: This may also need to move into SVGRenderSupport as the RenderBox version depends
635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// on borderBoundingBox() which SVG RenderBox subclases (like SVGRenderBlock) do not implement.
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockIntRect RenderSVGModelObject::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint*) const
655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    IntRect box = enclosingIntRect(repaintRectInLocalCoordinates());
675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    adjustRectForOutlineAndShadow(box);
685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    FloatQuad containerRelativeQuad = localToContainerQuad(FloatRect(box), repaintContainer);
705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return containerRelativeQuad.enclosingBoundingBox();
715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid RenderSVGModelObject::absoluteRects(Vector<IntRect>&, int, int)
745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
7506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // This code path should never be taken for SVG, as we're assuming useTransforms=true everywhere, absoluteQuads should be used.
7606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    ASSERT_NOT_REACHED();
775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderSVGModelObject::absoluteQuads(Vector<FloatQuad>& quads)
805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
8106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    quads.append(localToAbsoluteQuad(strokeBoundingBox()));
825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
84692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid RenderSVGModelObject::destroy()
85692e5dbf12901edacf14812a6fae25462920af42Steve Block{
86db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    SVGResourcesCache::clientDestroyed(this);
87692e5dbf12901edacf14812a6fae25462920af42Steve Block    RenderObject::destroy();
88692e5dbf12901edacf14812a6fae25462920af42Steve Block}
89692e5dbf12901edacf14812a6fae25462920af42Steve Block
905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid RenderSVGModelObject::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (diff == StyleDifferenceLayout)
935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        setNeedsBoundariesUpdate();
945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    RenderObject::styleWillChange(diff, newStyle);
955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
97967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid RenderSVGModelObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
98967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
99967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    RenderObject::styleDidChange(diff, oldStyle);
100db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    SVGResourcesCache::clientStyleChanged(this, diff, style());
101db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
102967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
103db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid RenderSVGModelObject::updateFromElement()
104db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
105db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    RenderObject::updateFromElement();
106db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    SVGResourcesCache::clientUpdatedFromElement(this, style());
107967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
108967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool RenderSVGModelObject::nodeAtPoint(const HitTestRequest&, HitTestResult&, int, int, int, int, HitTestAction)
1105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
1115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ASSERT_NOT_REACHED();
1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return false;
1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} // namespace WebCore
1165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif // ENABLE(SVG)
118