summaryrefslogtreecommitdiff
path: root/gsk/vulkan/resources/rect.glsl
blob: 31c8d476f901d1f7f6dbd28cc06a23feec77e294 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#ifndef _RECT_
#define _RECT_

struct Rect
{
  /* x,y and y,w make up the 2 points of this rect,
     note that this is not containing width or height */
  vec4 bounds;
};

Rect
rect_from_gsk (vec4 xywh)
{
  return Rect(xywh.xyxy + vec4(0,0,xywh.zw));
}

float
rect_distance (Rect r, vec2 p)
{
  vec4 distance = (r.bounds - p.xyxy) * vec4(1.0, 1.0, -1.0, -1.0);
  vec2 max2 = max (distance.xy, distance.zw);
  return length (max (max2, 0)) + min (max(max2.x, max2.y), 0);
}

vec2
rect_size (Rect r)
{
  return r.bounds.zw - r.bounds.xy;
}

Rect
rect_round_larger (Rect r)
{
  return Rect (vec4 (floor(r.bounds.xy), ceil (r.bounds.zw)));
}

Rect
rect_round_larger_smaller (Rect r)
{
  return Rect (mix (floor(r.bounds), ceil (r.bounds), bvec4(0, 1, 1, 0)));
}

Rect
rect_round_smaller_larger (Rect r)
{
  return Rect (mix (floor(r.bounds), ceil (r.bounds), bvec4(1, 0, 0, 1)));
}

Rect
rect_intersect (Rect a, Rect b)
{
  vec4 result = vec4(max(a.bounds.xy, b.bounds.xy), min(a.bounds.zw, b.bounds.zw));
  if (any (greaterThanEqual (result.xy, result.zw)))
    return Rect (vec4(0.0));
  return Rect(result);
}

#endif