paragraph_impl_txt.cc 2.7 KB
Newer Older
1 2 3 4 5 6
// Copyright 2015 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.

#include "flutter/lib/ui/text/paragraph_impl_txt.h"

7
#include "flutter/common/task_runners.h"
8 9
#include "flutter/lib/ui/text/paragraph.h"
#include "flutter/lib/ui/text/paragraph_impl.h"
10 11
#include "lib/fxl/logging.h"
#include "lib/fxl/tasks/task_runner.h"
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
#include "lib/tonic/converter/dart_converter.h"
#include "third_party/skia/include/core/SkPoint.h"

using tonic::ToDart;

namespace blink {

ParagraphImplTxt::ParagraphImplTxt(std::unique_ptr<txt::Paragraph> paragraph)
    : m_paragraph(std::move(paragraph)) {}

ParagraphImplTxt::~ParagraphImplTxt() {}

double ParagraphImplTxt::width() {
  return m_paragraph->GetMaxWidth();
}

double ParagraphImplTxt::height() {
  return m_paragraph->GetHeight();
}

double ParagraphImplTxt::minIntrinsicWidth() {
  return m_paragraph->GetMinIntrinsicWidth();
}

double ParagraphImplTxt::maxIntrinsicWidth() {
  return m_paragraph->GetMaxIntrinsicWidth();
}

double ParagraphImplTxt::alphabeticBaseline() {
  return m_paragraph->GetAlphabeticBaseline();
}

double ParagraphImplTxt::ideographicBaseline() {
  return m_paragraph->GetIdeographicBaseline();
}

bool ParagraphImplTxt::didExceedMaxLines() {
  return m_paragraph->DidExceedMaxLines();
}

void ParagraphImplTxt::layout(double width) {
  m_width = width;
  m_paragraph->Layout(width);
}

void ParagraphImplTxt::paint(Canvas* canvas, double x, double y) {
  SkCanvas* sk_canvas = canvas->canvas();
  if (!sk_canvas)
    return;
  m_paragraph->Paint(sk_canvas, x, y);
}

std::vector<TextBox> ParagraphImplTxt::getRectsForRange(unsigned start,
                                                        unsigned end) {
  std::vector<TextBox> result;
67 68 69 70 71
  std::vector<txt::Paragraph::TextBox> boxes =
      m_paragraph->GetRectsForRange(start, end);
  for (const txt::Paragraph::TextBox& box : boxes) {
    result.emplace_back(box.rect,
                        static_cast<blink::TextDirection>(box.direction));
72 73 74 75 76
  }
  return result;
}

Dart_Handle ParagraphImplTxt::getPositionForOffset(double dx, double dy) {
77
  Dart_Handle result = Dart_NewListOf(Dart_CoreType_Int, 2);
78
  txt::Paragraph::PositionWithAffinity pos =
79
      m_paragraph->GetGlyphPositionAtCoordinate(dx, dy);
80 81
  Dart_ListSetAt(result, 0, ToDart(pos.position));
  Dart_ListSetAt(result, 1, ToDart(static_cast<int>(pos.affinity)));
82 83 84 85
  return result;
}

Dart_Handle ParagraphImplTxt::getWordBoundary(unsigned offset) {
86
  txt::Paragraph::Range<size_t> point = m_paragraph->GetWordBoundary(offset);
87
  Dart_Handle result = Dart_NewListOf(Dart_CoreType_Int, 2);
J
Jason Simmons 已提交
88 89
  Dart_ListSetAt(result, 0, ToDart(point.start));
  Dart_ListSetAt(result, 1, ToDart(point.end));
90 91 92 93
  return result;
}

}  // namespace blink