1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC 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 SKSL_DEHYDRATOR 9cb93a386Sopenharmony_ci#define SKSL_DEHYDRATOR 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#ifdef SKSL_STANDALONE 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "include/core/SkSpan.h" 14cb93a386Sopenharmony_ci#include "include/private/SkSLModifiers.h" 15cb93a386Sopenharmony_ci#include "include/private/SkSLSymbol.h" 16cb93a386Sopenharmony_ci#include "include/private/SkTHash.h" 17cb93a386Sopenharmony_ci#include "src/sksl/SkSLOutputStream.h" 18cb93a386Sopenharmony_ci#include "src/sksl/SkSLStringStream.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci#include <set> 21cb93a386Sopenharmony_ci#include <unordered_map> 22cb93a386Sopenharmony_ci#include <vector> 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cinamespace SkSL { 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciclass AnyConstructor; 27cb93a386Sopenharmony_ciclass Expression; 28cb93a386Sopenharmony_ciclass ProgramElement; 29cb93a386Sopenharmony_ciclass Statement; 30cb93a386Sopenharmony_ciclass Symbol; 31cb93a386Sopenharmony_ciclass SymbolTable; 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci// The file has the structure: 34cb93a386Sopenharmony_ci// 35cb93a386Sopenharmony_ci// uint16 total string length 36cb93a386Sopenharmony_ci// string data 37cb93a386Sopenharmony_ci// symboltable 38cb93a386Sopenharmony_ci// elements 39cb93a386Sopenharmony_ciclass Dehydrator { 40cb93a386Sopenharmony_cipublic: 41cb93a386Sopenharmony_ci Dehydrator() { 42cb93a386Sopenharmony_ci fSymbolMap.emplace_back(); 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci ~Dehydrator() { 46cb93a386Sopenharmony_ci SkASSERT(fSymbolMap.size() == 1); 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci void write(const SymbolTable& symbols); 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci void write(const std::vector<std::unique_ptr<ProgramElement>>& elements); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci void finish(OutputStream& out); 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci // Inserts line breaks at meaningful offsets. 56cb93a386Sopenharmony_ci const char* prefixAtOffset(size_t byte); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciprivate: 59cb93a386Sopenharmony_ci void writeS8(int32_t i) { 60cb93a386Sopenharmony_ci SkASSERT(i >= -128 && i <= 127); 61cb93a386Sopenharmony_ci fBody.write8(i); 62cb93a386Sopenharmony_ci } 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci void writeCommand(int32_t c) { 65cb93a386Sopenharmony_ci fCommandBreaks.add(fBody.bytesWritten()); 66cb93a386Sopenharmony_ci fBody.write8(c); 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci void writeU8(int32_t i) { 70cb93a386Sopenharmony_ci SkASSERT(i >= 0 && i <= 255); 71cb93a386Sopenharmony_ci fBody.write8(i); 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci void writeS16(int32_t i) { 75cb93a386Sopenharmony_ci SkASSERT(i >= -32768 && i <= 32767); 76cb93a386Sopenharmony_ci fBody.write16(i); 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci void writeU16(int32_t i) { 80cb93a386Sopenharmony_ci SkASSERT(i >= 0 && i <= 65535); 81cb93a386Sopenharmony_ci fBody.write16(i); 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci void writeS32(int64_t i) { 85cb93a386Sopenharmony_ci SkASSERT(i >= -2147483648 && i <= 2147483647); 86cb93a386Sopenharmony_ci fBody.write32(i); 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci void writeId(const Symbol* s) { 90cb93a386Sopenharmony_ci if (!symbolId(s, false)) { 91cb93a386Sopenharmony_ci fSymbolMap.back()[s] = fNextId++; 92cb93a386Sopenharmony_ci } 93cb93a386Sopenharmony_ci this->writeU16(symbolId(s)); 94cb93a386Sopenharmony_ci } 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci uint16_t symbolId(const Symbol* s, bool required = true) { 97cb93a386Sopenharmony_ci for (const auto& symbols : fSymbolMap) { 98cb93a386Sopenharmony_ci auto found = symbols.find(s); 99cb93a386Sopenharmony_ci if (found != symbols.end()) { 100cb93a386Sopenharmony_ci return found->second; 101cb93a386Sopenharmony_ci } 102cb93a386Sopenharmony_ci } 103cb93a386Sopenharmony_ci SkASSERT(!required); 104cb93a386Sopenharmony_ci return 0; 105cb93a386Sopenharmony_ci } 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci void write(Layout l); 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci void write(Modifiers m); 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci void write(skstd::string_view s); 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ci void write(String s); 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci void write(const ProgramElement& e); 116cb93a386Sopenharmony_ci 117cb93a386Sopenharmony_ci void write(const Expression* e); 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ci void write(const Statement* s); 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci void write(const Symbol& s); 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ci void writeExpressionSpan(const SkSpan<const std::unique_ptr<Expression>>& span); 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ci uint16_t fNextId = 1; 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ci StringStream fStringBuffer; 128cb93a386Sopenharmony_ci 129cb93a386Sopenharmony_ci StringStream fBody; 130cb93a386Sopenharmony_ci 131cb93a386Sopenharmony_ci std::unordered_map<String, int> fStrings; 132cb93a386Sopenharmony_ci 133cb93a386Sopenharmony_ci std::vector<std::unordered_map<const Symbol*, int>> fSymbolMap; 134cb93a386Sopenharmony_ci SkTHashSet<size_t> fStringBreaks; 135cb93a386Sopenharmony_ci SkTHashSet<size_t> fCommandBreaks; 136cb93a386Sopenharmony_ci size_t fStringBufferStart; 137cb93a386Sopenharmony_ci size_t fCommandStart; 138cb93a386Sopenharmony_ci 139cb93a386Sopenharmony_ci friend class AutoDehydratorSymbolTable; 140cb93a386Sopenharmony_ci}; 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci} // namespace 143cb93a386Sopenharmony_ci 144cb93a386Sopenharmony_ci#endif 145cb93a386Sopenharmony_ci 146cb93a386Sopenharmony_ci#endif 147