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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/public/platform/web_font.h"
#include "cc/paint/paint_flags.h"
#include "third_party/blink/public/platform/web_font_description.h"
#include "third_party/blink/public/platform/web_text_run.h"
#include "third_party/blink/renderer/platform/fonts/font.h"
#include "third_party/blink/renderer/platform/fonts/font_cache.h"
#include "third_party/blink/renderer/platform/fonts/font_description.h"
#include "third_party/blink/renderer/platform/fonts/plain_text_painter.h"
#include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h"
#include "third_party/blink/renderer/platform/text/text_run.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
namespace blink {
WebFont* WebFont::Create(const WebFontDescription& description) {
return new WebFont(description);
}
class WebFont::Impl final : public GarbageCollected<WebFont::Impl> {
public:
explicit Impl(const WebFontDescription& description)
: font_(MakeGarbageCollected<Font>(description)) {}
void Trace(Visitor* visitor) const { visitor->Trace(font_); }
const Font* GetFont() const { return font_; }
private:
Member<const Font> font_;
};
WebFont::WebFont(const WebFontDescription& description)
: private_(MakeGarbageCollected<Impl>(description)) {}
WebFont::~WebFont() = default;
WebFontDescription WebFont::GetFontDescription() const {
return WebFontDescription(private_->GetFont()->GetFontDescription());
}
static inline const SimpleFontData* GetFontData(const Font* font) {
const SimpleFontData* font_data = font->PrimaryFont();
DCHECK(font_data);
return font_data;
}
int WebFont::Ascent() const {
const SimpleFontData* font_data = GetFontData(private_->GetFont());
return font_data ? font_data->GetFontMetrics().Ascent() : 0;
}
int WebFont::Descent() const {
const SimpleFontData* font_data = GetFontData(private_->GetFont());
return font_data ? font_data->GetFontMetrics().Descent() : 0;
}
int WebFont::Height() const {
const SimpleFontData* font_data = GetFontData(private_->GetFont());
return font_data ? font_data->GetFontMetrics().Height() : 0;
}
int WebFont::LineSpacing() const {
const SimpleFontData* font_data = GetFontData(private_->GetFont());
return font_data ? font_data->GetFontMetrics().LineSpacing() : 0;
}
float WebFont::XHeight() const {
const SimpleFontData* font_data = private_->GetFont()->PrimaryFont();
DCHECK(font_data);
return font_data ? font_data->GetFontMetrics().XHeight() : 0;
}
void WebFont::DrawText(cc::PaintCanvas* canvas,
const WebTextRun& run,
const gfx::PointF& left_baseline,
SkColor color) const {
FontCachePurgePreventer font_cache_purge_preventer;
TextRun text_run(run);
cc::PaintFlags flags;
flags.setColor(color);
flags.setAntiAlias(true);
if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
PlainTextPainter::Shared().DrawWithoutBidi(text_run, *private_->GetFont(),
*canvas, left_baseline, flags);
return;
}
private_->GetFont()->DeprecatedDrawText(canvas, text_run, left_baseline,
flags);
}
int WebFont::CalculateWidth(const WebTextRun& run) const {
if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
return PlainTextPainter::Shared().ComputeInlineSizeWithoutBidi(
run, *private_->GetFont());
}
return private_->GetFont()->DeprecatedWidth(run, nullptr);
}
int WebFont::OffsetForPosition(const WebTextRun& run, float position) const {
if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
return PlainTextPainter::Shared().OffsetForPositionWithoutBidi(
run, *private_->GetFont(), position, kIncludePartialGlyphs,
BreakGlyphsOption(false));
}
return private_->GetFont()->DeprecatedOffsetForPosition(
run, position, kIncludePartialGlyphs, BreakGlyphsOption(false));
}
gfx::RectF WebFont::SelectionRectForText(const WebTextRun& run,
const gfx::PointF& left_baseline,
int height,
int from,
int to) const {
if (RuntimeEnabledFeatures::PlainTextPainterEnabled()) {
return PlainTextPainter::Shared().SelectionRectForTextWithoutBidi(
run, from, to == -1 ? run.text.length() : to, *private_->GetFont(),
left_baseline, height);
}
return private_->GetFont()->DeprecatedSelectionRectForText(run, left_baseline,
height, from, to);
}
} // namespace blink
|