18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                  2004, 2005 Rob Buis <buis@kde.org>
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                  2005 Eric Seidel <eric@webkit.org>
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                  2006 Apple Computer, Inc
65f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                  2009 Google, Inc.
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    This library is free software; you can redistribute it and/or
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    modify it under the terms of the GNU Library General Public
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    License as published by the Free Software Foundation; either
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    version 2 of the License, or (at your option) any later version.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    This library is distributed in the hope that it will be useful,
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    but WITHOUT ANY WARRANTY; without even the implied warranty of
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Library General Public License for more details.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    You should have received a copy of the GNU Library General Public License
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    aint with this library; see the file COPYING.LIB.  If not, write to
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Boston, MA 02110-1301, USA.
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef RenderPath_h
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define RenderPath_h
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include "AffineTransform.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h"
305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "RenderSVGModelObject.h"
31d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "SVGMarkerLayoutInfo.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass FloatPoint;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderSVGContainer;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass SVGStyledTransformableElement;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianclass RenderPath : public RenderSVGModelObject {
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RenderPath(SVGStyledTransformableElement*);
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43d0825bca7fe65beaee391d30da42e937db621564Steve Block    const Path& path() const { return m_path; }
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate:
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Hit-detection seperated for the fill and the stroke
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool fillContains(const FloatPoint&, bool requiresFill = true) const;
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool strokeContains(const FloatPoint&, bool requiresStroke = true) const;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual FloatRect objectBoundingBox() const;
51d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual FloatRect strokeBoundingBox() const;
52d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual FloatRect markerBoundingBox() const;
535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual FloatRect repaintRectInLocalCoordinates() const;
545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    virtual const AffineTransform& localToParentTransform() const;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    void setPath(const Path&);
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isRenderPath() const { return true; }
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual const char* renderName() const { return "RenderPath"; }
615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void layout();
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void paint(PaintInfo&, int parentX, int parentY);
64d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint& pointInParent, HitTestAction);
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68d0825bca7fe65beaee391d30da42e937db621564Steve Block    void calculateMarkerBoundsIfNeeded() const;
695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    virtual AffineTransform localTransform() const;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mutable Path m_path;
745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    mutable FloatRect m_cachedLocalFillBBox;
75d0825bca7fe65beaee391d30da42e937db621564Steve Block    mutable FloatRect m_cachedLocalStrokeBBox;
765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    mutable FloatRect m_cachedLocalRepaintRect;
77d0825bca7fe65beaee391d30da42e937db621564Steve Block    mutable FloatRect m_cachedLocalMarkerBBox;
78d0825bca7fe65beaee391d30da42e937db621564Steve Block    mutable SVGMarkerLayoutInfo m_markerLayoutInfo;
798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    AffineTransform m_localTransform;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochinline RenderPath* toRenderPath(RenderObject* object)
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!object || object->isRenderPath());
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<RenderPath*>(object);
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochinline const RenderPath* toRenderPath(const RenderObject* object)
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!object || object->isRenderPath());
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<const RenderPath*>(object);
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This will catch anyone doing an unnecessary cast.
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid toRenderPath(const RenderPath*);
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG)
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
101