| Index: tools/SkShaper.cpp
|
| diff --git a/tools/SkShaper.cpp b/tools/SkShaper.cpp
|
| deleted file mode 100644
|
| index 44dd8fc7f1bbf0e72c47ffd2c469885ca045d144..0000000000000000000000000000000000000000
|
| --- a/tools/SkShaper.cpp
|
| +++ /dev/null
|
| @@ -1,126 +0,0 @@
|
| -/*
|
| - * Copyright 2016 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#include <hb-ot.h>
|
| -
|
| -#include "SkShaper.h"
|
| -#include "SkStream.h"
|
| -#include "SkTextBlob.h"
|
| -#include "SkTypeface.h"
|
| -
|
| -static const int FONT_SIZE_SCALE = 512;
|
| -
|
| -namespace {
|
| -struct HBFBlobDel {
|
| - void operator()(hb_blob_t* b) { hb_blob_destroy(b); }
|
| -};
|
| -
|
| -std::unique_ptr<hb_blob_t, HBFBlobDel> stream_to_blob(std::unique_ptr<SkStreamAsset> asset) {
|
| - size_t size = asset->getLength();
|
| - std::unique_ptr<hb_blob_t, HBFBlobDel> blob;
|
| - if (const void* base = asset->getMemoryBase()) {
|
| - blob.reset(hb_blob_create((char*)base, size,
|
| - HB_MEMORY_MODE_READONLY, asset.release(),
|
| - [](void* p) { delete (SkStreamAsset*)p; }));
|
| - } else {
|
| - // SkDebugf("Extra SkStreamAsset copy\n");
|
| - SkAutoMalloc autoMalloc(size);
|
| - asset->read(autoMalloc.get(), size);
|
| - void* ptr = autoMalloc.get();
|
| - blob.reset(hb_blob_create((char*)autoMalloc.release(), size,
|
| - HB_MEMORY_MODE_READONLY, ptr, sk_free));
|
| - }
|
| - SkASSERT(blob);
|
| - hb_blob_make_immutable(blob.get());
|
| - return blob;
|
| -}
|
| -} // namespace
|
| -
|
| -struct SkShaper::Impl {
|
| - struct HBFontDel {
|
| - void operator()(hb_font_t* f) { hb_font_destroy(f); }
|
| - };
|
| - std::unique_ptr<hb_font_t, HBFontDel> fHarfBuzzFont;
|
| - struct HBBufDel {
|
| - void operator()(hb_buffer_t* b) { hb_buffer_destroy(b); }
|
| - };
|
| - std::unique_ptr<hb_buffer_t, HBBufDel> fBuffer;
|
| - sk_sp<SkTypeface> fTypeface;
|
| -};
|
| -
|
| -SkShaper::SkShaper(sk_sp<SkTypeface> tf) : fImpl(new Impl) {
|
| - fImpl->fTypeface = tf ? std::move(tf) : SkTypeface::MakeDefault();
|
| - int index;
|
| - std::unique_ptr<hb_blob_t, HBFBlobDel> blob(
|
| - stream_to_blob(std::unique_ptr<SkStreamAsset>(
|
| - fImpl->fTypeface->openStream(&index))));
|
| - struct HBFaceDel {
|
| - void operator()(hb_face_t* f) { hb_face_destroy(f); }
|
| - };
|
| - std::unique_ptr<hb_face_t, HBFaceDel> face(
|
| - hb_face_create(blob.get(), (unsigned)index));
|
| - SkASSERT(face);
|
| - if (!face) {
|
| - return;
|
| - }
|
| - hb_face_set_index(face.get(), (unsigned)index);
|
| - hb_face_set_upem(face.get(), fImpl->fTypeface->getUnitsPerEm());
|
| -
|
| - fImpl->fHarfBuzzFont.reset(hb_font_create(face.get()));
|
| - SkASSERT(fImpl->fHarfBuzzFont);
|
| - hb_font_set_scale(fImpl->fHarfBuzzFont.get(), FONT_SIZE_SCALE, FONT_SIZE_SCALE);
|
| - hb_ot_font_set_funcs(fImpl->fHarfBuzzFont.get());
|
| -
|
| - fImpl->fBuffer.reset(hb_buffer_create());
|
| -}
|
| -
|
| -SkShaper::~SkShaper() {}
|
| -
|
| -bool SkShaper::good() const { return fImpl->fHarfBuzzFont != nullptr; }
|
| -
|
| -SkScalar SkShaper::shape(SkTextBlobBuilder* builder,
|
| - const SkPaint& srcPaint,
|
| - const char* utf8text,
|
| - size_t textBytes,
|
| - SkPoint point) const {
|
| - SkPaint paint(srcPaint);
|
| - paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
|
| - paint.setTypeface(fImpl->fTypeface);
|
| -
|
| - SkASSERT(builder);
|
| - hb_buffer_t* buffer = fImpl->fBuffer.get();
|
| - hb_buffer_add_utf8(buffer, utf8text, -1, 0, -1);
|
| - hb_buffer_guess_segment_properties(buffer);
|
| - hb_shape(fImpl->fHarfBuzzFont.get(), buffer, nullptr, 0);
|
| - unsigned len = hb_buffer_get_length(buffer);
|
| - if (len == 0) {
|
| - hb_buffer_clear_contents(buffer);
|
| - return 0;
|
| - }
|
| -
|
| - hb_glyph_info_t* info = hb_buffer_get_glyph_infos(buffer, NULL);
|
| - hb_glyph_position_t* pos =
|
| - hb_buffer_get_glyph_positions(buffer, NULL);
|
| - auto runBuffer = builder->allocRunPos(paint, len);
|
| -
|
| - double x = point.x();
|
| - double y = point.y();
|
| -
|
| - double textSizeY = paint.getTextSize() / (double)FONT_SIZE_SCALE;
|
| - double textSizeX = textSizeY * paint.getTextScaleX();
|
| -
|
| - for (unsigned i = 0; i < len; i++) {
|
| - runBuffer.glyphs[i] = info[i].codepoint;
|
| - reinterpret_cast<SkPoint*>(runBuffer.pos)[i] =
|
| - SkPoint::Make(x + pos[i].x_offset * textSizeX,
|
| - y - pos[i].y_offset * textSizeY);
|
| - x += pos[i].x_advance * textSizeX;
|
| - y += pos[i].y_advance * textSizeY;
|
| - }
|
| - hb_buffer_clear_contents(buffer);
|
| - return (SkScalar)x;
|
| -}
|
|
|