18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2000 Antti Koivisto (koivisto@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2000 Dirk Mueller (mueller@kde.org)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef RenderObject_h
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define RenderObject_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClient.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Element.h"
325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "FloatQuad.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PaintPhase.h"
348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderObjectChildList.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderStyle.h"
368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TextAffinity.h"
378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TransformationMatrix.h"
388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <wtf/UnusedParam.h>
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG) || USE(CAIRO) || PLATFORM(QT)
41ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#define HAVE_PATH_BASED_BORDER_RADIUS_DRAWING 1
42ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
43ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass AffineTransform;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass AnimationController;
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HitTestResult;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass InlineBox;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass InlineFlowBox;
515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianclass OverlapTestRequestClient;
52ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass Path;
538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass Position;
548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass RenderBoxModelObject;
558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass RenderInline;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderBlock;
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderFlow;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderLayer;
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass RenderTheme;
608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass TransformState;
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass VisiblePosition;
62d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(SVG)
6321939df44de1705786c545cd1bf519d47250322dBen Murdochclass RenderSVGResourceContainer;
64d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstruct PaintInfo;
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum HitTestFilter {
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HitTestAll,
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HitTestSelf,
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HitTestDescendants
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum HitTestAction {
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HitTestBlockBackground,
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HitTestChildBlockBackground,
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HitTestChildBlockBackgrounds,
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HitTestFloat,
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HitTestForeground
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// Sides used when drawing borders and outlines. The values should run clockwise from top.
838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianenum BoxSide {
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    BSTop,
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BSRight,
868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    BSBottom,
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BSLeft
888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian};
898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianconst int caretWidth = 1;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct DashboardRegionValue {
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool operator==(const DashboardRegionValue& o) const
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return type == o.type && bounds == o.bounds && clip == o.clip && label == o.label;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool operator!=(const DashboardRegionValue& o) const
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return !(*this == o);
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String label;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect bounds;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect clip;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int type;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Base class for all rendering tree objects.
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderObject : public CachedResourceClient {
1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    friend class RenderBlock;
1138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    friend class RenderBox;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    friend class RenderLayer;
1158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    friend class RenderObjectChildList;
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    friend class RenderSVGContainer;
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Anonymous objects should pass the document as their node, and they will then automatically be
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // marked as anonymous in the constructor.
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject(Node*);
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ~RenderObject();
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RenderTheme* theme() const;
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual const char* renderName() const = 0;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* parent() const { return m_parent; }
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isDescendantOf(const RenderObject*) const;
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* previousSibling() const { return m_previous; }
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextSibling() const { return m_next; }
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderObject* firstChild() const
1348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    {
1358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (const RenderObjectChildList* children = virtualChildren())
1368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return children->firstChild();
1378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return 0;
1388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
1398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderObject* lastChild() const
1408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    {
1418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (const RenderObjectChildList* children = virtualChildren())
1428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return children->lastChild();
1438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return 0;
1448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
1452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RenderObject* beforePseudoElementRenderer() const
1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (const RenderObjectChildList* children = virtualChildren())
1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return children->beforePseudoElementRenderer(this);
1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 0;
1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RenderObject* afterPseudoElementRenderer() const
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (const RenderObjectChildList* children = virtualChildren())
1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return children->afterPseudoElementRenderer(this);
1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 0;
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual RenderObjectChildList* virtualChildren() { return 0; }
1588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual const RenderObjectChildList* virtualChildren() const { return 0; }
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextInPreOrder() const;
1619a26d18f4c7e98b479be700575d003f873214550John Reck    RenderObject* nextInPreOrder(const RenderObject* stayWithin) const;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextInPreOrderAfterChildren() const;
1639a26d18f4c7e98b479be700575d003f873214550John Reck    RenderObject* nextInPreOrderAfterChildren(const RenderObject* stayWithin) const;
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* previousInPreOrder() const;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* childAt(unsigned) const;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* firstLeafChild() const;
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* lastLeafChild() const;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // The following six functions are used when the render tree hierarchy changes to make sure layers get
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // properly added and removed.  Since containership can be implemented by any subclass, and since a hierarchy
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // can contain a mixture of boxes and other object types, these functions need to be in the base class.
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderLayer* enclosingLayer() const;
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addLayers(RenderLayer* parentLayer, RenderObject* newObject);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void removeLayers(RenderLayer* parentLayer);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void moveLayers(RenderLayer* oldParent, RenderLayer* newParent);
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderLayer* findNextLayer(RenderLayer* parentLayer, RenderObject* startPoint, bool checkParent = true);
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Convenience function for getting to the nearest enclosing box of a RenderObject.
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RenderBox* enclosingBox() const;
181e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RenderBoxModelObject* enclosingBoxModelObject() const;
182e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isEmpty() const { return firstChild() == 0; }
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasAXObject(bool flag) { m_hasAXObject = flag; }
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasAXObject() const { return m_hasAXObject; }
188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool isSetNeedsLayoutForbidden() const { return m_setNeedsLayoutForbidden; }
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setNeedsLayoutIsForbidden(bool flag) { m_setNeedsLayoutForbidden = flag; }
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Obtains the nearest enclosing block (including this block) that contributes a first-line style to our inline
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // children.
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual RenderBlock* firstLineBlock() const;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Called when an object that was floating or positioned becomes a normal flow object
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // again.  We have to make sure the render tree updates as needed to accommodate the new
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // normal flow object.
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void handleDynamicFloatPositionChange();
2008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RenderObject tree manipulation
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////////////////////////////
2038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual bool canHaveChildren() const { return virtualChildren(); }
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isChildAllowed(RenderObject*, RenderStyle*) const { return true; }
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0);
2068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void addChildIgnoringContinuation(RenderObject* newChild, RenderObject* beforeChild = 0) { return addChild(newChild, beforeChild); }
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void removeChild(RenderObject*);
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool createsAnonymousWrapper() const { return false; }
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////////////////////////////
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected:
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////////////////////////////
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Helper functions. Dangerous to use!
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setPreviousSibling(RenderObject* previous) { m_previous = previous; }
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNextSibling(RenderObject* next) { m_next = next; }
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setParent(RenderObject* parent) { m_parent = parent; }
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////////////////////////////
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addAbsoluteRectForLayer(IntRect& result);
2208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setLayerNeedsFullRepaint();
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void showTreeForThis() const;
225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void showRenderObject() const;
227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We don't make printedCharacters an optional parameter so that
228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // showRenderObject can be called from gdb easily.
229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void showRenderObject(int printedCharacters) const;
230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void showRenderTreeAndMark(const RenderObject* markedObject1 = 0, const char* markedLabel1 = 0, const RenderObject* markedObject2 = 0, const char* markedLabel2 = 0, int depth = 0) const;
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static RenderObject* createObject(Node*, RenderStyle*);
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overloaded new operator.  Derived classes must override operator new
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // in order to allocate out of the RenderArena.
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void* operator new(size_t, RenderArena*) throw();
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overridden to prevent the normal delete from being called.
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void operator delete(void*, size_t);
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The normal operator new is disallowed on all render objects.
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void* operator new(size_t) throw();
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderArena* renderArena() const { return document()->renderArena(); }
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isApplet() const { return false; }
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isBR() const { return false; }
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isBlockFlow() const { return false; }
2528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual bool isBoxModelObject() const { return false; }
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isCounter() const { return false; }
25481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual bool isQuote() const { return false; }
255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool isDetails() const { return false; }
256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool isDetailsMarker() const { return false; }
257d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual bool isEmbeddedObject() const { return false; }
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isFieldset() const { return false; }
259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    virtual bool isFileUploadControl() const { return false; }
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isFrame() const { return false; }
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isFrameSet() const { return false; }
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isImage() const { return false; }
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isInlineBlockOrInlineTable() const { return false; }
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isListBox() const { return false; }
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isListItem() const { return false; }
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isListMarker() const { return false; }
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isMedia() const { return false; }
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isMenuList() const { return false; }
2696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if ENABLE(METER_TAG)
2706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    virtual bool isMeter() const { return false; }
2716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(PROGRESS_TAG)
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual bool isProgress() const { return false; }
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isRenderBlock() const { return false; }
2768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual bool isRenderButton() const { return false; }
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual bool isRenderIFrame() const { return false; }
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isRenderImage() const { return false; }
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isRenderInline() const { return false; }
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isRenderPart() const { return false; }
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isRenderView() const { return false; }
282d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual bool isReplica() const { return false; }
2836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    virtual bool isRuby() const { return false; }
285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    virtual bool isRubyBase() const { return false; }
286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    virtual bool isRubyRun() const { return false; }
287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    virtual bool isRubyText() const { return false; }
2886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isSlider() const { return false; }
290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool isSummary() const { return false; }
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isTable() const { return false; }
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isTableCell() const { return false; }
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isTableCol() const { return false; }
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isTableRow() const { return false; }
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isTableSection() const { return false; }
2968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual bool isTextControl() const { return false; }
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isTextArea() const { return false; }
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isTextField() const { return false; }
2990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual bool isVideo() const { return false; }
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isWidget() const { return false; }
301231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    virtual bool isCanvas() const { return false; }
302cad810f21b803229eb11403f9209855525a25d57Steve Block#if ENABLE(FULLSCREEN_API)
303cad810f21b803229eb11403f9209855525a25d57Steve Block    virtual bool isRenderFullScreen() const { return false; }
304cad810f21b803229eb11403f9209855525a25d57Steve Block#endif
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool isRoot() const { return document()->documentElement() == m_node; }
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isBody() const;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isHR() const;
3096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    bool isLegend() const;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isHTMLMarquee() const;
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
313a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    inline bool isBeforeContent() const;
314231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    inline bool isAfterContent() const;
315c58b6b265aa9aca56296a4c1199521fe4ab3cb70Steve Block    inline bool isBeforeOrAfterContent() const;
316a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    static inline bool isBeforeContent(const RenderObject* obj) { return obj && obj->isBeforeContent(); }
317231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static inline bool isAfterContent(const RenderObject* obj) { return obj && obj->isAfterContent(); }
31805c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease    static inline bool isBeforeOrAfterContent(const RenderObject* obj) { return obj && obj->isBeforeOrAfterContent(); }
319231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool childrenInline() const { return m_childrenInline; }
3218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setChildrenInline(bool b = true) { m_childrenInline = b; }
3228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasColumns() const { return m_hasColumns; }
3238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setHasColumns(bool b = true) { m_hasColumns = b; }
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
325e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    virtual bool requiresForcedStyleRecalcPropagation() const { return false; }
326e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
327d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(MATHML)
328d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual bool isRenderMathMLBlock() const { return false; }
329d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif // ENABLE(MATHML)
330d0825bca7fe65beaee391d30da42e937db621564Steve Block
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
3325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // FIXME: Until all SVG renders can be subclasses of RenderSVGModelObject we have
3335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // to add SVG renderer methods to RenderObject with an ASSERT_NOT_REACHED() default implementation.
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isSVGRoot() const { return false; }
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isSVGContainer() const { return false; }
3366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual bool isSVGViewportContainer() const { return false; }
33721939df44de1705786c545cd1bf519d47250322dBen Murdoch    virtual bool isSVGGradientStop() const { return false; }
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isSVGHiddenContainer() const { return false; }
339a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    virtual bool isSVGPath() const { return false; }
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isSVGText() const { return false; }
341a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    virtual bool isSVGTextPath() const { return false; }
34268513a70bcd92384395513322f1b801e7bf9c729Steve Block    virtual bool isSVGInline() const { return false; }
34306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    virtual bool isSVGInlineText() const { return false; }
3445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool isSVGImage() const { return false; }
345231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    virtual bool isSVGForeignObject() const { return false; }
34621939df44de1705786c545cd1bf519d47250322dBen Murdoch    virtual bool isSVGResourceContainer() const { return false; }
3472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual bool isSVGResourceFilter() const { return false; }
3485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    virtual bool isSVGResourceFilterPrimitive() const { return false; }
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual bool isSVGShadowTreeRootContainer() const { return false; }
3505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
35121939df44de1705786c545cd1bf519d47250322dBen Murdoch    virtual RenderSVGResourceContainer* toRenderSVGResourceContainer();
352d0825bca7fe65beaee391d30da42e937db621564Steve Block
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: Those belong into a SVG specific base-class for all renderers (see above)
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Unfortunately we don't have such a class yet, because it's not possible for all renderers
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // to inherit from RenderSVGObject -> RenderObject (some need RenderBlock inheritance for instance)
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void setNeedsTransformUpdate() { }
3575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    virtual void setNeedsBoundariesUpdate();
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Per SVG 1.1 objectBoundingBox ignores clipping, masking, filter effects, opacity and stroke-width.
3605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // This is used for all computation of objectBoundingBox relative units and by SVGLocateable::getBBox().
3615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // NOTE: Markers are not specifically ignored here by SVG 1.1 spec, but we ignore them
3625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // since stroke-width is ignored (and marker size can depend on stroke-width).
3635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // objectBoundingBox is returned local coordinates.
3645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // The name objectBoundingBox is taken from the SVG 1.1 spec.
3655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual FloatRect objectBoundingBox() const;
36621939df44de1705786c545cd1bf519d47250322dBen Murdoch    virtual FloatRect strokeBoundingBox() const;
3675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Returns the smallest rectangle enclosing all of the painted content
3695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // respecting clipping, masking, filters, opacity, stroke-width and markers
3705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual FloatRect repaintRectInLocalCoordinates() const;
3715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // This only returns the transform="" value from the element
3735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // most callsites want localToParentTransform() instead.
3748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    virtual AffineTransform localTransform() const;
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Returns the full transform mapping from local coordinates to local coords for the parent SVG renderer
3775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // This includes any viewport transforms and x/y offsets as well as the transform="" value off the element.
3788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    virtual const AffineTransform& localToParentTransform() const;
3795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // SVG uses FloatPoint precise hit testing, and passes the point in parent
3815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // coordinates instead of in repaint container coordinates.  Eventually the
3825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // rest of the rendering tree will move to a similar model.
3835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint& pointInParent, HitTestAction);
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isAnonymous() const { return m_isAnonymous; }
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setIsAnonymous(bool b) { m_isAnonymous = b; }
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isAnonymousBlock() const
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
3902bde8e466a4451c7319e3a072d118917957d6554Steve Block        // This function is kept in sync with anonymous block creation conditions in
3912bde8e466a4451c7319e3a072d118917957d6554Steve Block        // RenderBlock::createAnonymousBlock(). This includes creating an anonymous
3922bde8e466a4451c7319e3a072d118917957d6554Steve Block        // RenderBlock having a BLOCK or BOX display. Other classes such as RenderTextFragment
3932bde8e466a4451c7319e3a072d118917957d6554Steve Block        // are not RenderBlocks and will return false. See https://bugs.webkit.org/show_bug.cgi?id=56709.
3942bde8e466a4451c7319e3a072d118917957d6554Steve Block        return m_isAnonymous && (style()->display() == BLOCK || style()->display() == BOX) && style()->styleType() == NOPSEUDO && isRenderBlock() && !isListMarker();
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool isAnonymousColumnsBlock() const { return style()->specifiesColumns() && isAnonymousBlock(); }
3975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool isAnonymousColumnSpanBlock() const { return style()->columnSpan() && isAnonymousBlock(); }
398e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool isElementContinuation() const { return node() && node()->renderer() != this; }
399e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool isInlineElementContinuation() const { return isElementContinuation() && isInline(); }
400e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool isBlockElementContinuation() const { return isElementContinuation() && !isInline(); }
401e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    virtual RenderBoxModelObject* virtualContinuation() const { return 0; }
402e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isFloating() const { return m_floating; }
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isPositioned() const { return m_positioned; } // absolute or fixed positioning
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isRelPositioned() const { return m_relPositioned; } // relative positioning
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isText() const  { return m_isText; }
407635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool isBox() const { return m_isBox; }
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInline() const { return m_inline; }  // inline object
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isRunIn() const { return style()->display() == RUN_IN; } // run-in object
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isDragging() const { return m_isDragging; }
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isReplaced() const { return m_replaced; } // a "replaced" element (see CSS)
4122bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool isHorizontalWritingMode() const { return m_horizontalWritingMode; }
4132bde8e466a4451c7319e3a072d118917957d6554Steve Block
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasLayer() const { return m_hasLayer; }
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasBoxDecorations() const { return m_paintBackground; }
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool mustRepaintBackgroundOrBorder() const;
4185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool hasBackground() const { return style()->hasBackground(); }
4192bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool needsLayout() const { return m_needsLayout || m_normalChildNeedsLayout || m_posChildNeedsLayout || m_needsSimplifiedNormalFlowLayout || m_needsPositionedMovementLayout; }
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool selfNeedsLayout() const { return m_needsLayout; }
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool needsPositionedMovementLayout() const { return m_needsPositionedMovementLayout; }
4222bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool needsPositionedMovementLayoutOnly() const { return m_needsPositionedMovementLayout && !m_needsLayout && !m_normalChildNeedsLayout && !m_posChildNeedsLayout && !m_needsSimplifiedNormalFlowLayout; }
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool posChildNeedsLayout() const { return m_posChildNeedsLayout; }
4242bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool needsSimplifiedNormalFlowLayout() const { return m_needsSimplifiedNormalFlowLayout; }
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool normalChildNeedsLayout() const { return m_normalChildNeedsLayout; }
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
427bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool preferredLogicalWidthsDirty() const { return m_preferredLogicalWidthsDirty; }
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isSelectionBorder() const;
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasClip() const { return isPositioned() && style()->hasClip(); }
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasOverflowClip() const { return m_hasOverflowClip; }
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasTransform() const { return m_hasTransform; }
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasMask() const { return style() && style()->hasMask(); }
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    inline bool preservesNewline() const;
4382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !HAVE(PATH_BASED_BORDER_RADIUS_DRAWING)
440ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // FIXME: This function should be removed when all ports implement GraphicsContext::clipConvexPolygon()!!
441ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // At that time, everyone can use RenderObject::drawBoxSideFromPath() instead. This should happen soon.
4422bde8e466a4451c7319e3a072d118917957d6554Steve Block    void drawArcForBoxSide(GraphicsContext*, int x, int y, float thickness, const IntSize& radius, int angleStart,
443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                           int angleSpan, BoxSide, Color, EBorderStyle, bool firstCorner);
444ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
445ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
446ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    IntRect borderInnerRect(const IntRect&, unsigned short topWidth, unsigned short bottomWidth,
447ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                            unsigned short leftWidth, unsigned short rightWidth) const;
4488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The pseudo element style can be cached or uncached.  Use the cached method if the pseudo element doesn't respect
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // any pseudo classes (and therefore has no concept of changing state).
4518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderStyle* getCachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0) const;
4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PassRefPtr<RenderStyle> getUncachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0, RenderStyle* ownStyle = 0) const;
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void updateDragState(bool dragOn);
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderView* view() const;
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Returns true if this renderer is rooted, and optionally returns the hosting view (the root of the hierarchy).
4598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool isRooted(RenderView** = 0);
4608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
4618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    Node* node() const { return m_isAnonymous ? 0 : m_node; }
4622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Returns the styled node that caused the generation of this renderer.
4642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // This is the same as node() except for renderers of :before and :after
4652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // pseudo elements for which their parent node is returned.
4662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Node* generatingNode() const { return m_node == document() ? 0 : m_node; }
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNode(Node* node) { m_node = node; }
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
469545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Document* document() const { return m_node->document(); }
470545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Frame* frame() const { return document()->frame(); }
471545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasOutlineAnnotation() const;
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasOutline() const { return style()->hasOutline() || hasOutlineAnnotation(); }
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
475231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Returns the object containing this one. Can be different from parent for positioned elements.
476231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // If repaintContainer and repaintContainerSkipped are not null, on return *repaintContainerSkipped
477231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // is true if the renderer returned is an ancestor of repaintContainer.
478231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RenderObject* container(RenderBoxModelObject* repaintContainer = 0, bool* repaintContainerSkipped = 0) const;
479231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual RenderObject* hoverAncestor() const { return parent(); }
4818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
4828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // IE Extension that can be called on any RenderObject.  See the implementation for the details.
4838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderBoxModelObject* offsetParent() const;
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void markContainingBlocksForLayout(bool scheduleRelayout = true, RenderObject* newRoot = 0);
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNeedsLayout(bool b, bool markParents = true);
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setChildNeedsLayout(bool b, bool markParents = true);
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNeedsPositionedMovementLayout();
4892bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setNeedsSimplifiedNormalFlowLayout();
490bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void setPreferredLogicalWidthsDirty(bool, bool markParents = true);
491bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void invalidateContainerPreferredLogicalWidths();
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNeedsLayoutAndPrefWidthsRecalc()
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setNeedsLayout(true);
496bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        setPreferredLogicalWidthsDirty(true);
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setPositioned(bool b = true)  { m_positioned = b;  }
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setRelPositioned(bool b = true) { m_relPositioned = b; }
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setFloating(bool b = true) { m_floating = b; }
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setInline(bool b = true) { m_inline = b; }
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasBoxDecorations(bool b = true) { m_paintBackground = b; }
504635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setIsText() { m_isText = true; }
505635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setIsBox() { m_isBox = true; }
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setReplaced(bool b = true) { m_replaced = b; }
5072bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setHorizontalWritingMode(bool b = true) { m_horizontalWritingMode = b; }
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasOverflowClip(bool b = true) { m_hasOverflowClip = b; }
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasLayer(bool b = true) { m_hasLayer = b; }
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasTransform(bool b = true) { m_hasTransform = b; }
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasReflection(bool b = true) { m_hasReflection = b; }
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void scheduleRelayout();
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void updateFillImages(const FillLayer*, const FillLayer*);
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void updateImage(StyleImage*, StyleImage*);
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void paint(PaintInfo&, int tx, int ty);
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Recursive function that computes the size and position of this object and all its descendants.
5218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void layout();
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* This function performs a layout only if one is needed. */
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void layoutIfNeeded() { if (needsLayout()) layout(); }
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // used for element state updates that cannot be fixed with a
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // repaint and do not need a relayout
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void updateFromElement() { }
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
5318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void addDashboardRegions(Vector<DashboardRegionValue>&);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void collectDashboardRegions(Vector<DashboardRegionValue>&);
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hitTest(const HitTestRequest&, HitTestResult&, const IntPoint&, int tx, int ty, HitTestFilter = HitTestAll);
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);
5378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void updateHitTestResult(HitTestResult&, const IntPoint&);
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    VisiblePosition positionForCoordinates(int x, int y);
5408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual VisiblePosition positionForPoint(const IntPoint&);
5418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    VisiblePosition createVisiblePosition(int offset, EAffinity);
5428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    VisiblePosition createVisiblePosition(const Position&);
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void dirtyLinesFromChangedChild(RenderObject*);
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Called to update a style that is allowed to trigger animations.
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Right now this will typically be called only when updating happens from the DOM on explicit elements.
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We don't yet handle generated content animation such as first-letter or before/after (we'll worry about this later).
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setAnimatableStyle(PassRefPtr<RenderStyle>);
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set the style of the object and update the state of the object accordingly.
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void setStyle(PassRefPtr<RenderStyle>);
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Updates only the local style ptr of the object.  Does not update the state of the object,
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and so only should be called when the style is known not to have changed (or from setStyle).
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setStyleInternal(PassRefPtr<RenderStyle>);
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // returns the containing block level element for this element.
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderBlock* containingBlock() const;
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
561635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Convert the given local point to absolute coordinates
562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // FIXME: Temporary. If useTransforms is true, take transforms into account. Eventually localToAbsolute() will always be transform-aware.
5632bde8e466a4451c7319e3a072d118917957d6554Steve Block    FloatPoint localToAbsolute(const FloatPoint& localPoint = FloatPoint(), bool fixed = false, bool useTransforms = false) const;
5642bde8e466a4451c7319e3a072d118917957d6554Steve Block    FloatPoint absoluteToLocal(const FloatPoint&, bool fixed = false, bool useTransforms = false) const;
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Convert a local quad to absolute coordinates, taking transforms into account.
567635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    FloatQuad localToAbsoluteQuad(const FloatQuad& quad, bool fixed = false) const
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
569635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return localToContainerQuad(quad, 0, fixed);
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Convert a local quad into the coordinate system of container, taking transforms into account.
5728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    FloatQuad localToContainerQuad(const FloatQuad&, RenderBoxModelObject* repaintContainer, bool fixed = false) const;
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
574692e5dbf12901edacf14812a6fae25462920af42Steve Block    // Return the offset from the container() renderer (excluding transforms). In multi-column layout,
575692e5dbf12901edacf14812a6fae25462920af42Steve Block    // different offsets apply at different points, so return the offset that applies to the given point.
576692e5dbf12901edacf14812a6fae25462920af42Steve Block    virtual IntSize offsetFromContainer(RenderObject*, const IntPoint&) const;
577231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Return the offset from an object up the container() chain. Asserts that none of the intermediate objects have transforms.
578231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    IntSize offsetFromAncestorContainer(RenderObject*) const;
579635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void absoluteRects(Vector<IntRect>&, int, int) { }
581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // FIXME: useTransforms should go away eventually
582635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect absoluteBoundingBoxRect(bool useTransforms = false);
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Build an array of quads in absolute coords for line boxes
5855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void absoluteQuads(Vector<FloatQuad>&) { }
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
587d0825bca7fe65beaee391d30da42e937db621564Steve Block    void absoluteFocusRingQuads(Vector<FloatQuad>&);
588d0825bca7fe65beaee391d30da42e937db621564Steve Block
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the rect that will be painted if this object is passed as the paintingRoot
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect paintingRootRect(IntRect& topLevelRect);
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
592bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual int minPreferredLogicalWidth() const { return 0; }
593bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual int maxPreferredLogicalWidth() const { return 0; }
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderStyle* style() const { return m_style.get(); }
5968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderStyle* firstLineStyle() const { return document()->usesFirstLineRules() ? firstLineStyleSlowCase() : style(); }
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderStyle* style(bool firstLine) const { return firstLine ? firstLineStyle() : style(); }
5980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Used only by Element::pseudoStyleCacheIsInvalid to get a first line style based off of a
6000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // given new style, without accessing the cache.
6010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PassRefPtr<RenderStyle> uncachedFirstLineStyle(RenderStyle*) const;
6020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Anonymous blocks that are part of of a continuation chain will return their inline continuation's outline style instead.
6048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This is typically only relevant when repainting.
6058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual RenderStyle* outlineStyleForRepaint() const { return style(); }
6068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void getTextDecorationColors(int decorations, Color& underline, Color& overline,
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                 Color& linethrough, bool quirksMode = false);
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
610635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Return the RenderBox in the container chain which is responsible for painting this object, or 0
611635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // if painting is root-relative. This is the container that should be passed to the 'forRepaint'
612635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // methods.
6138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderBoxModelObject* containerForRepaint() const;
6148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Actually do the repaint of rect r for this object which has been computed in the coordinate space
6158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // of repaintContainer. If repaintContainer is 0, repaint via the view.
6168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void repaintUsingContainer(RenderBoxModelObject* repaintContainer, const IntRect& r, bool immediate = false);
617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Repaint the entire object.  Called when, e.g., the color of a border changes, or when a border
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // style changes.
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void repaint(bool immediate = false);
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Repaint a specific subrectangle within a given object.  The rect |r| is in the object's coordinate space.
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void repaintRectangle(const IntRect&, bool immediate = false);
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Repaint only if our old bounds and new bounds are different. The caller may pass in newBounds and newOutlineBox if they are known.
626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool repaintAfterLayoutIfNeeded(RenderBoxModelObject* repaintContainer, const IntRect& oldBounds, const IntRect& oldOutlineBox, const IntRect* newBoundsPtr = 0, const IntRect* newOutlineBoxPtr = 0);
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Repaint only if the object moved.
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void repaintDuringLayoutIfMoved(const IntRect& rect);
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Called to repaint a block's floats.
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void repaintOverhangingFloats(bool paintAllDescendants = false);
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool checkForRepaintDuringLayout() const;
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Returns the rect that should be repainted whenever this object changes.  The rect is in the view's
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // coordinate space.  This method deals with outlines and overflow.
638635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect absoluteClippedOverflowRect()
639635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
640635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return clippedOverflowRectForRepaint(0);
641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
6428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer);
6438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual IntRect rectWithOutlineForRepaint(RenderBoxModelObject* repaintContainer, int outlineWidth);
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
645635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Given a rect in the object's coordinate space, compute a rect suitable for repainting
646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // that rect in view coordinates.
647635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void computeAbsoluteRepaintRect(IntRect& r, bool fixed = false)
648635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
6498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return computeRectForRepaint(0, r, fixed);
650635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
651635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Given a rect in the object's coordinate space, compute a rect suitable for repainting
652635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // that rect in the coordinate space of repaintContainer.
6538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect&, bool fixed = false);
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
655692e5dbf12901edacf14812a6fae25462920af42Steve Block    // If multiple-column layout results in applying an offset to the given point, add the same
656692e5dbf12901edacf14812a6fae25462920af42Steve Block    // offset to the given size.
657692e5dbf12901edacf14812a6fae25462920af42Steve Block    virtual void adjustForColumns(IntSize&, const IntPoint&) const { }
658692e5dbf12901edacf14812a6fae25462920af42Steve Block
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual unsigned int length() const { return 1; }
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isFloatingOrPositioned() const { return (isFloating() || isPositioned()); }
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isTransparent() const { return style()->opacity() < 1.0f; }
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float opacity() const { return style()->opacity(); }
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasReflection() const { return m_hasReflection; }
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Applied as a "slop" to dirty rect checks during the outline painting phase's dirty-rect checks.
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int maximalOutlineSize(PaintPhase) const;
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setHasMarkupTruncation(bool b = true) { m_hasMarkupTruncation = b; }
6728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasMarkupTruncation() const { return m_hasMarkupTruncation; }
6738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum SelectionState {
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionNone, // The object is not selected.
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionStart, // The object either contains the start of a selection run or is the start of a run
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionInside, // The object is fully encompassed by a selection run
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionEnd, // The object either contains the end of a selection run or is the end of a run
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionBoth // The object contains an entire run or is the sole selected object in that run
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The current selection state for an object.  For blocks, the state refers to the state of the leaf
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // descendants (as described above in the SelectionState enum declaration).
6848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    SelectionState selectionState() const { return static_cast<SelectionState>(m_selectionState);; }
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Sets the selection state for an object.
6878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void setSelectionState(SelectionState state) { m_selectionState = state; }
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // A single rectangle that encompasses all of the selected objects within this object.  Used to determine the tightest
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // possible bounding box for the selection.
6918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    IntRect selectionRect(bool clipToVisibleContent = true) { return selectionRectForRepaint(0, clipToVisibleContent); }
6928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual IntRect selectionRectForRepaint(RenderBoxModelObject* /*repaintContainer*/, bool /*clipToVisibleContent*/ = true) { return IntRect(); }
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Whether or not an object can be part of the leaf elements of the selection.
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool canBeSelectionLeaf() const { return false; }
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Whether or not a block has selected children.
6988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasSelectedChildren() const { return m_selectionState != SelectionNone; }
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Obtains the selection colors that should be used when painting a selection.
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color selectionBackgroundColor() const;
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color selectionForegroundColor() const;
703f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Color selectionEmphasisMarkColor() const;
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Whether or not a given block needs to paint selection gaps.
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool shouldPaintSelectionGaps() const { return false; }
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(DRAG_SUPPORT)
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* draggableNode(bool dhtmlOK, bool uaOK, int x, int y, bool& dhtmlWillDrag) const;
710231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /**
713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project     * Returns the local coordinates of the caret within this render object.
714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project     * @param caretOffset zero-based offset determining position within the render object.
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * @param extraWidthToEndOfLine optional out arg to give extra width to end of line -
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * useful for character range rect computations
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     */
718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual IntRect localCaretRect(InlineBox*, int caretOffset, int* extraWidthToEndOfLine = 0);
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
720bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool isMarginBeforeQuirk() const { return m_marginBeforeQuirk; }
721bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool isMarginAfterQuirk() const { return m_marginAfterQuirk; }
722bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void setMarginBeforeQuirk(bool b = true) { m_marginBeforeQuirk = b; }
723bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void setMarginAfterQuirk(bool b = true) { m_marginAfterQuirk = b; }
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // When performing a global document tear-down, the renderer of the document is cleared.  We use this
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as a hook to detect the case of document destruction and don't waste time doing unnecessary work.
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool documentBeingDestroyed() const;
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void destroy();
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Virtual function helpers for CSS3 Flexible Box Layout
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isFlexibleBox() const { return false; }
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isFlexingChildren() const { return false; }
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isStretchingChildren() const { return false; }
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7362bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool isCombineText() const { return false; }
7372bde8e466a4451c7319e3a072d118917957d6554Steve Block
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int caretMinOffset() const;
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int caretMaxOffset() const;
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual unsigned caretMaxRenderedOffset() const;
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int previousOffset(int current) const;
7438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual int previousOffsetForBackwardDeletion(int current) const;
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int nextOffset(int current) const;
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
746635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void imageChanged(CachedImage*, const IntRect* = 0);
747635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void imageChanged(WrappedImagePtr, const IntRect* = 0) { }
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool willRenderImage(CachedImage*);
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void selectionStartEnd(int& spos, int& epos) const;
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasOverrideSize() const { return m_hasOverrideSize; }
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasOverrideSize(bool b) { m_hasOverrideSize = b; }
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void remove() { if (parent()) parent()->removeChild(this); }
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationController* animation() const;
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
759635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool visibleToHitTesting() const { return style()->visibility() == VISIBLE && style()->pointerEvents() != PE_NONE; }
7608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
7618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Map points and quads through elements, potentially via 3d transforms. You should never need to call these directly; use
7628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // localToAbsolute/absoluteToLocal methods instead.
7638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&) const;
7648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState&) const;
7658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
7665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool shouldUseTransformFromContainer(const RenderObject* container) const;
7675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    void getTransformFromContainer(const RenderObject* container, const IntSize& offsetInContainer, TransformationMatrix&) const;
768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
769d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual void addFocusRingRects(Vector<IntRect>&, int /*tx*/, int /*ty*/) { };
770635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
771635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect absoluteOutlineBounds() const
772635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
773635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return outlineBoundsForRepaint(0);
774635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
775635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected:
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overrides should call the superclass at the end
7788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overrides should call the superclass at the start
7808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
78105c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease    void propagateStyleToAnonymousChildren();
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void drawLineForBoxSide(GraphicsContext*, int x1, int y1, int x2, int y2, BoxSide,
7842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                            Color, EBorderStyle, int adjbw1, int adjbw2, bool antialias = false);
7852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
786a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void paintFocusRing(GraphicsContext*, int tx, int ty, RenderStyle*);
787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void paintOutline(GraphicsContext*, int tx, int ty, int w, int h);
788635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void addPDFURLRect(GraphicsContext*, const IntRect&);
789635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual IntRect viewRect() const;
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void adjustRectForOutlineAndShadow(IntRect&) const;
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void arenaDelete(RenderArena*, void* objectBase);
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* /*cachedOffsetToRepaintContainer*/ = 0) const { return IntRect(); }
797635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    class LayoutRepainter {
7998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    public:
8008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        LayoutRepainter(RenderObject& object, bool checkForRepaint, const IntRect* oldBounds = 0)
8018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            : m_object(object)
8028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            , m_repaintContainer(0)
8038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            , m_checkForRepaint(checkForRepaint)
8048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        {
8058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (m_checkForRepaint) {
8068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_repaintContainer = m_object.containerForRepaint();
8078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_oldBounds = oldBounds ? *oldBounds : m_object.clippedOverflowRectForRepaint(m_repaintContainer);
8088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_oldOutlineBox = m_object.outlineBoundsForRepaint(m_repaintContainer);
8098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
8108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
8118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Return true if it repainted.
8138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool repaintAfterLayout()
8148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        {
8158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return m_checkForRepaint ? m_object.repaintAfterLayoutIfNeeded(m_repaintContainer, m_oldBounds, m_oldOutlineBox) : false;
8168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
8178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool checkForRepaint() const { return m_checkForRepaint; }
8198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    private:
8218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RenderObject& m_object;
8228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RenderBoxModelObject* m_repaintContainer;
8238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        IntRect m_oldBounds;
8248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        IntRect m_oldOutlineBox;
8258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool m_checkForRepaint;
8268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    };
8278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
8298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderStyle* firstLineStyleSlowCase() const;
8308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    StyleDifference adjustStyleDifference(StyleDifference, unsigned contextSensitiveProperties) const;
831f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
832f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Color selectionColor(int colorProperty) const;
8338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<RenderStyle> m_style;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* m_node;
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* m_parent;
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* m_previous;
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* m_next;
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasAXObject;
844635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_setNeedsLayoutForbidden : 1;
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // 32 bits have been used here. THERE ARE NO FREE BITS AVAILABLE.
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_needsLayout               : 1;
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_needsPositionedMovementLayout :1;
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_normalChildNeedsLayout    : 1;
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_posChildNeedsLayout       : 1;
8522bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_needsSimplifiedNormalFlowLayout  : 1;
853bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool m_preferredLogicalWidthsDirty           : 1;
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_floating                  : 1;
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_positioned                : 1;
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_relPositioned             : 1;
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_paintBackground           : 1; // if the box has something to paint in the
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                          // background painting phase (background, border, etc)
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_isAnonymous               : 1;
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_isText                    : 1;
863635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_isBox                     : 1;
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_inline                    : 1;
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_replaced                  : 1;
8662bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_horizontalWritingMode : 1;
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_isDragging                : 1;
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasLayer                  : 1;
870e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool m_hasOverflowClip           : 1; // Set in the case of overflow:auto/scroll/hidden
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasTransform              : 1;
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasReflection             : 1;
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasOverrideSize           : 1;
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasCounterNodeMap         : 1;
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_everHadLayout             : 1;
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
8818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // These bitfields are moved here from subclasses to pack them together
8828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // from RenderBlock
8838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_childrenInline : 1;
884bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool m_marginBeforeQuirk : 1;
885bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool m_marginAfterQuirk : 1;
8868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_hasMarkupTruncation : 1;
8878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    unsigned m_selectionState : 3; // SelectionState
8888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_hasColumns : 1;
8898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // from RenderTableCell
8918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_cellWidthChanged : 1;
8928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprivate:
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Store state between styleWillChange and styleDidChange
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static bool s_affectsParentBlock;
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline bool RenderObject::documentBeingDestroyed() const
8998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return !document()->renderer();
9018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
9028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
903a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochinline bool RenderObject::isBeforeContent() const
904a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
905a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (style()->styleType() != BEFORE)
906a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return false;
907a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // Text nodes don't have their own styles, so ignore the style on a text node.
908a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (isText() && !isBR())
909a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return false;
910a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return true;
911a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
912a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
913231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline bool RenderObject::isAfterContent() const
914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
915231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (style()->styleType() != AFTER)
916231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
917231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Text nodes don't have their own styles, so ignore the style on a text node.
918231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (isText() && !isBR())
919231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
920231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return true;
921231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
922231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
923c58b6b265aa9aca56296a4c1199521fe4ab3cb70Steve Blockinline bool RenderObject::isBeforeOrAfterContent() const
924c58b6b265aa9aca56296a4c1199521fe4ab3cb70Steve Block{
925c58b6b265aa9aca56296a4c1199521fe4ab3cb70Steve Block    return isBeforeContent() || isAfterContent();
926c58b6b265aa9aca56296a4c1199521fe4ab3cb70Steve Block}
927c58b6b265aa9aca56296a4c1199521fe4ab3cb70Steve Block
9288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline void RenderObject::setNeedsLayout(bool b, bool markParents)
9298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool alreadyNeededLayout = m_needsLayout;
9318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_needsLayout = b;
9328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (b) {
9338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        ASSERT(!isSetNeedsLayoutForbidden());
9348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!alreadyNeededLayout) {
9358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (markParents)
9368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                markContainingBlocksForLayout();
9378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (hasLayer())
9388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                setLayerNeedsFullRepaint();
9398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
9408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    } else {
9418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_everHadLayout = true;
9428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_posChildNeedsLayout = false;
9432bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_needsSimplifiedNormalFlowLayout = false;
9448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_normalChildNeedsLayout = false;
9458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_needsPositionedMovementLayout = false;
9468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
9478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
9488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline void RenderObject::setChildNeedsLayout(bool b, bool markParents)
9508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool alreadyNeededLayout = m_normalChildNeedsLayout;
9528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_normalChildNeedsLayout = b;
9538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (b) {
9548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        ASSERT(!isSetNeedsLayoutForbidden());
9558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!alreadyNeededLayout && markParents)
9568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            markContainingBlocksForLayout();
9578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    } else {
9588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_posChildNeedsLayout = false;
9592bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_needsSimplifiedNormalFlowLayout = false;
9608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_normalChildNeedsLayout = false;
9618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_needsPositionedMovementLayout = false;
9628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
9638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
9648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline void RenderObject::setNeedsPositionedMovementLayout()
9668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool alreadyNeededLayout = m_needsPositionedMovementLayout;
9688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_needsPositionedMovementLayout = true;
9692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(!isSetNeedsLayoutForbidden());
9708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (!alreadyNeededLayout) {
9718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        markContainingBlocksForLayout();
9728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (hasLayer())
9738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            setLayerNeedsFullRepaint();
9748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
9758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
9768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9772bde8e466a4451c7319e3a072d118917957d6554Steve Blockinline void RenderObject::setNeedsSimplifiedNormalFlowLayout()
9782bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool alreadyNeededLayout = m_needsSimplifiedNormalFlowLayout;
9802bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_needsSimplifiedNormalFlowLayout = true;
9812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(!isSetNeedsLayoutForbidden());
9822bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!alreadyNeededLayout) {
9832bde8e466a4451c7319e3a072d118917957d6554Steve Block        markContainingBlocksForLayout();
9842bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (hasLayer())
9852bde8e466a4451c7319e3a072d118917957d6554Steve Block            setLayerNeedsFullRepaint();
9862bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
9872bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9882bde8e466a4451c7319e3a072d118917957d6554Steve Block
9898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline bool objectIsRelayoutBoundary(const RenderObject *obj)
9908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // FIXME: In future it may be possible to broaden this condition in order to improve performance.
9928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Table cells are excluded because even when their CSS height is fixed, their height()
9938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // may depend on their contents.
9948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return obj->isTextControl()
9958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        || (obj->hasOverflowClip() && !obj->style()->width().isIntrinsicOrAuto() && !obj->style()->height().isIntrinsicOrAuto() && !obj->style()->height().isPercent() && !obj->isTableCell())
9968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(SVG)
9978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian           || obj->isSVGRoot()
9988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
9998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian           ;
10008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline void RenderObject::markContainingBlocksForLayout(bool scheduleRelayout, RenderObject* newRoot)
10038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
10048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    ASSERT(!scheduleRelayout || !newRoot);
10058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderObject* o = container();
10078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderObject* last = this;
10088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10092bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool simplifiedNormalFlowLayout = needsSimplifiedNormalFlowLayout() && !selfNeedsLayout() && !normalChildNeedsLayout();
10102bde8e466a4451c7319e3a072d118917957d6554Steve Block
10118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    while (o) {
10128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Don't mark the outermost object of an unrooted subtree. That object will be
10138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // marked when the subtree is added to the document.
10148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RenderObject* container = o->container();
10158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!container && !o->isRenderView())
10168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
10178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!last->isText() && (last->style()->position() == FixedPosition || last->style()->position() == AbsolutePosition)) {
101854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            while (o && !o->isRenderBlock()) // Skip relatively positioned inlines and get to the enclosing RenderBlock.
101954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block                o = o->container();
102054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            if (!o || o->m_posChildNeedsLayout)
10218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return;
10228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            o->m_posChildNeedsLayout = true;
10232bde8e466a4451c7319e3a072d118917957d6554Steve Block            simplifiedNormalFlowLayout = true;
10242bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(!o->isSetNeedsLayoutForbidden());
10252bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (simplifiedNormalFlowLayout) {
10262bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (o->m_needsSimplifiedNormalFlowLayout)
10272bde8e466a4451c7319e3a072d118917957d6554Steve Block                return;
10282bde8e466a4451c7319e3a072d118917957d6554Steve Block            o->m_needsSimplifiedNormalFlowLayout = true;
10298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            ASSERT(!o->isSetNeedsLayoutForbidden());
10308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else {
10318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (o->m_normalChildNeedsLayout)
10328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return;
10338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            o->m_normalChildNeedsLayout = true;
10348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            ASSERT(!o->isSetNeedsLayoutForbidden());
10358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
10368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (o == newRoot)
10388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
10398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        last = o;
10418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (scheduleRelayout && objectIsRelayoutBoundary(last))
10428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
10438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        o = container;
10448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
10458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (scheduleRelayout)
10478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        last->scheduleRelayout();
10488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline bool RenderObject::preservesNewline() const
10512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
10522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(SVG)
10532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (isSVGInlineText())
10542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
10552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
10562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return style()->preserveNewline();
10582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
10592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochinline void makeMatrixRenderable(TransformationMatrix& matrix, bool has3DRendering)
10618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
10628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if !ENABLE(3D_RENDERING)
10630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    UNUSED_PARAM(has3DRendering);
10648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    matrix.makeAffine();
10658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else
10660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!has3DRendering)
10670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        matrix.makeAffine();
10688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
10698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1071231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline int adjustForAbsoluteZoom(int value, RenderObject* renderer)
1072231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
107368513a70bcd92384395513322f1b801e7bf9c729Steve Block    return adjustForAbsoluteZoom(value, renderer->style());
1074231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1075231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1076231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline FloatPoint adjustFloatPointForAbsoluteZoom(const FloatPoint& point, RenderObject* renderer)
1077231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1078231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // The result here is in floats, so we don't need the truncation hack from the integer version above.
1079231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    float zoomFactor = renderer->style()->effectiveZoom();
1080231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (zoomFactor == 1)
1081231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return point;
1082231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return FloatPoint(point.x() / zoomFactor, point.y() / zoomFactor);
1083231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1084231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1085231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline void adjustFloatQuadForAbsoluteZoom(FloatQuad& quad, RenderObject* renderer)
1086231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1087231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    quad.setP1(adjustFloatPointForAbsoluteZoom(quad.p1(), renderer));
1088231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    quad.setP2(adjustFloatPointForAbsoluteZoom(quad.p2(), renderer));
1089231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    quad.setP3(adjustFloatPointForAbsoluteZoom(quad.p3(), renderer));
1090231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    quad.setP4(adjustFloatPointForAbsoluteZoom(quad.p4(), renderer));
1091231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1092231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1093f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline void adjustFloatRectForAbsoluteZoom(FloatRect& rect, RenderObject* renderer)
1094f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
1095f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RenderStyle* style = renderer->style();
1096f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    rect.setX(adjustFloatForAbsoluteZoom(rect.x(), style));
1097f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    rect.setY(adjustFloatForAbsoluteZoom(rect.y(), style));
1098f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    rect.setWidth(adjustFloatForAbsoluteZoom(rect.width(), style));
1099f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    rect.setHeight(adjustFloatForAbsoluteZoom(rect.height(), style));
1100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
1101f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
11022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline FloatPoint adjustFloatPointForPageScale(const FloatPoint& point, float pageScale)
11032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
11042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (pageScale == 1)
11052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return point;
11062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return FloatPoint(point.x() / pageScale, point.y() / pageScale);
11072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
11082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline void adjustFloatQuadForPageScale(FloatQuad& quad, float pageScale)
11102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
11112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (pageScale == 1)
11122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
11132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    quad.setP1(adjustFloatPointForPageScale(quad.p1(), pageScale));
11142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    quad.setP2(adjustFloatPointForPageScale(quad.p2(), pageScale));
11152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    quad.setP3(adjustFloatPointForPageScale(quad.p3(), pageScale));
11162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    quad.setP4(adjustFloatPointForPageScale(quad.p4(), pageScale));
11172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
11182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline void adjustFloatRectForPageScale(FloatRect& rect, float pageScale)
11202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
11212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (pageScale == 1)
11222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
11232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    rect.setX(rect.x() / pageScale);
11242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    rect.setY(rect.y() / pageScale);
11252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    rect.setWidth(rect.width() / pageScale);
11262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    rect.setHeight(rect.height() / pageScale);
11272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
11282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Outside the WebCore namespace for ease of invocation from gdb.
11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid showTree(const WebCore::RenderObject*);
1134643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1);
1135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// We don't make object2 an optional parameter so that showRenderTree
1136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// can be called from gdb easily.
1137643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1, const WebCore::RenderObject* object2);
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // RenderObject_h
1141