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_DSL_CORE 9cb93a386Sopenharmony_ci#define SKSL_DSL_CORE 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/private/SkSLProgramKind.h" 12cb93a386Sopenharmony_ci#include "include/private/SkTArray.h" 13cb93a386Sopenharmony_ci#include "include/sksl/DSLBlock.h" 14cb93a386Sopenharmony_ci#include "include/sksl/DSLCase.h" 15cb93a386Sopenharmony_ci#include "include/sksl/DSLExpression.h" 16cb93a386Sopenharmony_ci#include "include/sksl/DSLFunction.h" 17cb93a386Sopenharmony_ci#include "include/sksl/DSLStatement.h" 18cb93a386Sopenharmony_ci#include "include/sksl/DSLType.h" 19cb93a386Sopenharmony_ci#include "include/sksl/DSLVar.h" 20cb93a386Sopenharmony_ci#include "include/sksl/DSLWrapper.h" 21cb93a386Sopenharmony_ci#include "include/sksl/SkSLErrorReporter.h" 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_cinamespace SkSL { 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ciclass Compiler; 26cb93a386Sopenharmony_cistruct Program; 27cb93a386Sopenharmony_cistruct ProgramSettings; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cinamespace dsl { 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci// When users import the DSL namespace via `using namespace SkSL::dsl`, we want the SwizzleComponent 32cb93a386Sopenharmony_ci// Type enum to come into scope as well, so `Swizzle(var, X, Y, ONE)` can work as expected. 33cb93a386Sopenharmony_ci// `namespace SkSL::SwizzleComponent` contains only an `enum Type`; this `using namespace` directive 34cb93a386Sopenharmony_ci// shouldn't pollute the SkSL::dsl namespace with anything else. 35cb93a386Sopenharmony_ciusing namespace SkSL::SwizzleComponent; 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci/** 38cb93a386Sopenharmony_ci * Starts DSL output on the current thread using the specified compiler. This must be called 39cb93a386Sopenharmony_ci * prior to any other DSL functions. 40cb93a386Sopenharmony_ci */ 41cb93a386Sopenharmony_civoid Start(SkSL::Compiler* compiler, SkSL::ProgramKind kind = SkSL::ProgramKind::kFragment); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_civoid Start(SkSL::Compiler* compiler, SkSL::ProgramKind kind, const SkSL::ProgramSettings& settings); 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci/** 46cb93a386Sopenharmony_ci * Signals the end of DSL output. This must be called sometime between a call to Start() and the 47cb93a386Sopenharmony_ci * termination of the thread. 48cb93a386Sopenharmony_ci */ 49cb93a386Sopenharmony_civoid End(); 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci/** 52cb93a386Sopenharmony_ci * Returns all global elements (functions and global variables) as a self-contained Program. The 53cb93a386Sopenharmony_ci * optional source string is retained as the program's source. DSL programs do not normally have 54cb93a386Sopenharmony_ci * sources, but when a DSL program is produced from parsed program text (as in DSLParser), it may be 55cb93a386Sopenharmony_ci * important to retain it so that any skstd::string_views derived from it remain valid. 56cb93a386Sopenharmony_ci */ 57cb93a386Sopenharmony_cistd::unique_ptr<SkSL::Program> ReleaseProgram(std::unique_ptr<SkSL::String> source = nullptr); 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci/** 60cb93a386Sopenharmony_ci * Returns the ErrorReporter which will be notified of any errors that occur during DSL calls. The 61cb93a386Sopenharmony_ci * default error reporter aborts on any error. 62cb93a386Sopenharmony_ci */ 63cb93a386Sopenharmony_ciErrorReporter& GetErrorReporter(); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci/** 66cb93a386Sopenharmony_ci * Installs an ErrorReporter which will be notified of any errors that occur during DSL calls. 67cb93a386Sopenharmony_ci */ 68cb93a386Sopenharmony_civoid SetErrorReporter(ErrorReporter* errorReporter); 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ciDSLGlobalVar sk_FragColor(); 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ciDSLGlobalVar sk_FragCoord(); 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ciDSLExpression sk_Position(); 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci/** 77cb93a386Sopenharmony_ci * #extension <name> : enable 78cb93a386Sopenharmony_ci */ 79cb93a386Sopenharmony_civoid AddExtension(skstd::string_view name, PositionInfo pos = PositionInfo::Capture()); 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci/** 82cb93a386Sopenharmony_ci * break; 83cb93a386Sopenharmony_ci */ 84cb93a386Sopenharmony_ciDSLStatement Break(PositionInfo pos = PositionInfo::Capture()); 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci/** 87cb93a386Sopenharmony_ci * continue; 88cb93a386Sopenharmony_ci */ 89cb93a386Sopenharmony_ciDSLStatement Continue(PositionInfo pos = PositionInfo::Capture()); 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci/** 92cb93a386Sopenharmony_ci * Adds a modifiers declaration to the current program. 93cb93a386Sopenharmony_ci */ 94cb93a386Sopenharmony_civoid Declare(const DSLModifiers& modifiers, PositionInfo pos = PositionInfo::Capture()); 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci/** 97cb93a386Sopenharmony_ci * Creates a local variable declaration statement. 98cb93a386Sopenharmony_ci */ 99cb93a386Sopenharmony_ciDSLStatement Declare(DSLVar& var, PositionInfo pos = PositionInfo::Capture()); 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci/** 102cb93a386Sopenharmony_ci * Creates a local variable declaration statement containing multiple variables. 103cb93a386Sopenharmony_ci */ 104cb93a386Sopenharmony_ciDSLStatement Declare(SkTArray<DSLVar>& vars, PositionInfo pos = PositionInfo::Capture()); 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci/** 107cb93a386Sopenharmony_ci * Declares a global variable. 108cb93a386Sopenharmony_ci */ 109cb93a386Sopenharmony_civoid Declare(DSLGlobalVar& var, PositionInfo pos = PositionInfo::Capture()); 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci/** 112cb93a386Sopenharmony_ci * Declares a set of global variables. 113cb93a386Sopenharmony_ci */ 114cb93a386Sopenharmony_civoid Declare(SkTArray<DSLGlobalVar>& vars, PositionInfo pos = PositionInfo::Capture()); 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci/** 117cb93a386Sopenharmony_ci * default: statements 118cb93a386Sopenharmony_ci */ 119cb93a386Sopenharmony_citemplate<class... Statements> 120cb93a386Sopenharmony_ciDSLCase Default(Statements... statements) { 121cb93a386Sopenharmony_ci return DSLCase(DSLExpression(), std::move(statements)...); 122cb93a386Sopenharmony_ci} 123cb93a386Sopenharmony_ci 124cb93a386Sopenharmony_ci/** 125cb93a386Sopenharmony_ci * discard; 126cb93a386Sopenharmony_ci */ 127cb93a386Sopenharmony_ciDSLStatement Discard(PositionInfo pos = PositionInfo::Capture()); 128cb93a386Sopenharmony_ci 129cb93a386Sopenharmony_ci/** 130cb93a386Sopenharmony_ci * do stmt; while (test); 131cb93a386Sopenharmony_ci */ 132cb93a386Sopenharmony_ciDSLStatement Do(DSLStatement stmt, DSLExpression test, PositionInfo pos = PositionInfo::Capture()); 133cb93a386Sopenharmony_ci 134cb93a386Sopenharmony_ci/** 135cb93a386Sopenharmony_ci * for (initializer; test; next) stmt; 136cb93a386Sopenharmony_ci */ 137cb93a386Sopenharmony_ciDSLStatement For(DSLStatement initializer, DSLExpression test, DSLExpression next, 138cb93a386Sopenharmony_ci DSLStatement stmt, PositionInfo pos = PositionInfo::Capture()); 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci/** 141cb93a386Sopenharmony_ci * if (test) ifTrue; [else ifFalse;] 142cb93a386Sopenharmony_ci */ 143cb93a386Sopenharmony_ciDSLStatement If(DSLExpression test, DSLStatement ifTrue, DSLStatement ifFalse = DSLStatement(), 144cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 145cb93a386Sopenharmony_ci 146cb93a386Sopenharmony_ciDSLGlobalVar InterfaceBlock(const DSLModifiers& modifiers, skstd::string_view typeName, 147cb93a386Sopenharmony_ci SkTArray<DSLField> fields, skstd::string_view varName = "", 148cb93a386Sopenharmony_ci int arraySize = 0, PositionInfo pos = PositionInfo::Capture()); 149cb93a386Sopenharmony_ci 150cb93a386Sopenharmony_ci/** 151cb93a386Sopenharmony_ci * return [value]; 152cb93a386Sopenharmony_ci */ 153cb93a386Sopenharmony_ciDSLStatement Return(DSLExpression value = DSLExpression(), 154cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 155cb93a386Sopenharmony_ci 156cb93a386Sopenharmony_ci/** 157cb93a386Sopenharmony_ci * test ? ifTrue : ifFalse 158cb93a386Sopenharmony_ci */ 159cb93a386Sopenharmony_ciDSLExpression Select(DSLExpression test, DSLExpression ifTrue, DSLExpression ifFalse, 160cb93a386Sopenharmony_ci PositionInfo info = PositionInfo::Capture()); 161cb93a386Sopenharmony_ci 162cb93a386Sopenharmony_ciDSLStatement StaticIf(DSLExpression test, DSLStatement ifTrue, 163cb93a386Sopenharmony_ci DSLStatement ifFalse = DSLStatement(), 164cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 165cb93a386Sopenharmony_ci 166cb93a386Sopenharmony_ci// Internal use only 167cb93a386Sopenharmony_ciDSLPossibleStatement PossibleStaticSwitch(DSLExpression value, SkTArray<DSLCase> cases); 168cb93a386Sopenharmony_ci 169cb93a386Sopenharmony_ciDSLStatement StaticSwitch(DSLExpression value, SkTArray<DSLCase> cases, 170cb93a386Sopenharmony_ci PositionInfo info = PositionInfo::Capture()); 171cb93a386Sopenharmony_ci 172cb93a386Sopenharmony_ci/** 173cb93a386Sopenharmony_ci * @switch (value) { cases } 174cb93a386Sopenharmony_ci */ 175cb93a386Sopenharmony_citemplate<class... Cases> 176cb93a386Sopenharmony_ciDSLPossibleStatement StaticSwitch(DSLExpression value, Cases... cases) { 177cb93a386Sopenharmony_ci SkTArray<DSLCase> caseArray; 178cb93a386Sopenharmony_ci caseArray.reserve_back(sizeof...(cases)); 179cb93a386Sopenharmony_ci (caseArray.push_back(std::move(cases)), ...); 180cb93a386Sopenharmony_ci return PossibleStaticSwitch(std::move(value), std::move(caseArray)); 181cb93a386Sopenharmony_ci} 182cb93a386Sopenharmony_ci 183cb93a386Sopenharmony_ci// Internal use only 184cb93a386Sopenharmony_ciDSLPossibleStatement PossibleSwitch(DSLExpression value, SkTArray<DSLCase> cases); 185cb93a386Sopenharmony_ci 186cb93a386Sopenharmony_ciDSLStatement Switch(DSLExpression value, SkTArray<DSLCase> cases, 187cb93a386Sopenharmony_ci PositionInfo info = PositionInfo::Capture()); 188cb93a386Sopenharmony_ci 189cb93a386Sopenharmony_ci/** 190cb93a386Sopenharmony_ci * switch (value) { cases } 191cb93a386Sopenharmony_ci */ 192cb93a386Sopenharmony_citemplate<class... Cases> 193cb93a386Sopenharmony_ciDSLPossibleStatement Switch(DSLExpression value, Cases... cases) { 194cb93a386Sopenharmony_ci SkTArray<DSLCase> caseArray; 195cb93a386Sopenharmony_ci caseArray.reserve_back(sizeof...(cases)); 196cb93a386Sopenharmony_ci (caseArray.push_back(std::move(cases)), ...); 197cb93a386Sopenharmony_ci return PossibleSwitch(std::move(value), std::move(caseArray)); 198cb93a386Sopenharmony_ci} 199cb93a386Sopenharmony_ci 200cb93a386Sopenharmony_ci/** 201cb93a386Sopenharmony_ci * while (test) stmt; 202cb93a386Sopenharmony_ci */ 203cb93a386Sopenharmony_ciDSLStatement While(DSLExpression test, DSLStatement stmt, 204cb93a386Sopenharmony_ci PositionInfo info = PositionInfo::Capture()); 205cb93a386Sopenharmony_ci 206cb93a386Sopenharmony_ci/** 207cb93a386Sopenharmony_ci * expression.xyz1 208cb93a386Sopenharmony_ci */ 209cb93a386Sopenharmony_ciDSLExpression Swizzle(DSLExpression base, 210cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type a, 211cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 212cb93a386Sopenharmony_ci 213cb93a386Sopenharmony_ciDSLExpression Swizzle(DSLExpression base, 214cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type a, 215cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type b, 216cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 217cb93a386Sopenharmony_ci 218cb93a386Sopenharmony_ciDSLExpression Swizzle(DSLExpression base, 219cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type a, 220cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type b, 221cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type c, 222cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 223cb93a386Sopenharmony_ci 224cb93a386Sopenharmony_ciDSLExpression Swizzle(DSLExpression base, 225cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type a, 226cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type b, 227cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type c, 228cb93a386Sopenharmony_ci SkSL::SwizzleComponent::Type d, 229cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 230cb93a386Sopenharmony_ci 231cb93a386Sopenharmony_ci/** 232cb93a386Sopenharmony_ci * Returns the absolute value of x. If x is a vector, operates componentwise. 233cb93a386Sopenharmony_ci */ 234cb93a386Sopenharmony_ciDSLExpression Abs(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 235cb93a386Sopenharmony_ci 236cb93a386Sopenharmony_ci/** 237cb93a386Sopenharmony_ci * Returns true if all of the components of boolean vector x are true. 238cb93a386Sopenharmony_ci */ 239cb93a386Sopenharmony_ciDSLExpression All(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 240cb93a386Sopenharmony_ci 241cb93a386Sopenharmony_ci/** 242cb93a386Sopenharmony_ci * Returns true if any of the components of boolean vector x are true. 243cb93a386Sopenharmony_ci */ 244cb93a386Sopenharmony_ciDSLExpression Any(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 245cb93a386Sopenharmony_ci 246cb93a386Sopenharmony_ci/** 247cb93a386Sopenharmony_ci * Returns the arctangent of y over x. Operates componentwise on vectors. 248cb93a386Sopenharmony_ci */ 249cb93a386Sopenharmony_ciDSLExpression Atan(DSLExpression y_over_x, PositionInfo pos = PositionInfo::Capture()); 250cb93a386Sopenharmony_ciDSLExpression Atan(DSLExpression y, DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 251cb93a386Sopenharmony_ci 252cb93a386Sopenharmony_ci/** 253cb93a386Sopenharmony_ci * Returns x rounded towards positive infinity. If x is a vector, operates componentwise. 254cb93a386Sopenharmony_ci */ 255cb93a386Sopenharmony_ciDSLExpression Ceil(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 256cb93a386Sopenharmony_ci 257cb93a386Sopenharmony_ci/** 258cb93a386Sopenharmony_ci * Returns x clamped to between min and max. If x is a vector, operates componentwise. 259cb93a386Sopenharmony_ci */ 260cb93a386Sopenharmony_ciDSLExpression Clamp(DSLExpression x, DSLExpression min, DSLExpression max, 261cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 262cb93a386Sopenharmony_ci 263cb93a386Sopenharmony_ci/** 264cb93a386Sopenharmony_ci * Returns the cosine of x. If x is a vector, operates componentwise. 265cb93a386Sopenharmony_ci */ 266cb93a386Sopenharmony_ciDSLExpression Cos(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 267cb93a386Sopenharmony_ci 268cb93a386Sopenharmony_ci/** 269cb93a386Sopenharmony_ci * Returns the cross product of x and y. 270cb93a386Sopenharmony_ci */ 271cb93a386Sopenharmony_ciDSLExpression Cross(DSLExpression x, DSLExpression y, PositionInfo pos = PositionInfo::Capture()); 272cb93a386Sopenharmony_ci 273cb93a386Sopenharmony_ci/** 274cb93a386Sopenharmony_ci * Returns x converted from radians to degrees. If x is a vector, operates componentwise. 275cb93a386Sopenharmony_ci */ 276cb93a386Sopenharmony_ciDSLExpression Degrees(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 277cb93a386Sopenharmony_ci 278cb93a386Sopenharmony_ci/** 279cb93a386Sopenharmony_ci * Returns the distance between x and y. 280cb93a386Sopenharmony_ci */ 281cb93a386Sopenharmony_ciDSLExpression Distance(DSLExpression x, DSLExpression y, 282cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 283cb93a386Sopenharmony_ci 284cb93a386Sopenharmony_ci/** 285cb93a386Sopenharmony_ci * Returns the dot product of x and y. 286cb93a386Sopenharmony_ci */ 287cb93a386Sopenharmony_ciDSLExpression Dot(DSLExpression x, DSLExpression y, PositionInfo pos = PositionInfo::Capture()); 288cb93a386Sopenharmony_ci 289cb93a386Sopenharmony_ci/** 290cb93a386Sopenharmony_ci * Returns a boolean vector indicating whether components of x are equal to the corresponding 291cb93a386Sopenharmony_ci * components of y. 292cb93a386Sopenharmony_ci */ 293cb93a386Sopenharmony_ciDSLExpression Equal(DSLExpression x, DSLExpression y, PositionInfo pos = PositionInfo::Capture()); 294cb93a386Sopenharmony_ci 295cb93a386Sopenharmony_ci/** 296cb93a386Sopenharmony_ci * Returns e^x. If x is a vector, operates componentwise. 297cb93a386Sopenharmony_ci */ 298cb93a386Sopenharmony_ciDSLExpression Exp(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 299cb93a386Sopenharmony_ci 300cb93a386Sopenharmony_ci/** 301cb93a386Sopenharmony_ci * Returns 2^x. If x is a vector, operates componentwise. 302cb93a386Sopenharmony_ci */ 303cb93a386Sopenharmony_ciDSLExpression Exp2(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 304cb93a386Sopenharmony_ci 305cb93a386Sopenharmony_ci/** 306cb93a386Sopenharmony_ci * If dot(i, nref) >= 0, returns n, otherwise returns -n. 307cb93a386Sopenharmony_ci */ 308cb93a386Sopenharmony_ciDSLExpression Faceforward(DSLExpression n, DSLExpression i, DSLExpression nref, 309cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 310cb93a386Sopenharmony_ci 311cb93a386Sopenharmony_ci/** 312cb93a386Sopenharmony_ci * Returns x rounded towards negative infinity. If x is a vector, operates componentwise. 313cb93a386Sopenharmony_ci */ 314cb93a386Sopenharmony_ciDSLExpression Floor(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 315cb93a386Sopenharmony_ci 316cb93a386Sopenharmony_ci/** 317cb93a386Sopenharmony_ci * Returns the fractional part of x. If x is a vector, operates componentwise. 318cb93a386Sopenharmony_ci */ 319cb93a386Sopenharmony_ciDSLExpression Fract(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 320cb93a386Sopenharmony_ci 321cb93a386Sopenharmony_ci/** 322cb93a386Sopenharmony_ci * Returns a boolean vector indicating whether components of x are greater than the corresponding 323cb93a386Sopenharmony_ci * components of y. 324cb93a386Sopenharmony_ci */ 325cb93a386Sopenharmony_ciDSLExpression GreaterThan(DSLExpression x, DSLExpression y, 326cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 327cb93a386Sopenharmony_ci 328cb93a386Sopenharmony_ci/** 329cb93a386Sopenharmony_ci * Returns a boolean vector indicating whether components of x are greater than or equal to the 330cb93a386Sopenharmony_ci * corresponding components of y. 331cb93a386Sopenharmony_ci */ 332cb93a386Sopenharmony_ciDSLExpression GreaterThanEqual(DSLExpression x, DSLExpression y, 333cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 334cb93a386Sopenharmony_ci 335cb93a386Sopenharmony_ci/** 336cb93a386Sopenharmony_ci * Returns the 1/sqrt(x). If x is a vector, operates componentwise. 337cb93a386Sopenharmony_ci */ 338cb93a386Sopenharmony_ciDSLExpression Inversesqrt(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 339cb93a386Sopenharmony_ci 340cb93a386Sopenharmony_ci/** 341cb93a386Sopenharmony_ci * Returns the inverse of the matrix x. 342cb93a386Sopenharmony_ci */ 343cb93a386Sopenharmony_ciDSLExpression Inverse(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 344cb93a386Sopenharmony_ci 345cb93a386Sopenharmony_ci/** 346cb93a386Sopenharmony_ci * Returns the length of the vector x. 347cb93a386Sopenharmony_ci */ 348cb93a386Sopenharmony_ciDSLExpression Length(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 349cb93a386Sopenharmony_ci 350cb93a386Sopenharmony_ci/** 351cb93a386Sopenharmony_ci * Returns a boolean vector indicating whether components of x are less than the corresponding 352cb93a386Sopenharmony_ci * components of y. 353cb93a386Sopenharmony_ci */ 354cb93a386Sopenharmony_ciDSLExpression LessThan(DSLExpression x, DSLExpression y, 355cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 356cb93a386Sopenharmony_ci 357cb93a386Sopenharmony_ci/** 358cb93a386Sopenharmony_ci * Returns a boolean vector indicating whether components of x are less than or equal to the 359cb93a386Sopenharmony_ci * corresponding components of y. 360cb93a386Sopenharmony_ci */ 361cb93a386Sopenharmony_ciDSLExpression LessThanEqual(DSLExpression x, DSLExpression y, 362cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 363cb93a386Sopenharmony_ci 364cb93a386Sopenharmony_ci/** 365cb93a386Sopenharmony_ci * Returns the log base e of x. If x is a vector, operates componentwise. 366cb93a386Sopenharmony_ci */ 367cb93a386Sopenharmony_ciDSLExpression Log(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 368cb93a386Sopenharmony_ci 369cb93a386Sopenharmony_ci/** 370cb93a386Sopenharmony_ci * Returns the log base 2 of x. If x is a vector, operates componentwise. 371cb93a386Sopenharmony_ci */ 372cb93a386Sopenharmony_ciDSLExpression Log2(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 373cb93a386Sopenharmony_ci 374cb93a386Sopenharmony_ci/** 375cb93a386Sopenharmony_ci * Returns the larger (closer to positive infinity) of x and y. If x is a vector, operates 376cb93a386Sopenharmony_ci * componentwise. y may be either a vector of the same dimensions as x, or a scalar. 377cb93a386Sopenharmony_ci */ 378cb93a386Sopenharmony_ciDSLExpression Max(DSLExpression x, DSLExpression y, PositionInfo pos = PositionInfo::Capture()); 379cb93a386Sopenharmony_ci 380cb93a386Sopenharmony_ci/** 381cb93a386Sopenharmony_ci * Returns the smaller (closer to negative infinity) of x and y. If x is a vector, operates 382cb93a386Sopenharmony_ci * componentwise. y may be either a vector of the same dimensions as x, or a scalar. 383cb93a386Sopenharmony_ci */ 384cb93a386Sopenharmony_ciDSLExpression Min(DSLExpression x, DSLExpression y, PositionInfo pos = PositionInfo::Capture()); 385cb93a386Sopenharmony_ci 386cb93a386Sopenharmony_ci/** 387cb93a386Sopenharmony_ci * Returns a linear intepolation between x and y at position a, where a=0 results in x and a=1 388cb93a386Sopenharmony_ci * results in y. If x and y are vectors, operates componentwise. a may be either a vector of the 389cb93a386Sopenharmony_ci * same dimensions as x and y, or a scalar. 390cb93a386Sopenharmony_ci */ 391cb93a386Sopenharmony_ciDSLExpression Mix(DSLExpression x, DSLExpression y, DSLExpression a, 392cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 393cb93a386Sopenharmony_ci 394cb93a386Sopenharmony_ci/** 395cb93a386Sopenharmony_ci * Returns x modulo y. If x is a vector, operates componentwise. y may be either a vector of the 396cb93a386Sopenharmony_ci * same dimensions as x, or a scalar. 397cb93a386Sopenharmony_ci */ 398cb93a386Sopenharmony_ciDSLExpression Mod(DSLExpression x, DSLExpression y, PositionInfo pos = PositionInfo::Capture()); 399cb93a386Sopenharmony_ci 400cb93a386Sopenharmony_ci/** 401cb93a386Sopenharmony_ci * Returns the vector x normalized to a length of 1. 402cb93a386Sopenharmony_ci */ 403cb93a386Sopenharmony_ciDSLExpression Normalize(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 404cb93a386Sopenharmony_ci 405cb93a386Sopenharmony_ci/** 406cb93a386Sopenharmony_ci * Returns a boolean vector indicating whether components of x are not equal to the corresponding 407cb93a386Sopenharmony_ci * components of y. 408cb93a386Sopenharmony_ci */ 409cb93a386Sopenharmony_ciDSLExpression NotEqual(DSLExpression x, DSLExpression y, 410cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 411cb93a386Sopenharmony_ci 412cb93a386Sopenharmony_ci/** 413cb93a386Sopenharmony_ci * Returns x raised to the power y. If x is a vector, operates componentwise. y may be either a 414cb93a386Sopenharmony_ci * vector of the same dimensions as x, or a scalar. 415cb93a386Sopenharmony_ci */ 416cb93a386Sopenharmony_ciDSLExpression Pow(DSLExpression x, DSLExpression y, PositionInfo pos = PositionInfo::Capture()); 417cb93a386Sopenharmony_ci 418cb93a386Sopenharmony_ci/** 419cb93a386Sopenharmony_ci * Returns x converted from degrees to radians. If x is a vector, operates componentwise. 420cb93a386Sopenharmony_ci */ 421cb93a386Sopenharmony_ciDSLExpression Radians(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 422cb93a386Sopenharmony_ci 423cb93a386Sopenharmony_ci/** 424cb93a386Sopenharmony_ci * Returns i reflected from a surface with normal n. 425cb93a386Sopenharmony_ci */ 426cb93a386Sopenharmony_ciDSLExpression Reflect(DSLExpression i, DSLExpression n, PositionInfo pos = PositionInfo::Capture()); 427cb93a386Sopenharmony_ci 428cb93a386Sopenharmony_ci/** 429cb93a386Sopenharmony_ci * Returns i refracted across a surface with normal n and ratio of indices of refraction eta. 430cb93a386Sopenharmony_ci */ 431cb93a386Sopenharmony_ciDSLExpression Refract(DSLExpression i, DSLExpression n, DSLExpression eta, 432cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 433cb93a386Sopenharmony_ci 434cb93a386Sopenharmony_ci/** 435cb93a386Sopenharmony_ci * Returns x, rounded to the nearest integer. If x is a vector, operates componentwise. 436cb93a386Sopenharmony_ci */ 437cb93a386Sopenharmony_ciDSLExpression Round(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 438cb93a386Sopenharmony_ci 439cb93a386Sopenharmony_ci/** 440cb93a386Sopenharmony_ci * Returns x clamped to the range [0, 1]. If x is a vector, operates componentwise. 441cb93a386Sopenharmony_ci */ 442cb93a386Sopenharmony_ciDSLExpression Saturate(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 443cb93a386Sopenharmony_ci 444cb93a386Sopenharmony_ci/** 445cb93a386Sopenharmony_ci * Returns -1, 0, or 1 depending on whether x is negative, zero, or positive, respectively. If x is 446cb93a386Sopenharmony_ci * a vector, operates componentwise. 447cb93a386Sopenharmony_ci */ 448cb93a386Sopenharmony_ciDSLExpression Sign(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 449cb93a386Sopenharmony_ci 450cb93a386Sopenharmony_ci/** 451cb93a386Sopenharmony_ci * Returns the sine of x. If x is a vector, operates componentwise. 452cb93a386Sopenharmony_ci */ 453cb93a386Sopenharmony_ciDSLExpression Sin(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 454cb93a386Sopenharmony_ci 455cb93a386Sopenharmony_ci/** 456cb93a386Sopenharmony_ci * Returns a smooth interpolation between 0 (at x=edge1) and 1 (at x=edge2). If x is a vector, 457cb93a386Sopenharmony_ci * operates componentwise. edge1 and edge2 may either be both vectors of the same dimensions as x or 458cb93a386Sopenharmony_ci * scalars. 459cb93a386Sopenharmony_ci */ 460cb93a386Sopenharmony_ciDSLExpression Smoothstep(DSLExpression edge1, DSLExpression edge2, DSLExpression x, 461cb93a386Sopenharmony_ci PositionInfo pos = PositionInfo::Capture()); 462cb93a386Sopenharmony_ci 463cb93a386Sopenharmony_ci/** 464cb93a386Sopenharmony_ci * Returns the square root of x. If x is a vector, operates componentwise. 465cb93a386Sopenharmony_ci */ 466cb93a386Sopenharmony_ciDSLExpression Sqrt(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 467cb93a386Sopenharmony_ci 468cb93a386Sopenharmony_ci/** 469cb93a386Sopenharmony_ci * Returns 0 if x < edge or 1 if x >= edge. If x is a vector, operates componentwise. edge may be 470cb93a386Sopenharmony_ci * either a vector of the same dimensions as x, or a scalar. 471cb93a386Sopenharmony_ci */ 472cb93a386Sopenharmony_ciDSLExpression Step(DSLExpression edge, DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 473cb93a386Sopenharmony_ci 474cb93a386Sopenharmony_ci/** 475cb93a386Sopenharmony_ci * Returns the tangent of x. If x is a vector, operates componentwise. 476cb93a386Sopenharmony_ci */ 477cb93a386Sopenharmony_ciDSLExpression Tan(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 478cb93a386Sopenharmony_ci 479cb93a386Sopenharmony_ci/** 480cb93a386Sopenharmony_ci * Returns x converted from premultipled to unpremultiplied alpha. 481cb93a386Sopenharmony_ci */ 482cb93a386Sopenharmony_ciDSLExpression Unpremul(DSLExpression x, PositionInfo pos = PositionInfo::Capture()); 483cb93a386Sopenharmony_ci 484cb93a386Sopenharmony_ci} // namespace dsl 485cb93a386Sopenharmony_ci 486cb93a386Sopenharmony_ci} // namespace SkSL 487cb93a386Sopenharmony_ci 488cb93a386Sopenharmony_ci#endif 489