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