mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-26 11:45:37 +00:00
f22ca7ca1e
MozReview-Commit-ID: BZIK3GEG0ER --HG-- extra : rebase_source : c24dbf123fe1732917e9fc57ee0ddfe2042892c4
77 lines
1.7 KiB
GLSL
77 lines
1.7 KiB
GLSL
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#define VECS_PER_SPECIFIC_BRUSH 2
|
|
|
|
#include shared,prim_shared,brush
|
|
|
|
flat varying int vGradientAddress;
|
|
flat varying float vGradientRepeat;
|
|
|
|
flat varying vec2 vScaledDir;
|
|
flat varying vec2 vStartPoint;
|
|
|
|
varying vec2 vPos;
|
|
|
|
#ifdef WR_FEATURE_ALPHA_PASS
|
|
varying vec2 vLocalPos;
|
|
#endif
|
|
|
|
#ifdef WR_VERTEX_SHADER
|
|
|
|
struct Gradient {
|
|
vec4 start_end_point;
|
|
vec4 extend_mode;
|
|
};
|
|
|
|
Gradient fetch_gradient(int address) {
|
|
vec4 data[2] = fetch_from_resource_cache_2(address);
|
|
return Gradient(data[0], data[1]);
|
|
}
|
|
|
|
void brush_vs(
|
|
VertexInfo vi,
|
|
int prim_address,
|
|
RectWithSize local_rect,
|
|
ivec3 user_data,
|
|
PictureTask pic_task
|
|
) {
|
|
Gradient gradient = fetch_gradient(prim_address);
|
|
|
|
vPos = vi.local_pos - local_rect.p0;
|
|
|
|
vec2 start_point = gradient.start_end_point.xy;
|
|
vec2 end_point = gradient.start_end_point.zw;
|
|
vec2 dir = end_point - start_point;
|
|
|
|
vStartPoint = start_point;
|
|
vScaledDir = dir / dot(dir, dir);
|
|
|
|
vGradientAddress = user_data.x;
|
|
|
|
// Whether to repeat the gradient instead of clamping.
|
|
vGradientRepeat = float(int(gradient.extend_mode.x) != EXTEND_MODE_CLAMP);
|
|
|
|
#ifdef WR_FEATURE_ALPHA_PASS
|
|
vLocalPos = vi.local_pos;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef WR_FRAGMENT_SHADER
|
|
vec4 brush_fs() {
|
|
float offset = dot(vPos - vStartPoint, vScaledDir);
|
|
|
|
vec4 color = sample_gradient(vGradientAddress,
|
|
offset,
|
|
vGradientRepeat);
|
|
|
|
#ifdef WR_FEATURE_ALPHA_PASS
|
|
color *= init_transform_fs(vLocalPos);
|
|
#endif
|
|
|
|
return color;
|
|
}
|
|
#endif
|