78 const std::vector<txt::Paragraph::TextBox>& boxes) {
83 tonic::Float32List result(
84 Dart_NewTypedData(Dart_TypedData_kFloat32, boxes.size() * 5));
85 uint64_t position = 0;
86 for (uint64_t
i = 0;
i < boxes.size();
i++) {
88 result[position++] = box.
rect.fLeft;
89 result[position++] = box.
rect.fTop;
90 result[position++] = box.
rect.fRight;
91 result[position++] = box.
rect.fBottom;
92 result[position++] =
static_cast<float>(box.
direction);
124 Dart_Handle constructor,
125 const skia::textlayout::Paragraph::GlyphInfo& glyphInfo) {
126 std::array<Dart_Handle, 7> arguments = {
127 Dart_NewDouble(glyphInfo.fGraphemeLayoutBounds.fLeft),
128 Dart_NewDouble(glyphInfo.fGraphemeLayoutBounds.fTop),
129 Dart_NewDouble(glyphInfo.fGraphemeLayoutBounds.fRight),
130 Dart_NewDouble(glyphInfo.fGraphemeLayoutBounds.fBottom),
131 Dart_NewInteger(glyphInfo.fGraphemeClusterTextRange.start),
132 Dart_NewInteger(glyphInfo.fGraphemeClusterTextRange.end),
133 Dart_NewBoolean(glyphInfo.fDirection ==
134 skia::textlayout::TextDirection::kLtr),
136 return Dart_InvokeClosure(constructor, arguments.size(), arguments.data());
151Dart_Handle Paragraph::getClosestGlyphInfo(
double dx,
153 Dart_Handle constructor)
const {
154 skia::textlayout::Paragraph::GlyphInfo glyphInfo;
156 m_paragraph_->GetClosestGlyphInfoAtCoordinate(dx, dy, &glyphInfo);
172Dart_Handle Paragraph::getLineBoundary(
unsigned utf16Offset) {
173 std::vector<txt::LineMetrics> metrics = m_paragraph_->GetLineMetrics();
177 if (utf16Offset >= line.start_index && utf16Offset <= line.end_index) {
178 line_start = line.start_index;
179 line_end = line.end_index;
183 std::vector<int> result = {line_start, line_end};
187tonic::Float64List Paragraph::computeLineMetrics()
const {
188 std::vector<txt::LineMetrics> metrics = m_paragraph_->GetLineMetrics();
193 tonic::Float64List result(
194 Dart_NewTypedData(Dart_TypedData_kFloat64, metrics.size() * 9));
195 uint64_t position = 0;
196 for (uint64_t
i = 0;
i < metrics.size();
i++) {
198 result[position++] =
static_cast<double>(line.
hard_break);
199 result[position++] = line.
ascent;
200 result[position++] = line.
descent;
206 result[position++] = line.
width;
207 result[position++] = line.
left;
209 result[position++] =
static_cast<double>(line.
line_number);
215Dart_Handle Paragraph::getLineMetricsAt(
int lineNumber,
216 Dart_Handle constructor)
const {
217 skia::textlayout::LineMetrics line;
218 const bool found = m_paragraph_->GetLineMetricsAt(lineNumber, &line);
222 std::array<Dart_Handle, 9> arguments = {
223 Dart_NewBoolean(line.fHardBreak),
224 Dart_NewDouble(line.fAscent),
225 Dart_NewDouble(line.fDescent),
226 Dart_NewDouble(line.fUnscaledAscent),
230 Dart_NewDouble(round(line.fAscent + line.fDescent)),
231 Dart_NewDouble(line.fWidth),
232 Dart_NewDouble(line.fLeft),
233 Dart_NewDouble(line.fBaseline),
234 Dart_NewInteger(line.fLineNumber),
238 Dart_InvokeClosure(constructor, arguments.size(), arguments.data());