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