| /* | |
| * 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(); | |
| } |