/* * Copyright (C) 1999 Lars Knoll ([email protected]) * (C) 1999 Antti Koivisto ([email protected]) * Copyright (C) 2003, 2006, 2007, 2009 Apple Inc. All rights reserved. * Copyright (C) 2010 Google Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_BOX_MODEL_OBJECT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_BOX_MODEL_OBJECT_H_ #include "base/notreached.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/background_bleed_avoidance.h" #include "third_party/blink/renderer/core/layout/content_change_type.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/platform/text/writing_mode_utils.h" namespace blink { class PaintLayer; class PaintLayerScrollableArea; struct LogicalRect; enum PaintLayerType { … }; // This class is the base class for all CSS objects. // // All CSS objects follow the box model object. See THE BOX MODEL section in // LayoutBox for more information. // // This class actually doesn't have the box model but it exposes some common // functions or concepts that sub-classes can extend upon. For example, there // are accessors for margins, borders, paddings and borderBoundingBox(). // // The reason for this partial implementation is that the 2 classes inheriting // from it (LayoutBox and LayoutInline) have different requirements but need to // have a PaintLayer. For a full implementation of the box model, see LayoutBox. // // An important member of this class is PaintLayer, which is stored in a rare- // data pattern (see: Layer()). PaintLayers are instantiated for several reasons // based on the return value of layerTypeRequired(). // Interestingly, most SVG objects inherit from LayoutSVGModelObject and thus // can't have a PaintLayer. This is an unfortunate artifact of our // design as it limits code sharing and prevents hardware accelerating SVG // (the current design require a PaintLayer for compositing). // // // ***** COORDINATE SYSTEMS ***** // // In order to fully understand LayoutBoxModelObject and the inherited classes, // we need to introduce the concept of coordinate systems. // There are 4 coordinate systems: // - physical coordinates: it is the coordinate system used for painting and // correspond to physical direction as seen on the physical display (screen, // printed page). In CSS, 'top', 'right', 'bottom', 'left' are all in physical // coordinates. The code matches this convention too. // // - logical coordinates: this is the coordinate system used for layout. It is // determined by 'writing-mode' and 'direction'. Any property using 'before', // 'after', 'start' or 'end' is in logical coordinates. Those are also named // respectively 'logical top', 'logical bottom', 'logical left' and // 'logical right'. // // Example with writing-mode: vertical-rl; direction: ltr; // // 'top' / 'start' side // // block-flow direction // <------------------------------------ | // ------------------------------------- | // | c | s | | // 'left' | o | o | | inline 'right' // / | n | m | | direction / // 'after' | t | e | | 'before' // side | e | | | side // | n | | | // | t | | | // ------------------------------------- v // // 'bottom' / 'end' side // // See https://drafts.csswg.org/css-writing-modes-3/#text-flow for some // extra details. // // - physical coordinates with flipped block-flow direction: those are physical // coordinates but we flipped the block direction. Almost all geometries // in box layout use this coordinate space, except those having explicit // "Logical" or "Physical" prefix in their names, or the name implies logical // (e.g. InlineStart, BlockEnd) or physical (e.g. Top, Left), or the return // type is PhysicalRect. // // - logical coordinates without flipping inline direction: those are "logical // block coordinates", without considering text direction. Examples are // "LogicalLeft" and "LogicalRight". // // For more information, see the following doc about coordinate spaces: // https://chromium.googlesource.com/chromium/src.git/+/main/third_party/blink/renderer/core/layout/README.md#coordinate-spaces class CORE_EXPORT LayoutBoxModelObject : public LayoutObject { … }; template <> struct DowncastTraits<LayoutBoxModelObject> { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_BOX_MODEL_OBJECT_H_