RenderObject.h revision 2fc2651226baac27029e38c9d6ef883fa32084db
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
40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if PLATFORM(CG) || PLATFORM(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
828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// Sides used when drawing borders and outlines.  This is in RenderObject rather than RenderBoxModelObject since outlines can
838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// be drawn by SVG around bounding boxes.
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianenum BoxSide {
858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    BSTop,
868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    BSBottom,
878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    BSLeft,
888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    BSRight
898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian};
908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianconst int caretWidth = 1;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct DashboardRegionValue {
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool operator==(const DashboardRegionValue& o) const
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return type == o.type && bounds == o.bounds && clip == o.clip && label == o.label;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool operator!=(const DashboardRegionValue& o) const
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return !(*this == o);
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String label;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect bounds;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect clip;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int type;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Base class for all rendering tree objects.
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderObject : public CachedResourceClient {
1138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    friend class RenderBlock;
1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    friend class RenderBox;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    friend class RenderLayer;
1168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    friend class RenderObjectChildList;
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    friend class RenderSVGContainer;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Anonymous objects should pass the document as their node, and they will then automatically be
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // marked as anonymous in the constructor.
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject(Node*);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ~RenderObject();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RenderTheme* theme() const;
1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual const char* renderName() const = 0;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* parent() const { return m_parent; }
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isDescendantOf(const RenderObject*) const;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* previousSibling() const { return m_previous; }
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextSibling() const { return m_next; }
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderObject* firstChild() const
1358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    {
1368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (const RenderObjectChildList* children = virtualChildren())
1378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return children->firstChild();
1388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return 0;
1398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
1408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderObject* lastChild() const
1418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    {
1428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (const RenderObjectChildList* children = virtualChildren())
1438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return children->lastChild();
1448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return 0;
1458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RenderObject* beforePseudoElementRenderer() const
1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (const RenderObjectChildList* children = virtualChildren())
1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return children->beforePseudoElementRenderer(this);
1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 0;
1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RenderObject* afterPseudoElementRenderer() const
1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (const RenderObjectChildList* children = virtualChildren())
1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return children->afterPseudoElementRenderer(this);
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 0;
1572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual RenderObjectChildList* virtualChildren() { return 0; }
1598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual const RenderObjectChildList* virtualChildren() const { return 0; }
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextInPreOrder() const;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextInPreOrder(RenderObject* stayWithin) const;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextInPreOrderAfterChildren() const;
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextInPreOrderAfterChildren(RenderObject* stayWithin) const;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* previousInPreOrder() const;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* childAt(unsigned) const;
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* firstLeafChild() const;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* lastLeafChild() const;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // The following six functions are used when the render tree hierarchy changes to make sure layers get
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // properly added and removed.  Since containership can be implemented by any subclass, and since a hierarchy
173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // can contain a mixture of boxes and other object types, these functions need to be in the base class.
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderLayer* enclosingLayer() const;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addLayers(RenderLayer* parentLayer, RenderObject* newObject);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void removeLayers(RenderLayer* parentLayer);
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void moveLayers(RenderLayer* oldParent, RenderLayer* newParent);
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderLayer* findNextLayer(RenderLayer* parentLayer, RenderObject* startPoint, bool checkParent = true);
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Convenience function for getting to the nearest enclosing box of a RenderObject.
181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RenderBox* enclosingBox() const;
182e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RenderBoxModelObject* enclosingBoxModelObject() const;
183e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isEmpty() const { return firstChild() == 0; }
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasAXObject(bool flag) { m_hasAXObject = flag; }
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasAXObject() const { return m_hasAXObject; }
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool isSetNeedsLayoutForbidden() const { return m_setNeedsLayoutForbidden; }
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setNeedsLayoutIsForbidden(bool flag) { m_setNeedsLayoutForbidden = flag; }
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Obtains the nearest enclosing block (including this block) that contributes a first-line style to our inline
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // children.
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual RenderBlock* firstLineBlock() const;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Called when an object that was floating or positioned becomes a normal flow object
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // again.  We have to make sure the render tree updates as needed to accommodate the new
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // normal flow object.
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void handleDynamicFloatPositionChange();
2018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RenderObject tree manipulation
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////////////////////////////
2048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual bool canHaveChildren() const { return virtualChildren(); }
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isChildAllowed(RenderObject*, RenderStyle*) const { return true; }
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0);
2078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void addChildIgnoringContinuation(RenderObject* newChild, RenderObject* beforeChild = 0) { return addChild(newChild, beforeChild); }
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void removeChild(RenderObject*);
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool createsAnonymousWrapper() const { return false; }
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////////////////////////////
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected:
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////////////////////////////
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Helper functions. Dangerous to use!
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setPreviousSibling(RenderObject* previous) { m_previous = previous; }
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNextSibling(RenderObject* next) { m_next = next; }
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setParent(RenderObject* parent) { m_parent = parent; }
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////////////////////////////
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addAbsoluteRectForLayer(IntRect& result);
2218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setLayerNeedsFullRepaint();
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void showTreeForThis() const;
226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void showRenderObject() const;
228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We don't make printedCharacters an optional parameter so that
229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // showRenderObject can be called from gdb easily.
230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void showRenderObject(int printedCharacters) const;
231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void showRenderTreeAndMark(const RenderObject* markedObject1 = 0, const char* markedLabel1 = 0, const RenderObject* markedObject2 = 0, const char* markedLabel2 = 0, int depth = 0) const;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static RenderObject* createObject(Node*, RenderStyle*);
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overloaded new operator.  Derived classes must override operator new
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // in order to allocate out of the RenderArena.
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void* operator new(size_t, RenderArena*) throw();
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overridden to prevent the normal delete from being called.
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void operator delete(void*, size_t);
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The normal operator new is disallowed on all render objects.
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void* operator new(size_t) throw();
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderArena* renderArena() const { return document()->renderArena(); }
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isApplet() const { return false; }
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isBR() const { return false; }
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isBlockFlow() const { return false; }
2538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual bool isBoxModelObject() const { return false; }
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isCounter() 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;
315a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    static inline bool isBeforeContent(const RenderObject* obj) { return obj && obj->isBeforeContent(); }
316231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static inline bool isAfterContent(const RenderObject* obj) { return obj && obj->isAfterContent(); }
317231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool childrenInline() const { return m_childrenInline; }
3198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setChildrenInline(bool b = true) { m_childrenInline = b; }
3208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasColumns() const { return m_hasColumns; }
3218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setHasColumns(bool b = true) { m_hasColumns = b; }
3228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool cellWidthChanged() const { return m_cellWidthChanged; }
3238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setCellWidthChanged(bool b = true) { m_cellWidthChanged = 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    {
3908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return m_isAnonymous && style()->display() == BLOCK && style()->styleType() == NOPSEUDO && !isListMarker();
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool isAnonymousColumnsBlock() const { return style()->specifiesColumns() && isAnonymousBlock(); }
3935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool isAnonymousColumnSpanBlock() const { return style()->columnSpan() && isAnonymousBlock(); }
394e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool isElementContinuation() const { return node() && node()->renderer() != this; }
395e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool isInlineElementContinuation() const { return isElementContinuation() && isInline(); }
396e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool isBlockElementContinuation() const { return isElementContinuation() && !isInline(); }
397e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    virtual RenderBoxModelObject* virtualContinuation() const { return 0; }
398e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isFloating() const { return m_floating; }
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isPositioned() const { return m_positioned; } // absolute or fixed positioning
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isRelPositioned() const { return m_relPositioned; } // relative positioning
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isText() const  { return m_isText; }
403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool isBox() const { return m_isBox; }
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInline() const { return m_inline; }  // inline object
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isRunIn() const { return style()->display() == RUN_IN; } // run-in object
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isDragging() const { return m_isDragging; }
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isReplaced() const { return m_replaced; } // a "replaced" element (see CSS)
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasLayer() const { return m_hasLayer; }
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasBoxDecorations() const { return m_paintBackground; }
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool mustRepaintBackgroundOrBorder() const;
4135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool hasBackground() const { return style()->hasBackground(); }
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool needsLayout() const { return m_needsLayout || m_normalChildNeedsLayout || m_posChildNeedsLayout || m_needsPositionedMovementLayout; }
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool selfNeedsLayout() const { return m_needsLayout; }
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool needsPositionedMovementLayout() const { return m_needsPositionedMovementLayout; }
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool needsPositionedMovementLayoutOnly() const { return m_needsPositionedMovementLayout && !m_needsLayout && !m_normalChildNeedsLayout && !m_posChildNeedsLayout; }
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool posChildNeedsLayout() const { return m_posChildNeedsLayout; }
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool normalChildNeedsLayout() const { return m_normalChildNeedsLayout; }
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
421bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool preferredLogicalWidthsDirty() const { return m_preferredLogicalWidthsDirty; }
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isSelectionBorder() const;
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasClip() const { return isPositioned() && style()->hasClip(); }
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasOverflowClip() const { return m_hasOverflowClip; }
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasTransform() const { return m_hasTransform; }
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasMask() const { return style() && style()->hasMask(); }
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void drawLineForBoxSide(GraphicsContext*, int x1, int y1, int x2, int y2, BoxSide,
432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                            Color, EBorderStyle, int adjbw1, int adjbw2);
433ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#if HAVE(PATH_BASED_BORDER_RADIUS_DRAWING)
434ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void drawBoxSideFromPath(GraphicsContext*, IntRect, Path,
435ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                            float thickness, float drawThickness, BoxSide, const RenderStyle*,
436ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                            Color, EBorderStyle);
437ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#else
438ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // FIXME: This function should be removed when all ports implement GraphicsContext::clipConvexPolygon()!!
439ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // At that time, everyone can use RenderObject::drawBoxSideFromPath() instead. This should happen soon.
4408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void drawArcForBoxSide(GraphicsContext*, int x, int y, float thickness, IntSize radius, int angleStart,
441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                           int angleSpan, BoxSide, Color, EBorderStyle, bool firstCorner);
442ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
443ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
444ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    IntRect borderInnerRect(const IntRect&, unsigned short topWidth, unsigned short bottomWidth,
445ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                            unsigned short leftWidth, unsigned short rightWidth) const;
4468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The pseudo element style can be cached or uncached.  Use the cached method if the pseudo element doesn't respect
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // any pseudo classes (and therefore has no concept of changing state).
4498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderStyle* getCachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0) const;
4500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PassRefPtr<RenderStyle> getUncachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0, RenderStyle* ownStyle = 0) const;
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void updateDragState(bool dragOn);
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderView* view() const;
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Returns true if this renderer is rooted, and optionally returns the hosting view (the root of the hierarchy).
4578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool isRooted(RenderView** = 0);
4588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
4598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    Node* node() const { return m_isAnonymous ? 0 : m_node; }
4602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Returns the styled node that caused the generation of this renderer.
4622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // This is the same as node() except for renderers of :before and :after
4632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // pseudo elements for which their parent node is returned.
4642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Node* generatingNode() const { return m_node == document() ? 0 : m_node; }
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNode(Node* node) { m_node = node; }
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
467545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Document* document() const { return m_node->document(); }
468545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Frame* frame() const { return document()->frame(); }
469545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasOutlineAnnotation() const;
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasOutline() const { return style()->hasOutline() || hasOutlineAnnotation(); }
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
473231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Returns the object containing this one. Can be different from parent for positioned elements.
474231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // If repaintContainer and repaintContainerSkipped are not null, on return *repaintContainerSkipped
475231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // is true if the renderer returned is an ancestor of repaintContainer.
476231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RenderObject* container(RenderBoxModelObject* repaintContainer = 0, bool* repaintContainerSkipped = 0) const;
477231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual RenderObject* hoverAncestor() const { return parent(); }
4798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
4808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // IE Extension that can be called on any RenderObject.  See the implementation for the details.
4818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderBoxModelObject* offsetParent() const;
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void markContainingBlocksForLayout(bool scheduleRelayout = true, RenderObject* newRoot = 0);
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNeedsLayout(bool b, bool markParents = true);
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setChildNeedsLayout(bool b, bool markParents = true);
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNeedsPositionedMovementLayout();
487bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void setPreferredLogicalWidthsDirty(bool, bool markParents = true);
488bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void invalidateContainerPreferredLogicalWidths();
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setNeedsLayoutAndPrefWidthsRecalc()
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setNeedsLayout(true);
493bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        setPreferredLogicalWidthsDirty(true);
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setPositioned(bool b = true)  { m_positioned = b;  }
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setRelPositioned(bool b = true) { m_relPositioned = b; }
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setFloating(bool b = true) { m_floating = b; }
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setInline(bool b = true) { m_inline = b; }
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasBoxDecorations(bool b = true) { m_paintBackground = b; }
501635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setIsText() { m_isText = true; }
502635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setIsBox() { m_isBox = true; }
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setReplaced(bool b = true) { m_replaced = b; }
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasOverflowClip(bool b = true) { m_hasOverflowClip = b; }
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasLayer(bool b = true) { m_hasLayer = b; }
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasTransform(bool b = true) { m_hasTransform = b; }
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasReflection(bool b = true) { m_hasReflection = b; }
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void scheduleRelayout();
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void updateFillImages(const FillLayer*, const FillLayer*);
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void updateImage(StyleImage*, StyleImage*);
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void paint(PaintInfo&, int tx, int ty);
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Recursive function that computes the size and position of this object and all its descendants.
5178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void layout();
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* This function performs a layout only if one is needed. */
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void layoutIfNeeded() { if (needsLayout()) layout(); }
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // used for element state updates that cannot be fixed with a
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // repaint and do not need a relayout
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void updateFromElement() { }
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
5278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void addDashboardRegions(Vector<DashboardRegionValue>&);
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void collectDashboardRegions(Vector<DashboardRegionValue>&);
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hitTest(const HitTestRequest&, HitTestResult&, const IntPoint&, int tx, int ty, HitTestFilter = HitTestAll);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);
5338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void updateHitTestResult(HitTestResult&, const IntPoint&);
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    VisiblePosition positionForCoordinates(int x, int y);
5368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual VisiblePosition positionForPoint(const IntPoint&);
5378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    VisiblePosition createVisiblePosition(int offset, EAffinity);
5388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    VisiblePosition createVisiblePosition(const Position&);
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void dirtyLinesFromChangedChild(RenderObject*);
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Called to update a style that is allowed to trigger animations.
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Right now this will typically be called only when updating happens from the DOM on explicit elements.
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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).
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setAnimatableStyle(PassRefPtr<RenderStyle>);
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set the style of the object and update the state of the object accordingly.
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void setStyle(PassRefPtr<RenderStyle>);
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Updates only the local style ptr of the object.  Does not update the state of the object,
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and so only should be called when the style is known not to have changed (or from setStyle).
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setStyleInternal(PassRefPtr<RenderStyle>);
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // returns the containing block level element for this element.
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderBlock* containingBlock() const;
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Convert the given local point to absolute coordinates
558635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // FIXME: Temporary. If useTransforms is true, take transforms into account. Eventually localToAbsolute() will always be transform-aware.
5598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    FloatPoint localToAbsolute(FloatPoint localPoint = FloatPoint(), bool fixed = false, bool useTransforms = false) const;
5608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    FloatPoint absoluteToLocal(FloatPoint, bool fixed = false, bool useTransforms = false) const;
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Convert a local quad to absolute coordinates, taking transforms into account.
563635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    FloatQuad localToAbsoluteQuad(const FloatQuad& quad, bool fixed = false) const
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return localToContainerQuad(quad, 0, fixed);
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
567635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Convert a local quad into the coordinate system of container, taking transforms into account.
5688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    FloatQuad localToContainerQuad(const FloatQuad&, RenderBoxModelObject* repaintContainer, bool fixed = false) const;
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
570692e5dbf12901edacf14812a6fae25462920af42Steve Block    // Return the offset from the container() renderer (excluding transforms). In multi-column layout,
571692e5dbf12901edacf14812a6fae25462920af42Steve Block    // different offsets apply at different points, so return the offset that applies to the given point.
572692e5dbf12901edacf14812a6fae25462920af42Steve Block    virtual IntSize offsetFromContainer(RenderObject*, const IntPoint&) const;
573231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Return the offset from an object up the container() chain. Asserts that none of the intermediate objects have transforms.
574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    IntSize offsetFromAncestorContainer(RenderObject*) const;
575635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void absoluteRects(Vector<IntRect>&, int, int) { }
577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // FIXME: useTransforms should go away eventually
578635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect absoluteBoundingBoxRect(bool useTransforms = false);
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Build an array of quads in absolute coords for line boxes
5815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void absoluteQuads(Vector<FloatQuad>&) { }
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
583d0825bca7fe65beaee391d30da42e937db621564Steve Block    void absoluteFocusRingQuads(Vector<FloatQuad>&);
584d0825bca7fe65beaee391d30da42e937db621564Steve Block
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the rect that will be painted if this object is passed as the paintingRoot
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect paintingRootRect(IntRect& topLevelRect);
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual int minPreferredLogicalWidth() const { return 0; }
589bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual int maxPreferredLogicalWidth() const { return 0; }
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderStyle* style() const { return m_style.get(); }
5928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderStyle* firstLineStyle() const { return document()->usesFirstLineRules() ? firstLineStyleSlowCase() : style(); }
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderStyle* style(bool firstLine) const { return firstLine ? firstLineStyle() : style(); }
5940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Used only by Element::pseudoStyleCacheIsInvalid to get a first line style based off of a
5960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // given new style, without accessing the cache.
5970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PassRefPtr<RenderStyle> uncachedFirstLineStyle(RenderStyle*) const;
5980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Anonymous blocks that are part of of a continuation chain will return their inline continuation's outline style instead.
6008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This is typically only relevant when repainting.
6018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual RenderStyle* outlineStyleForRepaint() const { return style(); }
6028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void getTextDecorationColors(int decorations, Color& underline, Color& overline,
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                 Color& linethrough, bool quirksMode = false);
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Return the RenderBox in the container chain which is responsible for painting this object, or 0
607635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // if painting is root-relative. This is the container that should be passed to the 'forRepaint'
608635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // methods.
6098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderBoxModelObject* containerForRepaint() const;
6108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Actually do the repaint of rect r for this object which has been computed in the coordinate space
6118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // of repaintContainer. If repaintContainer is 0, repaint via the view.
6128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void repaintUsingContainer(RenderBoxModelObject* repaintContainer, const IntRect& r, bool immediate = false);
613635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Repaint the entire object.  Called when, e.g., the color of a border changes, or when a border
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // style changes.
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void repaint(bool immediate = false);
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Repaint a specific subrectangle within a given object.  The rect |r| is in the object's coordinate space.
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void repaintRectangle(const IntRect&, bool immediate = false);
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Repaint only if our old bounds and new bounds are different. The caller may pass in newBounds and newOutlineBox if they are known.
622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool repaintAfterLayoutIfNeeded(RenderBoxModelObject* repaintContainer, const IntRect& oldBounds, const IntRect& oldOutlineBox, const IntRect* newBoundsPtr = 0, const IntRect* newOutlineBoxPtr = 0);
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Repaint only if the object moved.
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void repaintDuringLayoutIfMoved(const IntRect& rect);
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Called to repaint a block's floats.
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void repaintOverhangingFloats(bool paintAllDescendants = false);
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool checkForRepaintDuringLayout() const;
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Returns the rect that should be repainted whenever this object changes.  The rect is in the view's
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // coordinate space.  This method deals with outlines and overflow.
634635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect absoluteClippedOverflowRect()
635635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
636635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return clippedOverflowRectForRepaint(0);
637635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
6388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer);
6398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual IntRect rectWithOutlineForRepaint(RenderBoxModelObject* repaintContainer, int outlineWidth);
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Given a rect in the object's coordinate space, compute a rect suitable for repainting
642635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // that rect in view coordinates.
643635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void computeAbsoluteRepaintRect(IntRect& r, bool fixed = false)
644635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
6458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return computeRectForRepaint(0, r, fixed);
646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
647635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Given a rect in the object's coordinate space, compute a rect suitable for repainting
648635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // that rect in the coordinate space of repaintContainer.
6498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect&, bool fixed = false);
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
651692e5dbf12901edacf14812a6fae25462920af42Steve Block    // If multiple-column layout results in applying an offset to the given point, add the same
652692e5dbf12901edacf14812a6fae25462920af42Steve Block    // offset to the given size.
653692e5dbf12901edacf14812a6fae25462920af42Steve Block    virtual void adjustForColumns(IntSize&, const IntPoint&) const { }
654692e5dbf12901edacf14812a6fae25462920af42Steve Block
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual unsigned int length() const { return 1; }
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isFloatingOrPositioned() const { return (isFloating() || isPositioned()); }
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isTransparent() const { return style()->opacity() < 1.0f; }
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float opacity() const { return style()->opacity(); }
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasReflection() const { return m_hasReflection; }
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Applied as a "slop" to dirty rect checks during the outline painting phase's dirty-rect checks.
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int maximalOutlineSize(PaintPhase) const;
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setHasMarkupTruncation(bool b = true) { m_hasMarkupTruncation = b; }
6688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasMarkupTruncation() const { return m_hasMarkupTruncation; }
6698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum SelectionState {
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionNone, // The object is not selected.
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionStart, // The object either contains the start of a selection run or is the start of a run
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionInside, // The object is fully encompassed by a selection run
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionEnd, // The object either contains the end of a selection run or is the end of a run
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SelectionBoth // The object contains an entire run or is the sole selected object in that run
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The current selection state for an object.  For blocks, the state refers to the state of the leaf
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // descendants (as described above in the SelectionState enum declaration).
6808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    SelectionState selectionState() const { return static_cast<SelectionState>(m_selectionState);; }
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Sets the selection state for an object.
6838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void setSelectionState(SelectionState state) { m_selectionState = state; }
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // A single rectangle that encompasses all of the selected objects within this object.  Used to determine the tightest
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // possible bounding box for the selection.
6878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    IntRect selectionRect(bool clipToVisibleContent = true) { return selectionRectForRepaint(0, clipToVisibleContent); }
6888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual IntRect selectionRectForRepaint(RenderBoxModelObject* /*repaintContainer*/, bool /*clipToVisibleContent*/ = true) { return IntRect(); }
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Whether or not an object can be part of the leaf elements of the selection.
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool canBeSelectionLeaf() const { return false; }
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Whether or not a block has selected children.
6948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasSelectedChildren() const { return m_selectionState != SelectionNone; }
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Obtains the selection colors that should be used when painting a selection.
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color selectionBackgroundColor() const;
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color selectionForegroundColor() const;
699f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Color selectionEmphasisMarkColor() const;
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Whether or not a given block needs to paint selection gaps.
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool shouldPaintSelectionGaps() const { return false; }
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
704231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(DRAG_SUPPORT)
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* draggableNode(bool dhtmlOK, bool uaOK, int x, int y, bool& dhtmlWillDrag) const;
706231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /**
709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project     * Returns the local coordinates of the caret within this render object.
710635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project     * @param caretOffset zero-based offset determining position within the render object.
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * @param extraWidthToEndOfLine optional out arg to give extra width to end of line -
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * useful for character range rect computations
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     */
714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual IntRect localCaretRect(InlineBox*, int caretOffset, int* extraWidthToEndOfLine = 0);
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
716bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool isMarginBeforeQuirk() const { return m_marginBeforeQuirk; }
717bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool isMarginAfterQuirk() const { return m_marginAfterQuirk; }
718bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void setMarginBeforeQuirk(bool b = true) { m_marginBeforeQuirk = b; }
719bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void setMarginAfterQuirk(bool b = true) { m_marginAfterQuirk = b; }
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // When performing a global document tear-down, the renderer of the document is cleared.  We use this
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as a hook to detect the case of document destruction and don't waste time doing unnecessary work.
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool documentBeingDestroyed() const;
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void destroy();
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Virtual function helpers for CSS3 Flexible Box Layout
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isFlexibleBox() const { return false; }
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isFlexingChildren() const { return false; }
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isStretchingChildren() const { return false; }
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int caretMinOffset() const;
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int caretMaxOffset() const;
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual unsigned caretMaxRenderedOffset() const;
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int previousOffset(int current) const;
7378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual int previousOffsetForBackwardDeletion(int current) const;
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int nextOffset(int current) const;
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
740635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void imageChanged(CachedImage*, const IntRect* = 0);
741635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void imageChanged(WrappedImagePtr, const IntRect* = 0) { }
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool willRenderImage(CachedImage*);
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void selectionStartEnd(int& spos, int& epos) const;
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasOverrideSize() const { return m_hasOverrideSize; }
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setHasOverrideSize(bool b) { m_hasOverrideSize = b; }
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void remove() { if (parent()) parent()->removeChild(this); }
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationController* animation() const;
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
753635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool visibleToHitTesting() const { return style()->visibility() == VISIBLE && style()->pointerEvents() != PE_NONE; }
7548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
7558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Map points and quads through elements, potentially via 3d transforms. You should never need to call these directly; use
7568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // localToAbsolute/absoluteToLocal methods instead.
7578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&) const;
7588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState&) const;
7598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
7605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool shouldUseTransformFromContainer(const RenderObject* container) const;
7615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    void getTransformFromContainer(const RenderObject* container, const IntSize& offsetInContainer, TransformationMatrix&) const;
762635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
763d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual void addFocusRingRects(Vector<IntRect>&, int /*tx*/, int /*ty*/) { };
764635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
765635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect absoluteOutlineBounds() const
766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
767635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return outlineBoundsForRepaint(0);
768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
769635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected:
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overrides should call the superclass at the end
7728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overrides should call the superclass at the start
7748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
776a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void paintFocusRing(GraphicsContext*, int tx, int ty, RenderStyle*);
777dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void paintOutline(GraphicsContext*, int tx, int ty, int w, int h);
778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void addPDFURLRect(GraphicsContext*, const IntRect&);
779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual IntRect viewRect() const;
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void adjustRectForOutlineAndShadow(IntRect&) const;
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void arenaDelete(RenderArena*, void* objectBase);
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* /*cachedOffsetToRepaintContainer*/ = 0) const { return IntRect(); }
787635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    class LayoutRepainter {
7898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    public:
7908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        LayoutRepainter(RenderObject& object, bool checkForRepaint, const IntRect* oldBounds = 0)
7918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            : m_object(object)
7928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            , m_repaintContainer(0)
7938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            , m_checkForRepaint(checkForRepaint)
7948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        {
7958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (m_checkForRepaint) {
7968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_repaintContainer = m_object.containerForRepaint();
7978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_oldBounds = oldBounds ? *oldBounds : m_object.clippedOverflowRectForRepaint(m_repaintContainer);
7988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                m_oldOutlineBox = m_object.outlineBoundsForRepaint(m_repaintContainer);
7998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
8008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
8018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Return true if it repainted.
8038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool repaintAfterLayout()
8048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        {
8058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return m_checkForRepaint ? m_object.repaintAfterLayoutIfNeeded(m_repaintContainer, m_oldBounds, m_oldOutlineBox) : false;
8068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
8078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool checkForRepaint() const { return m_checkForRepaint; }
8098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    private:
8118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RenderObject& m_object;
8128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RenderBoxModelObject* m_repaintContainer;
8138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        IntRect m_oldBounds;
8148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        IntRect m_oldOutlineBox;
8158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool m_checkForRepaint;
8168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    };
8178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
8198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderStyle* firstLineStyleSlowCase() const;
8208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    StyleDifference adjustStyleDifference(StyleDifference, unsigned contextSensitiveProperties) const;
821f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
822f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Color selectionColor(int colorProperty) const;
8238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<RenderStyle> m_style;
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* m_node;
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* m_parent;
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* m_previous;
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* m_next;
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasAXObject;
834635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_setNeedsLayoutForbidden : 1;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // 32 bits have been used here. THERE ARE NO FREE BITS AVAILABLE.
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_needsLayout               : 1;
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_needsPositionedMovementLayout :1;
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_normalChildNeedsLayout    : 1;
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_posChildNeedsLayout       : 1;
842bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool m_preferredLogicalWidthsDirty           : 1;
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_floating                  : 1;
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_positioned                : 1;
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_relPositioned             : 1;
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_paintBackground           : 1; // if the box has something to paint in the
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                          // background painting phase (background, border, etc)
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_isAnonymous               : 1;
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_isText                    : 1;
852635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_isBox                     : 1;
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_inline                    : 1;
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_replaced                  : 1;
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_isDragging                : 1;
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasLayer                  : 1;
858e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool m_hasOverflowClip           : 1; // Set in the case of overflow:auto/scroll/hidden
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasTransform              : 1;
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasReflection             : 1;
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasOverrideSize           : 1;
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasCounterNodeMap         : 1;
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_everHadLayout             : 1;
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
8698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // These bitfields are moved here from subclasses to pack them together
8708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // from RenderBlock
8718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_childrenInline : 1;
872bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool m_marginBeforeQuirk : 1;
873bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool m_marginAfterQuirk : 1;
8748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_hasMarkupTruncation : 1;
8758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    unsigned m_selectionState : 3; // SelectionState
8768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_hasColumns : 1;
8778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // from RenderTableCell
8798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_cellWidthChanged : 1;
8808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
8818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprivate:
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Store state between styleWillChange and styleDidChange
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static bool s_affectsParentBlock;
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline bool RenderObject::documentBeingDestroyed() const
8878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
8888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return !document()->renderer();
8898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
8908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
891a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochinline bool RenderObject::isBeforeContent() const
892a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
893a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (style()->styleType() != BEFORE)
894a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return false;
895a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // Text nodes don't have their own styles, so ignore the style on a text node.
896a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (isText() && !isBR())
897a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return false;
898a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return true;
899a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
900a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
901231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline bool RenderObject::isAfterContent() const
902231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
903231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (style()->styleType() != AFTER)
904231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
905231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Text nodes don't have their own styles, so ignore the style on a text node.
906231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (isText() && !isBR())
907231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
908231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return true;
909231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
910231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
9118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline void RenderObject::setNeedsLayout(bool b, bool markParents)
9128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool alreadyNeededLayout = m_needsLayout;
9148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_needsLayout = b;
9158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (b) {
9168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        ASSERT(!isSetNeedsLayoutForbidden());
9178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!alreadyNeededLayout) {
9188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (markParents)
9198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                markContainingBlocksForLayout();
9208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (hasLayer())
9218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                setLayerNeedsFullRepaint();
9228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
9238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    } else {
9248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_everHadLayout = true;
9258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_posChildNeedsLayout = false;
9268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_normalChildNeedsLayout = false;
9278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_needsPositionedMovementLayout = false;
9288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
9298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
9308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline void RenderObject::setChildNeedsLayout(bool b, bool markParents)
9328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool alreadyNeededLayout = m_normalChildNeedsLayout;
9348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_normalChildNeedsLayout = b;
9358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (b) {
9368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        ASSERT(!isSetNeedsLayoutForbidden());
9378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!alreadyNeededLayout && markParents)
9388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            markContainingBlocksForLayout();
9398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    } else {
9408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_posChildNeedsLayout = false;
9418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_normalChildNeedsLayout = false;
9428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_needsPositionedMovementLayout = false;
9438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
9448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
9458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline void RenderObject::setNeedsPositionedMovementLayout()
9478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool alreadyNeededLayout = needsLayout();
9498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_needsPositionedMovementLayout = true;
9508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (!alreadyNeededLayout) {
9518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        markContainingBlocksForLayout();
9528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (hasLayer())
9538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            setLayerNeedsFullRepaint();
9548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
9558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
9568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline bool objectIsRelayoutBoundary(const RenderObject *obj)
9588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // FIXME: In future it may be possible to broaden this condition in order to improve performance.
9608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Table cells are excluded because even when their CSS height is fixed, their height()
9618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // may depend on their contents.
9628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return obj->isTextControl()
9638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        || (obj->hasOverflowClip() && !obj->style()->width().isIntrinsicOrAuto() && !obj->style()->height().isIntrinsicOrAuto() && !obj->style()->height().isPercent() && !obj->isTableCell())
9648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(SVG)
9658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian           || obj->isSVGRoot()
9668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
9678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian           ;
9688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
9698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianinline void RenderObject::markContainingBlocksForLayout(bool scheduleRelayout, RenderObject* newRoot)
9718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
9728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    ASSERT(!scheduleRelayout || !newRoot);
9738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderObject* o = container();
9758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderObject* last = this;
9768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
9778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    while (o) {
9788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Don't mark the outermost object of an unrooted subtree. That object will be
9798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // marked when the subtree is added to the document.
9808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RenderObject* container = o->container();
9818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!container && !o->isRenderView())
9828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
9838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!last->isText() && (last->style()->position() == FixedPosition || last->style()->position() == AbsolutePosition)) {
9848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if ((last->style()->top().isAuto() && last->style()->bottom().isAuto()) || last->style()->top().isStatic()) {
9858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                RenderObject* parent = last->parent();
9868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!parent->normalChildNeedsLayout()) {
9878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    parent->setChildNeedsLayout(true, false);
9888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    if (parent != newRoot)
9898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                        parent->markContainingBlocksForLayout(scheduleRelayout, newRoot);
9908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                }
9918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
9928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (o->m_posChildNeedsLayout)
9938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return;
9948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            o->m_posChildNeedsLayout = true;
9958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            ASSERT(!o->isSetNeedsLayoutForbidden());
9968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else {
9978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (o->m_normalChildNeedsLayout)
9988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return;
9998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            o->m_normalChildNeedsLayout = true;
10008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            ASSERT(!o->isSetNeedsLayoutForbidden());
10018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
10028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (o == newRoot)
10048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
10058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        last = o;
10078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (scheduleRelayout && objectIsRelayoutBoundary(last))
10088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            break;
10098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        o = container;
10108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
10118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (scheduleRelayout)
10138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        last->scheduleRelayout();
10148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochinline void makeMatrixRenderable(TransformationMatrix& matrix, bool has3DRendering)
10178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
10188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if !ENABLE(3D_RENDERING)
10190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    UNUSED_PARAM(has3DRendering);
10208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    matrix.makeAffine();
10218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else
10220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!has3DRendering)
10230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        matrix.makeAffine();
10248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
10258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1027231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline int adjustForAbsoluteZoom(int value, RenderObject* renderer)
1028231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
102968513a70bcd92384395513322f1b801e7bf9c729Steve Block    return adjustForAbsoluteZoom(value, renderer->style());
1030231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1031231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1032231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline FloatPoint adjustFloatPointForAbsoluteZoom(const FloatPoint& point, RenderObject* renderer)
1033231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1034231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // The result here is in floats, so we don't need the truncation hack from the integer version above.
1035231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    float zoomFactor = renderer->style()->effectiveZoom();
1036231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (zoomFactor == 1)
1037231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return point;
1038231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return FloatPoint(point.x() / zoomFactor, point.y() / zoomFactor);
1039231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1040231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1041231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline void adjustFloatQuadForAbsoluteZoom(FloatQuad& quad, RenderObject* renderer)
1042231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1043231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    quad.setP1(adjustFloatPointForAbsoluteZoom(quad.p1(), renderer));
1044231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    quad.setP2(adjustFloatPointForAbsoluteZoom(quad.p2(), renderer));
1045231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    quad.setP3(adjustFloatPointForAbsoluteZoom(quad.p3(), renderer));
1046231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    quad.setP4(adjustFloatPointForAbsoluteZoom(quad.p4(), renderer));
1047231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1048231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1049f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline void adjustFloatRectForAbsoluteZoom(FloatRect& rect, RenderObject* renderer)
1050f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
1051f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RenderStyle* style = renderer->style();
1052f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    rect.setX(adjustFloatForAbsoluteZoom(rect.x(), style));
1053f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    rect.setY(adjustFloatForAbsoluteZoom(rect.y(), style));
1054f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    rect.setWidth(adjustFloatForAbsoluteZoom(rect.width(), style));
1055f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    rect.setHeight(adjustFloatForAbsoluteZoom(rect.height(), style));
1056f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
1057f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Outside the WebCore namespace for ease of invocation from gdb.
10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid showTree(const WebCore::RenderObject*);
1063643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1);
1064643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// We don't make object2 an optional parameter so that showRenderTree
1065643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// can be called from gdb easily.
1066643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid showRenderTree(const WebCore::RenderObject* object1, const WebCore::RenderObject* object2);
10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // RenderObject_h
1070