blob: 600626800d987aff8df1bf713f691e0c6f1dc532 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NGPaintFragmentTraversal_h
#define NGPaintFragmentTraversal_h
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
class LayoutObject;
class NGPaintFragment;
// Used for return value of traversing fragment tree.
struct CORE_EXPORT NGPaintFragmentWithContainerOffset {
DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
NGPaintFragment* fragment;
// Offset relative to container fragment
NGPhysicalOffset container_offset;
};
// Represents an NGPaintFragment by its parent and its index in the parent's
// |Children()| vector.
struct CORE_EXPORT NGPaintFragmentTraversalContext {
STACK_ALLOCATED();
static NGPaintFragmentTraversalContext Create(const NGPaintFragment*);
bool IsNull() const { return !parent; }
const NGPaintFragment* GetFragment() const;
bool operator==(const NGPaintFragmentTraversalContext& other) const {
return parent == other.parent && index == other.index;
}
const NGPaintFragment* parent = nullptr;
unsigned index = 0;
};
// Utility class for traversing the paint fragment tree.
class CORE_EXPORT NGPaintFragmentTraversal {
STATIC_ONLY(NGPaintFragmentTraversal);
public:
// Returns descendants without paint layer in preorder.
static Vector<NGPaintFragmentWithContainerOffset> DescendantsOf(
const NGPaintFragment&);
// Returns inline descendants in preorder.
static Vector<NGPaintFragmentWithContainerOffset> InlineDescendantsOf(
const NGPaintFragment&);
static Vector<NGPaintFragmentWithContainerOffset> SelfFragmentsOf(
const NGPaintFragment&,
const LayoutObject* target);
// Returns the line box paint fragment of |line|. |line| itself must be the
// paint fragment of a line box.
static NGPaintFragment* PreviousLineOf(const NGPaintFragment& line);
// Returns the previous/next inline leaf fragment (text or atomic inline)of
// the passed fragment, which itself must be inline.
static NGPaintFragmentTraversalContext PreviousInlineLeafOf(
const NGPaintFragmentTraversalContext&);
static NGPaintFragmentTraversalContext NextInlineLeafOf(
const NGPaintFragmentTraversalContext&);
// Variants of the above two skipping line break fragments.
static NGPaintFragmentTraversalContext PreviousInlineLeafOfIgnoringLineBreak(
const NGPaintFragmentTraversalContext&);
static NGPaintFragmentTraversalContext NextInlineLeafOfIgnoringLineBreak(
const NGPaintFragmentTraversalContext&);
};
} // namespace blink
#endif // NGPaintFragmentTraversal_h