| /* |
| * Copyright 2018 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "SkShaper.h" |
| #include "SkSpan.h" |
| #include "SkTextBlobPriv.h" |
| |
| std::unique_ptr<SkShaper> SkShaper::Make() { |
| #ifdef SK_SHAPER_HARFBUZZ_AVAILABLE |
| std::unique_ptr<SkShaper> shaper = SkShaper::MakeHarfBuzz(); |
| if (shaper) { |
| return shaper; |
| } |
| #endif |
| return SkShaper::MakePrimitive(); |
| } |
| |
| SkShaper::SkShaper() {} |
| SkShaper::~SkShaper() {} |
| |
| SkShaper::RunHandler::Buffer SkTextBlobBuilderRunHandler::newRunBuffer(const RunInfo&, |
| const SkFont& font, |
| int glyphCount, |
| SkSpan<const char> utf8) { |
| const auto& runBuffer = SkTextBlobBuilderPriv::AllocRunTextPos(&fBuilder, font, glyphCount, |
| utf8.size(), SkString()); |
| if (runBuffer.utf8text && fUtf8Text) { |
| memcpy(runBuffer.utf8text, utf8.data(), utf8.size()); |
| } |
| fClusters = runBuffer.clusters; |
| fGlyphCount = glyphCount; |
| fClusterOffset = utf8.data() - fUtf8Text; |
| |
| return { runBuffer.glyphs, |
| runBuffer.points(), |
| runBuffer.clusters }; |
| } |
| |
| void SkTextBlobBuilderRunHandler::commitRun() { |
| SkASSERT(0 <= fClusterOffset); |
| for (int i = 0; i < fGlyphCount; ++i) { |
| SkASSERT(fClusters[i] >= (unsigned)fClusterOffset); |
| fClusters[i] -= fClusterOffset; |
| } |
| } |
| |
| sk_sp<SkTextBlob> SkTextBlobBuilderRunHandler::makeBlob() { |
| return fBuilder.make(); |
| } |