/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SKSL_HCODEGENERATOR #define SKSL_HCODEGENERATOR #include "SkSLCodeGenerator.h" #include "SkSLSectionAndParameterHelper.h" #include "ir/SkSLType.h" #include "ir/SkSLVariable.h" #include <cctype> constexpr const char* kFragmentProcessorHeader = R"( /************************************************************************************************** *** This file was autogenerated from %s.fp; do not modify. **************************************************************************************************/ )"; namespace SkSL { class HCodeGenerator : public CodeGenerator { public: HCodeGenerator(const Context* context, const Program* program, ErrorReporter* errors, String name, OutputStream* out); bool generateCode() override; static String ParameterType(const Context& context, const Type& type, const Layout& layout); static String FieldType(const Context& context, const Type& type, const Layout& layout); static String FieldName(const char* varName) { return String::printf("f%c%s", toupper(varName[0]), varName + 1); } static String GetHeader(const Program& program, ErrorReporter& errors); private: void writef(const char* s, va_list va) SKSL_PRINTF_LIKE(2, 0); void writef(const char* s, ...) SKSL_PRINTF_LIKE(2, 3); bool writeSection(const char* name, const char* prefix = ""); // given a @constructorParams section of e.g. 'int x, float y', writes out "<separator>x, y". // Writes nothing (not even the separator) if there is no @constructorParams section. void writeExtraConstructorParams(const char* separator); void writeMake(); void writeConstructor(); void writeFields(); void failOnSection(const char* section, const char* msg); const Context& fContext; String fName; String fFullName; SectionAndParameterHelper fSectionAndParameterHelper; typedef CodeGenerator INHERITED; }; } // namespace SkSL #endif