blob: de99f9c1313c89b8f8ae008dd86d3b703640e734 [file] [log] [blame]
// Copyright 2016 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 NGPhysicalTextFragment_h
#define NGPhysicalTextFragment_h
#include "core/CoreExport.h"
#include "core/layout/ng/inline/ng_text_end_effect.h"
#include "core/layout/ng/ng_physical_fragment.h"
#include "platform/fonts/NGTextFragmentPaintInfo.h"
#include "platform/fonts/shaping/ShapeResult.h"
#include "platform/wtf/text/StringView.h"
#include "platform/wtf/text/WTFString.h"
namespace blink {
class ShapeResult;
struct NGPhysicalOffsetRect;
// In CSS Writing Modes Levle 4, line orientation for layout and line
// orientation for paint are not always the same.
//
// Specifically, 'sideways-lr' typesets as if lines are horizontal flow, but
// rotates counterclockwise.
enum class NGLineOrientation {
// Lines are horizontal.
kHorizontal,
// Lines are vertical, rotated clockwise. Inside of the line, it may be
// typeset using vertical characteristics, horizontal characteristics, or
// mixed. Lines flow left to right, or right to left.
kClockWiseVertical,
// Lines are vertical, rotated counterclockwise. Inside of the line is typeset
// as if horizontal flow. Lines flow left to right.
kCounterClockWiseVertical
// When adding new values, ensure NGPhysicalTextFragment has enough bits.
};
class CORE_EXPORT NGPhysicalTextFragment final : public NGPhysicalFragment {
public:
NGPhysicalTextFragment(LayoutObject* layout_object,
const ComputedStyle& style,
const String& text,
unsigned item_index,
unsigned start_offset,
unsigned end_offset,
NGPhysicalSize size,
int expansion,
NGLineOrientation line_orientation,
NGTextEndEffect end_effect,
RefPtr<const ShapeResult> shape_result)
: NGPhysicalFragment(layout_object, style, size, kFragmentText),
text_(text),
item_index_(item_index),
start_offset_(start_offset),
end_offset_(end_offset),
shape_result_(shape_result),
expansion_(expansion),
line_orientation_(static_cast<unsigned>(line_orientation)),
end_effect_(static_cast<unsigned>(end_effect)) {}
unsigned Length() const { return end_offset_ - start_offset_; }
StringView Text() const { return StringView(text_, start_offset_, Length()); }
const ShapeResult* TextShapeResult() const { return shape_result_.get(); }
// Deprecating ItemIndex in favor of storing and accessing each component;
// e.g., text, style, ShapeResult, etc. Currently used for CreateBidiRuns and
// tests.
unsigned ItemIndexDeprecated() const { return item_index_; }
// Start/end offset to the text of the block container.
unsigned StartOffset() const { return start_offset_; }
unsigned EndOffset() const { return end_offset_; }
// The amount of expansion for justification.
// Not used in NG paint, only to copy to InlineTextBox::SetExpansion().
// TODO(layout-dev): crbug.com/714962 Remove once fragment painting is enabled
// by default.
int Expansion() const { return expansion_; }
NGLineOrientation LineOrientation() const {
return static_cast<NGLineOrientation>(line_orientation_);
}
bool IsHorizontal() const {
return LineOrientation() == NGLineOrientation::kHorizontal;
}
// The visual bounding box that includes glpyh bounding box and CSS
// properties, in local coordinates.
NGPhysicalOffsetRect LocalVisualRect() const;
NGTextEndEffect EndEffect() const {
return static_cast<NGTextEndEffect>(end_effect_);
}
RefPtr<NGPhysicalFragment> CloneWithoutOffset() const {
return WTF::AdoptRef(new NGPhysicalTextFragment(
layout_object_, Style(), text_, item_index_, start_offset_, end_offset_,
size_, expansion_, LineOrientation(), EndEffect(), shape_result_));
}
NGTextFragmentPaintInfo PaintInfo() const {
return NGTextFragmentPaintInfo{Text(), StartOffset(), EndOffset(),
TextShapeResult()};
}
private:
// The text of NGInlineNode; i.e., of a parent block. The text for this
// fragment is a substring(start_offset_, end_offset_) of this string.
const String& text_;
// Deprecating, ItemIndexDeprecated().
unsigned item_index_;
// Start and end offset of the parent block text.
unsigned start_offset_;
unsigned end_offset_;
RefPtr<const ShapeResult> shape_result_;
int expansion_;
unsigned line_orientation_ : 2; // NGLineOrientation
unsigned end_effect_ : 1; // NGTextEndEffect
};
DEFINE_TYPE_CASTS(NGPhysicalTextFragment,
NGPhysicalFragment,
fragment,
fragment->IsText(),
fragment.IsText());
} // namespace blink
#endif // NGPhysicalTextFragment_h