1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SkShaperJSONWriter_DEFINED 9cb93a386Sopenharmony_ci#define SkShaperJSONWriter_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include <cstddef> 12cb93a386Sopenharmony_ci#include <cstdint> 13cb93a386Sopenharmony_ci#include <functional> 14cb93a386Sopenharmony_ci#include <string> 15cb93a386Sopenharmony_ci#include <vector> 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci#include "include/core/SkSpan.h" 18cb93a386Sopenharmony_ci#include "modules/skshaper/include/SkShaper.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ciclass SkJSONWriter; 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ciclass SkShaperJSONWriter final : public SkShaper::RunHandler { 23cb93a386Sopenharmony_cipublic: 24cb93a386Sopenharmony_ci SkShaperJSONWriter(SkJSONWriter* JSONWriter, const char* utf8, size_t size); 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci void beginLine() override; 27cb93a386Sopenharmony_ci void runInfo(const RunInfo& info) override; 28cb93a386Sopenharmony_ci void commitRunInfo() override; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci Buffer runBuffer(const RunInfo& info) override; 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci void commitRunBuffer(const RunInfo& info) override; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci void commitLine() override {} 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci using BreakupCluastersCallback = 37cb93a386Sopenharmony_ci std::function<void(size_t, size_t, uint32_t, uint32_t)>; 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci // Break up cluster into a set of ranges for the UTF8, and the glyphIDs. 40cb93a386Sopenharmony_ci static void BreakupClusters(size_t utf8Begin, size_t utf8End, 41cb93a386Sopenharmony_ci SkSpan<const uint32_t> clusters, 42cb93a386Sopenharmony_ci const BreakupCluastersCallback& processMToN); 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci using VisualizeClustersCallback = 46cb93a386Sopenharmony_ci std::function<void(size_t, SkSpan<const char>, SkSpan<const SkGlyphID>)>; 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci // Gather runs of 1:1 into larger runs, and display M:N as single entries. 49cb93a386Sopenharmony_ci static void VisualizeClusters(const char utf8[], 50cb93a386Sopenharmony_ci size_t utf8Begin, size_t utf8End, 51cb93a386Sopenharmony_ci SkSpan<const SkGlyphID> glyphIDs, 52cb93a386Sopenharmony_ci SkSpan<const uint32_t> clusters, 53cb93a386Sopenharmony_ci const VisualizeClustersCallback& processMToN); 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ciprivate: 56cb93a386Sopenharmony_ci void displayMToN(size_t codePointCount, 57cb93a386Sopenharmony_ci SkSpan<const char> utf8, 58cb93a386Sopenharmony_ci SkSpan<const SkGlyphID> glyphIDs); 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci SkJSONWriter* fJSONWriter; 61cb93a386Sopenharmony_ci std::vector<SkGlyphID> fGlyphs; 62cb93a386Sopenharmony_ci std::vector<SkPoint> fPositions; 63cb93a386Sopenharmony_ci std::vector<uint32_t> fClusters; 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci std::string fUTF8; 66cb93a386Sopenharmony_ci}; 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci#endif // SkShaperJSONWriter_DEFINED 69