1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
// 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_SHAPING_SHAPE_RESULT_BUFFER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_SHAPING_SHAPE_RESULT_BUFFER_H_
#include "base/memory/scoped_refptr.h"
#include "third_party/blink/renderer/platform/fonts/shaping/shape_result.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/wtf/allocator.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
struct CharacterRange;
class FontDescription;
struct GlyphData;
class ShapeResultBloberizer;
class TextRun;
class PLATFORM_EXPORT ShapeResultBuffer {
WTF_MAKE_NONCOPYABLE(ShapeResultBuffer);
STACK_ALLOCATED();
public:
ShapeResultBuffer() : has_vertical_offsets_(false) {}
void AppendResult(scoped_refptr<const ShapeResult> result) {
has_vertical_offsets_ |= result->HasVerticalOffsets();
results_.push_back(std::move(result));
}
bool HasVerticalOffsets() const { return has_vertical_offsets_; }
int OffsetForPosition(const TextRun&,
float target_x,
bool include_partial_glyphs) const;
CharacterRange GetCharacterRange(TextDirection,
float total_width,
unsigned from,
unsigned to) const;
Vector<CharacterRange> IndividualCharacterRanges(TextDirection,
float total_width) const;
static CharacterRange GetCharacterRange(scoped_refptr<const ShapeResult>,
TextDirection,
float total_width,
unsigned from,
unsigned to);
Vector<ShapeResult::RunFontData> GetRunFontData() const;
GlyphData EmphasisMarkGlyphData(const FontDescription&) const;
private:
friend class ShapeResultBloberizer;
static CharacterRange GetCharacterRangeInternal(
const Vector<scoped_refptr<const ShapeResult>, 64>&,
TextDirection,
float total_width,
unsigned from,
unsigned to);
static void AddRunInfoRanges(const ShapeResult::RunInfo&,
float offset,
Vector<CharacterRange>&);
// Empirically, cases where we get more than 50 ShapeResults are extremely
// rare.
Vector<scoped_refptr<const ShapeResult>, 64> results_;
bool has_vertical_offsets_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_SHAPING_SHAPE_RESULT_BUFFER_H_
|