Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
a78cea20
Commit
a78cea20
authored
Mar 18, 2024
by
Giovanni Mascellani
Committed by
Alexandre Julliard
Mar 20, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
d2d1: Compile the pixel shader with D3DCompile().
parent
25ffa32b
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
214 additions
and
464 deletions
+214
-464
device.c
dlls/d2d1/device.c
+214
-464
No files found.
dlls/d2d1/device.c
View file @
a78cea20
...
...
@@ -3204,6 +3204,7 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
D3D11_RASTERIZER_DESC
rs_desc
;
D3D11_BUFFER_DESC
buffer_desc
;
struct
d2d_factory
*
factory
;
ID3D10Blob
*
compiled
;
unsigned
int
i
;
HRESULT
hr
;
...
...
@@ -3472,468 +3473,208 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
" * float2(transform_rtx.w, transform_rty.w);
\n
"
" o.position = float4(position + float2(-1.0f, 1.0f), 0.0f, 1.0f);
\n
"
"}
\n
"
;
static
const
DWORD
ps_code
[]
=
{
#if 0
#define BRUSH_TYPE_SOLID 0
#define BRUSH_TYPE_LINEAR 1
#define BRUSH_TYPE_RADIAL 2
#define BRUSH_TYPE_BITMAP 3
#define BRUSH_TYPE_COUNT 4
bool outline;
bool is_arc;
struct brush
{
uint type;
float opacity;
float4 data[3];
} colour_brush, opacity_brush;
SamplerState s0, s1;
Texture2D t0, t1;
Buffer<float4> b0, b1;
struct input
{
float2 p : WORLD_POSITION;
float4 b : BEZIER;
nointerpolation float2x2 stroke_transform : STROKE_TRANSFORM;
};
float4 sample_gradient(Buffer<float4> gradient, uint stop_count, float position)
{
float4 c_low, c_high;
float p_low, p_high;
uint i;
p_low = gradient.Load(0).x;
c_low = gradient.Load(1);
c_high = c_low;
if (position < p_low)
return c_low;
for (i = 1; i < stop_count; ++i)
{
p_high = gradient.Load(i * 2).x;
c_high = gradient.Load(i * 2 + 1);
if (position >= p_low && position <= p_high)
return lerp(c_low, c_high, (position - p_low) / (p_high - p_low));
p_low = p_high;
c_low = c_high;
}
return c_high;
}
float4 brush_linear(struct brush brush, Buffer<float4> gradient, float2 position)
{
float2 start, end, v_p, v_q;
uint stop_count;
float p;
start = brush.data[0].xy;
end = brush.data[0].zw;
stop_count = asuint(brush.data[1].x);
v_p = position - start;
v_q = end - start;
p = dot(v_q, v_p) / dot(v_q, v_q);
return sample_gradient(gradient, stop_count, p);
}
float4 brush_radial(struct brush brush, Buffer<float4> gradient, float2 position)
{
float2 centre, offset, ra, rb, v_p, v_q, r;
float b, c, l, t;
uint stop_count;
centre = brush.data[0].xy;
offset = brush.data[0].zw;
ra = brush.data[1].xy;
rb = brush.data[1].zw;
stop_count = asuint(brush.data[2].x);
/* Project onto ra, rb. */
r = float2(dot(ra, ra), dot(rb, rb));
v_p = position - (centre + offset);
v_p = float2(dot(v_p, ra), dot(v_p, rb)) / r;
v_q = float2(dot(offset, ra), dot(offset, rb)) / r;
/* ‖t·p̂ + q⃑‖ = 1
* (t·p̂ + q⃑) · (t·p̂ + q⃑) = 1
* t² + 2·(p̂·q⃑)·t + (q⃑·q⃑) = 1
*
* b = p̂·q⃑
* c = q⃑·q⃑ - 1
* t = -b + √(b² - c) */
l = length(v_p);
b = dot(v_p, v_q) / l;
c = dot(v_q, v_q) - 1.0;
t = -b + sqrt(b * b - c);
return sample_gradient(gradient, stop_count, l / t);
}
float4 brush_bitmap(struct brush brush, Texture2D t, SamplerState s, float2 position)
{
float3 transform[2];
bool ignore_alpha;
float2 texcoord;
float4 colour;
transform[0] = brush.data[0].xyz;
transform[1] = brush.data[1].xyz;
ignore_alpha = asuint(brush.data[1].w);
texcoord.x = dot(position.xy, transform[0].xy) + transform[0].z;
texcoord.y = dot(position.xy, transform[1].xy) + transform[1].z;
colour = t.Sample(s, texcoord);
if (ignore_alpha)
colour.a = 1.0;
return colour;
}
float4 sample_brush(struct brush brush, Texture2D t, SamplerState s, Buffer<float4> b, float2 position)
{
if (brush.type == BRUSH_TYPE_SOLID)
return brush.data[0] * brush.opacity;
if (brush.type == BRUSH_TYPE_LINEAR)
return brush_linear(brush, b, position) * brush.opacity;
if (brush.type == BRUSH_TYPE_RADIAL)
return brush_radial(brush, b, position) * brush.opacity;
if (brush.type == BRUSH_TYPE_BITMAP)
return brush_bitmap(brush, t, s, position) * brush.opacity;
return float4(0.0, 0.0, 0.0, brush.opacity);
}
float4 main(struct input i) : SV_Target
{
float4 colour;
colour = sample_brush(colour_brush, t0, s0, b0, i.p);
if (opacity_brush.type < BRUSH_TYPE_COUNT)
colour *= sample_brush(opacity_brush, t1, s1, b1, i.p).a;
if (outline)
{
float2 du, dv, df;
float4 uv;
/* Evaluate the implicit form of the curve (u² - v = 0
* for Béziers, u² + v² - 1 = 0 for arcs) in texture
* space, using the screen-space partial derivatives
* to convert the calculated distance to object space.
*
* d(x, y) = |f(x, y)| / ‖∇f(x, y)‖
* = |f(x, y)| / √((∂f/∂x)² + (∂f/∂y)²)
*
* For Béziers:
* f(x, y) = u(x, y)² - v(x, y)
* ∂f/∂x = 2u · ∂u/∂x - ∂v/∂x
* ∂f/∂y = 2u · ∂u/∂y - ∂v/∂y
*
* For arcs:
* f(x, y) = u(x, y)² + v(x, y)² - 1
* ∂f/∂x = 2u · ∂u/∂x + 2v · ∂v/∂x
* ∂f/∂y = 2u · ∂u/∂y + 2v · ∂v/∂y */
uv = i.b;
du = float2(ddx(uv.x), ddy(uv.x));
dv = float2(ddx(uv.y), ddy(uv.y));
if (!is_arc)
{
df = 2.0f * uv.x * du - dv;
clip(dot(df, uv.zw));
clip(length(mul(i.stroke_transform, df)) - abs(uv.x * uv.x - uv.y));
}
else
{
df = 2.0f * uv.x * du + 2.0f * uv.y * dv;
clip(dot(df, uv.zw));
clip(length(mul(i.stroke_transform, df)) - abs(uv.x * uv.x + uv.y * uv.y - 1.0f));
}
}
else
{
/* Evaluate the implicit form of the curve in texture space.
* "i.b.z" determines which side of the curve is shaded. */
if (!is_arc)
{
clip((i.b.x * i.b.x - i.b.y) * i.b.z);
}
else
{
clip((i.b.x * i.b.x + i.b.y * i.b.y - 1.0) * i.b.z);
}
}
return colour;
}
#endif
0x43425844
,
0xa8fee730
,
0x92fa2196
,
0xaf9f3eff
,
0x888d4048
,
0x00000001
,
0x00002000
,
0x00000003
,
0x0000002c
,
0x000000c4
,
0x000000f8
,
0x4e475349
,
0x00000090
,
0x00000004
,
0x00000008
,
0x00000068
,
0x00000000
,
0x00000000
,
0x00000003
,
0x00000000
,
0x00000303
,
0x00000077
,
0x00000000
,
0x00000000
,
0x00000003
,
0x00000001
,
0x00000f0f
,
0x0000007e
,
0x00000000
,
0x00000000
,
0x00000003
,
0x00000002
,
0x00000303
,
0x0000007e
,
0x00000001
,
0x00000000
,
0x00000003
,
0x00000003
,
0x00000303
,
0x4c524f57
,
0x4f505f44
,
0x49544953
,
0x42004e4f
,
0x45495a45
,
0x54530052
,
0x454b4f52
,
0x4152545f
,
0x4f46534e
,
0xab004d52
,
0x4e47534f
,
0x0000002c
,
0x00000001
,
0x00000008
,
0x00000020
,
0x00000000
,
0x00000000
,
0x00000003
,
0x00000000
,
0x0000000f
,
0x545f5653
,
0x65677261
,
0xabab0074
,
0x52444853
,
0x00001f00
,
0x00000040
,
0x000007c0
,
0x04000059
,
0x00208e46
,
0x00000000
,
0x00000009
,
0x0300005a
,
0x00106000
,
0x00000000
,
0x0300005a
,
0x00106000
,
0x00000001
,
0x04001858
,
0x00107000
,
0x00000000
,
0x00005555
,
0x04001858
,
0x00107000
,
0x00000001
,
0x00005555
,
0x04000858
,
0x00107000
,
0x00000002
,
0x00005555
,
0x04000858
,
0x00107000
,
0x00000003
,
0x00005555
,
0x03001062
,
0x00101032
,
0x00000000
,
0x03001062
,
0x001010f2
,
0x00000001
,
0x03000862
,
0x00101032
,
0x00000002
,
0x03000862
,
0x00101032
,
0x00000003
,
0x03000065
,
0x001020f2
,
0x00000000
,
0x02000068
,
0x0000000a
,
0x09000038
,
0x001000f2
,
0x00000000
,
0x00208556
,
0x00000000
,
0x00000001
,
0x00208e46
,
0x00000000
,
0x00000002
,
0x0404001f
,
0x0020800a
,
0x00000000
,
0x00000001
,
0x08000020
,
0x00100012
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000001
,
0x00004001
,
0x00000001
,
0x0304001f
,
0x0010000a
,
0x00000001
,
0x09000000
,
0x00100062
,
0x00000001
,
0x00101106
,
0x00000000
,
0x80208106
,
0x00000041
,
0x00000000
,
0x00000002
,
0x0a000000
,
0x00100032
,
0x00000002
,
0x80208046
,
0x00000041
,
0x00000000
,
0x00000002
,
0x00208ae6
,
0x00000000
,
0x00000002
,
0x0700000f
,
0x00100022
,
0x00000001
,
0x00100046
,
0x00000002
,
0x00100596
,
0x00000001
,
0x0700000f
,
0x00100042
,
0x00000001
,
0x00100046
,
0x00000002
,
0x00100046
,
0x00000002
,
0x0700000e
,
0x00100022
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0a00002d
,
0x001000f2
,
0x00000002
,
0x00004002
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00107e46
,
0x00000002
,
0x0a00002d
,
0x001000f2
,
0x00000003
,
0x00004002
,
0x00000001
,
0x00000001
,
0x00000001
,
0x00000001
,
0x00107e46
,
0x00000002
,
0x0700001d
,
0x00100042
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x0010000a
,
0x00000002
,
0x0304001f
,
0x0010002a
,
0x00000001
,
0x05000036
,
0x001000f2
,
0x00000004
,
0x00100e46
,
0x00000003
,
0x05000036
,
0x001000f2
,
0x00000005
,
0x00100e46
,
0x00000003
,
0x05000036
,
0x001000f2
,
0x00000006
,
0x00100e46
,
0x00000003
,
0x05000036
,
0x00100042
,
0x00000001
,
0x0010000a
,
0x00000002
,
0x05000036
,
0x00100082
,
0x00000001
,
0x00004001
,
0x00000001
,
0x05000036
,
0x00100022
,
0x00000002
,
0x00004001
,
0x00000000
,
0x01000030
,
0x08000050
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000003
,
0x05000036
,
0x00100022
,
0x00000002
,
0x00004001
,
0x00000000
,
0x03040003
,
0x0010002a
,
0x00000002
,
0x07000029
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000001
,
0x00004001
,
0x00000001
,
0x0700002d
,
0x001000f2
,
0x00000007
,
0x00100aa6
,
0x00000002
,
0x00107e46
,
0x00000002
,
0x0700001e
,
0x00100042
,
0x00000002
,
0x0010002a
,
0x00000002
,
0x00004001
,
0x00000001
,
0x0700002d
,
0x001000f2
,
0x00000008
,
0x00100aa6
,
0x00000002
,
0x00107e46
,
0x00000002
,
0x0700001d
,
0x00100042
,
0x00000002
,
0x0010001a
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0700001d
,
0x00100082
,
0x00000002
,
0x0010000a
,
0x00000007
,
0x0010001a
,
0x00000001
,
0x07000001
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000002
,
0x0010002a
,
0x00000002
,
0x0304001f
,
0x0010002a
,
0x00000002
,
0x08000000
,
0x00100082
,
0x00000002
,
0x8010002a
,
0x00000041
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x08000000
,
0x00100022
,
0x00000007
,
0x8010002a
,
0x00000041
,
0x00000001
,
0x0010000a
,
0x00000007
,
0x0700000e
,
0x00100082
,
0x00000002
,
0x0010003a
,
0x00000002
,
0x0010001a
,
0x00000007
,
0x08000000
,
0x001000f2
,
0x00000009
,
0x80100e46
,
0x00000041
,
0x00000005
,
0x00100e46
,
0x00000008
,
0x09000032
,
0x001000f2
,
0x00000009
,
0x00100ff6
,
0x00000002
,
0x00100e46
,
0x00000009
,
0x00100e46
,
0x00000005
,
0x05000036
,
0x001000f2
,
0x00000006
,
0x00100e46
,
0x00000008
,
0x05000036
,
0x00100022
,
0x00000002
,
0x00004001
,
0xffffffff
,
0x05000036
,
0x001000f2
,
0x00000004
,
0x00100e46
,
0x00000009
,
0x01000002
,
0x01000015
,
0x05000036
,
0x001000f2
,
0x00000005
,
0x00100e46
,
0x00000008
,
0x05000036
,
0x00100042
,
0x00000001
,
0x0010000a
,
0x00000007
,
0x0700001e
,
0x00100082
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x00004001
,
0x00000001
,
0x05000036
,
0x001000f2
,
0x00000006
,
0x00100e46
,
0x00000008
,
0x05000036
,
0x00100022
,
0x00000002
,
0x0010002a
,
0x00000002
,
0x01000016
,
0x09000037
,
0x001000f2
,
0x00000003
,
0x00100556
,
0x00000002
,
0x00100e46
,
0x00000004
,
0x00100e46
,
0x00000006
,
0x01000015
,
0x08000038
,
0x001000f2
,
0x00000000
,
0x00100e46
,
0x00000003
,
0x00208556
,
0x00000000
,
0x00000001
,
0x01000015
,
0x0300001f
,
0x0010000a
,
0x00000001
,
0x08000020
,
0x00100012
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000001
,
0x00004001
,
0x00000002
,
0x0304001f
,
0x0010000a
,
0x00000001
,
0x0900000f
,
0x00100012
,
0x00000002
,
0x00208046
,
0x00000000
,
0x00000003
,
0x00208046
,
0x00000000
,
0x00000003
,
0x0900000f
,
0x00100022
,
0x00000002
,
0x00208ae6
,
0x00000000
,
0x00000003
,
0x00208ae6
,
0x00000000
,
0x00000003
,
0x09000000
,
0x00100062
,
0x00000001
,
0x00208ba6
,
0x00000000
,
0x00000002
,
0x00208106
,
0x00000000
,
0x00000002
,
0x08000000
,
0x00100062
,
0x00000001
,
0x80100656
,
0x00000041
,
0x00000001
,
0x00101106
,
0x00000000
,
0x0800000f
,
0x00100012
,
0x00000003
,
0x00100596
,
0x00000001
,
0x00208046
,
0x00000000
,
0x00000003
,
0x0800000f
,
0x00100022
,
0x00000003
,
0x00100596
,
0x00000001
,
0x00208ae6
,
0x00000000
,
0x00000003
,
0x0700000e
,
0x00100062
,
0x00000001
,
0x00100106
,
0x00000003
,
0x00100106
,
0x00000002
,
0x0900000f
,
0x00100012
,
0x00000003
,
0x00208ae6
,
0x00000000
,
0x00000002
,
0x00208046
,
0x00000000
,
0x00000003
,
0x0900000f
,
0x00100022
,
0x00000003
,
0x00208ae6
,
0x00000000
,
0x00000002
,
0x00208ae6
,
0x00000000
,
0x00000003
,
0x0700000e
,
0x00100032
,
0x00000002
,
0x00100046
,
0x00000003
,
0x00100046
,
0x00000002
,
0x0700000f
,
0x00100082
,
0x00000001
,
0x00100596
,
0x00000001
,
0x00100596
,
0x00000001
,
0x0500004b
,
0x00100082
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x0700000f
,
0x00100022
,
0x00000001
,
0x00100596
,
0x00000001
,
0x00100046
,
0x00000002
,
0x0700000e
,
0x00100022
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x0700000f
,
0x00100042
,
0x00000001
,
0x00100046
,
0x00000002
,
0x00100046
,
0x00000002
,
0x07000000
,
0x00100042
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x00004001
,
0xbf800000
,
0x0a000032
,
0x00100042
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x8010002a
,
0x00000041
,
0x00000001
,
0x0500004b
,
0x00100042
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x08000000
,
0x00100022
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x8010001a
,
0x00000041
,
0x00000001
,
0x0700000e
,
0x00100022
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x0a00002d
,
0x001000f2
,
0x00000002
,
0x00004002
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00107e46
,
0x00000002
,
0x0a00002d
,
0x001000f2
,
0x00000003
,
0x00004002
,
0x00000001
,
0x00000001
,
0x00000001
,
0x00000001
,
0x00107e46
,
0x00000002
,
0x0700001d
,
0x00100042
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x0010000a
,
0x00000002
,
0x0304001f
,
0x0010002a
,
0x00000001
,
0x05000036
,
0x001000f2
,
0x00000004
,
0x00100e46
,
0x00000003
,
0x05000036
,
0x001000f2
,
0x00000005
,
0x00100e46
,
0x00000003
,
0x05000036
,
0x001000f2
,
0x00000006
,
0x00100e46
,
0x00000003
,
0x05000036
,
0x00100042
,
0x00000001
,
0x0010000a
,
0x00000002
,
0x05000036
,
0x00100082
,
0x00000001
,
0x00004001
,
0x00000001
,
0x05000036
,
0x00100022
,
0x00000002
,
0x00004001
,
0x00000000
,
0x01000030
,
0x08000050
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000004
,
0x05000036
,
0x00100022
,
0x00000002
,
0x00004001
,
0x00000000
,
0x03040003
,
0x0010002a
,
0x00000002
,
0x07000029
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000001
,
0x00004001
,
0x00000001
,
0x0700002d
,
0x001000f2
,
0x00000007
,
0x00100aa6
,
0x00000002
,
0x00107e46
,
0x00000002
,
0x0700001e
,
0x00100042
,
0x00000002
,
0x0010002a
,
0x00000002
,
0x00004001
,
0x00000001
,
0x0700002d
,
0x001000f2
,
0x00000008
,
0x00100aa6
,
0x00000002
,
0x00107e46
,
0x00000002
,
0x0700001d
,
0x00100042
,
0x00000002
,
0x0010001a
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0700001d
,
0x00100082
,
0x00000002
,
0x0010000a
,
0x00000007
,
0x0010001a
,
0x00000001
,
0x07000001
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000002
,
0x0010002a
,
0x00000002
,
0x0304001f
,
0x0010002a
,
0x00000002
,
0x08000000
,
0x00100082
,
0x00000002
,
0x8010002a
,
0x00000041
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x08000000
,
0x00100022
,
0x00000007
,
0x8010002a
,
0x00000041
,
0x00000001
,
0x0010000a
,
0x00000007
,
0x0700000e
,
0x00100082
,
0x00000002
,
0x0010003a
,
0x00000002
,
0x0010001a
,
0x00000007
,
0x08000000
,
0x001000f2
,
0x00000009
,
0x80100e46
,
0x00000041
,
0x00000005
,
0x00100e46
,
0x00000008
,
0x09000032
,
0x001000f2
,
0x00000009
,
0x00100ff6
,
0x00000002
,
0x00100e46
,
0x00000009
,
0x00100e46
,
0x00000005
,
0x05000036
,
0x001000f2
,
0x00000006
,
0x00100e46
,
0x00000008
,
0x05000036
,
0x00100022
,
0x00000002
,
0x00004001
,
0xffffffff
,
0x05000036
,
0x001000f2
,
0x00000004
,
0x00100e46
,
0x00000009
,
0x01000002
,
0x01000015
,
0x05000036
,
0x001000f2
,
0x00000005
,
0x00100e46
,
0x00000008
,
0x05000036
,
0x00100042
,
0x00000001
,
0x0010000a
,
0x00000007
,
0x0700001e
,
0x00100082
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x00004001
,
0x00000001
,
0x05000036
,
0x001000f2
,
0x00000006
,
0x00100e46
,
0x00000008
,
0x05000036
,
0x00100022
,
0x00000002
,
0x0010002a
,
0x00000002
,
0x01000016
,
0x09000037
,
0x001000f2
,
0x00000003
,
0x00100556
,
0x00000002
,
0x00100e46
,
0x00000004
,
0x00100e46
,
0x00000006
,
0x01000015
,
0x08000038
,
0x001000f2
,
0x00000000
,
0x00100e46
,
0x00000003
,
0x00208556
,
0x00000000
,
0x00000001
,
0x01000015
,
0x0300001f
,
0x0010000a
,
0x00000001
,
0x08000020
,
0x00100012
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000001
,
0x00004001
,
0x00000003
,
0x0304001f
,
0x0010000a
,
0x00000001
,
0x0800000f
,
0x00100022
,
0x00000001
,
0x00101046
,
0x00000000
,
0x00208046
,
0x00000000
,
0x00000002
,
0x08000000
,
0x00100012
,
0x00000002
,
0x0010001a
,
0x00000001
,
0x0020802a
,
0x00000000
,
0x00000002
,
0x0800000f
,
0x00100022
,
0x00000001
,
0x00101046
,
0x00000000
,
0x00208046
,
0x00000000
,
0x00000003
,
0x08000000
,
0x00100022
,
0x00000002
,
0x0010001a
,
0x00000001
,
0x0020802a
,
0x00000000
,
0x00000003
,
0x09000045
,
0x001000f2
,
0x00000002
,
0x00100046
,
0x00000002
,
0x00107e46
,
0x00000000
,
0x00106000
,
0x00000000
,
0x0a000037
,
0x00100082
,
0x00000002
,
0x0020803a
,
0x00000000
,
0x00000003
,
0x00004001
,
0x3f800000
,
0x0010003a
,
0x00000002
,
0x08000038
,
0x001000f2
,
0x00000000
,
0x00100e46
,
0x00000002
,
0x00208556
,
0x00000000
,
0x00000001
,
0x01000015
,
0x05000036
,
0x00100012
,
0x00000002
,
0x00004001
,
0x00000000
,
0x06000036
,
0x00100082
,
0x00000002
,
0x0020801a
,
0x00000000
,
0x00000001
,
0x09000037
,
0x001000f2
,
0x00000000
,
0x00100006
,
0x00000001
,
0x00100e46
,
0x00000000
,
0x00100c06
,
0x00000002
,
0x01000015
,
0x01000015
,
0x01000015
,
0x0800004f
,
0x00100012
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000005
,
0x00004001
,
0x00000004
,
0x0304001f
,
0x0010000a
,
0x00000001
,
0x09000038
,
0x00100012
,
0x00000001
,
0x0020801a
,
0x00000000
,
0x00000005
,
0x0020803a
,
0x00000000
,
0x00000006
,
0x0404001f
,
0x0020800a
,
0x00000000
,
0x00000005
,
0x08000020
,
0x00100022
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000005
,
0x00004001
,
0x00000001
,
0x0304001f
,
0x0010001a
,
0x00000001
,
0x09000000
,
0x001000c2
,
0x00000001
,
0x00101406
,
0x00000000
,
0x80208406
,
0x00000041
,
0x00000000
,
0x00000006
,
0x0a000000
,
0x00100032
,
0x00000002
,
0x80208046
,
0x00000041
,
0x00000000
,
0x00000006
,
0x00208ae6
,
0x00000000
,
0x00000006
,
0x0700000f
,
0x00100042
,
0x00000001
,
0x00100046
,
0x00000002
,
0x00100ae6
,
0x00000001
,
0x0700000f
,
0x00100082
,
0x00000001
,
0x00100046
,
0x00000002
,
0x00100046
,
0x00000002
,
0x0700000e
,
0x00100042
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x0a00002d
,
0x001000f2
,
0x00000002
,
0x00004002
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00107e46
,
0x00000003
,
0x0a00002d
,
0x001000f2
,
0x00000003
,
0x00004002
,
0x00000001
,
0x00000001
,
0x00000001
,
0x00000001
,
0x00107e46
,
0x00000003
,
0x0700001d
,
0x00100082
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0010000a
,
0x00000002
,
0x0304001f
,
0x0010003a
,
0x00000001
,
0x05000036
,
0x00100082
,
0x00000001
,
0x0010003a
,
0x00000003
,
0x05000036
,
0x00100062
,
0x00000002
,
0x00100ff6
,
0x00000003
,
0x05000036
,
0x00100082
,
0x00000002
,
0x0010000a
,
0x00000002
,
0x08000036
,
0x00100032
,
0x00000003
,
0x00004002
,
0x00000001
,
0x00000000
,
0x00000000
,
0x00000000
,
0x01000030
,
0x08000050
,
0x00100042
,
0x00000003
,
0x0010000a
,
0x00000003
,
0x0020800a
,
0x00000000
,
0x00000007
,
0x05000036
,
0x00100022
,
0x00000003
,
0x00004001
,
0x00000000
,
0x03040003
,
0x0010002a
,
0x00000003
,
0x07000029
,
0x00100042
,
0x00000003
,
0x0010000a
,
0x00000003
,
0x00004001
,
0x00000001
,
0x0700002d
,
0x001000f2
,
0x00000004
,
0x00100aa6
,
0x00000003
,
0x00107e46
,
0x00000003
,
0x0700001e
,
0x00100042
,
0x00000003
,
0x0010002a
,
0x00000003
,
0x00004001
,
0x00000001
,
0x0700002d
,
0x001000f2
,
0x00000005
,
0x00100aa6
,
0x00000003
,
0x00107e46
,
0x00000003
,
0x0700001d
,
0x00100042
,
0x00000003
,
0x0010002a
,
0x00000001
,
0x0010003a
,
0x00000002
,
0x0700001d
,
0x00100022
,
0x00000004
,
0x0010000a
,
0x00000004
,
0x0010002a
,
0x00000001
,
0x07000001
,
0x00100042
,
0x00000003
,
0x0010002a
,
0x00000003
,
0x0010001a
,
0x00000004
,
0x0304001f
,
0x0010002a
,
0x00000003
,
0x08000000
,
0x00100022
,
0x00000004
,
0x0010002a
,
0x00000001
,
0x8010003a
,
0x00000041
,
0x00000002
,
0x08000000
,
0x00100042
,
0x00000004
,
0x8010003a
,
0x00000041
,
0x00000002
,
0x0010000a
,
0x00000004
,
0x0700000e
,
0x00100022
,
0x00000004
,
0x0010001a
,
0x00000004
,
0x0010002a
,
0x00000004
,
0x08000000
,
0x00100042
,
0x00000004
,
0x8010001a
,
0x00000041
,
0x00000002
,
0x0010003a
,
0x00000005
,
0x09000032
,
0x00100022
,
0x00000004
,
0x0010001a
,
0x00000004
,
0x0010002a
,
0x00000004
,
0x0010001a
,
0x00000002
,
0x05000036
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000005
,
0x05000036
,
0x00100022
,
0x00000003
,
0x00004001
,
0xffffffff
,
0x05000036
,
0x00100082
,
0x00000001
,
0x0010001a
,
0x00000004
,
0x01000002
,
0x01000015
,
0x05000036
,
0x00100022
,
0x00000002
,
0x0010003a
,
0x00000005
,
0x05000036
,
0x00100082
,
0x00000002
,
0x0010000a
,
0x00000004
,
0x0700001e
,
0x00100012
,
0x00000003
,
0x0010000a
,
0x00000003
,
0x00004001
,
0x00000001
,
0x05000036
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000005
,
0x05000036
,
0x00100032
,
0x00000003
,
0x00100086
,
0x00000003
,
0x01000016
,
0x09000037
,
0x00100042
,
0x00000001
,
0x0010001a
,
0x00000003
,
0x0010003a
,
0x00000001
,
0x0010002a
,
0x00000002
,
0x01000012
,
0x05000036
,
0x00100042
,
0x00000001
,
0x0010003a
,
0x00000003
,
0x01000015
,
0x08000038
,
0x00100012
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0020801a
,
0x00000000
,
0x00000005
,
0x01000015
,
0x0300001f
,
0x0010001a
,
0x00000001
,
0x08000020
,
0x00100022
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000005
,
0x00004001
,
0x00000002
,
0x0304001f
,
0x0010001a
,
0x00000001
,
0x0900000f
,
0x00100012
,
0x00000002
,
0x00208046
,
0x00000000
,
0x00000007
,
0x00208046
,
0x00000000
,
0x00000007
,
0x0900000f
,
0x00100022
,
0x00000002
,
0x00208ae6
,
0x00000000
,
0x00000007
,
0x00208ae6
,
0x00000000
,
0x00000007
,
0x09000000
,
0x001000c2
,
0x00000001
,
0x00208ea6
,
0x00000000
,
0x00000006
,
0x00208406
,
0x00000000
,
0x00000006
,
0x08000000
,
0x001000c2
,
0x00000001
,
0x80100ea6
,
0x00000041
,
0x00000001
,
0x00101406
,
0x00000000
,
0x0800000f
,
0x00100012
,
0x00000003
,
0x00100ae6
,
0x00000001
,
0x00208046
,
0x00000000
,
0x00000007
,
0x0800000f
,
0x00100022
,
0x00000003
,
0x00100ae6
,
0x00000001
,
0x00208ae6
,
0x00000000
,
0x00000007
,
0x0700000e
,
0x001000c2
,
0x00000001
,
0x00100406
,
0x00000003
,
0x00100406
,
0x00000002
,
0x0900000f
,
0x00100012
,
0x00000003
,
0x00208ae6
,
0x00000000
,
0x00000006
,
0x00208046
,
0x00000000
,
0x00000007
,
0x0900000f
,
0x00100022
,
0x00000003
,
0x00208ae6
,
0x00000000
,
0x00000006
,
0x00208ae6
,
0x00000000
,
0x00000007
,
0x0700000e
,
0x00100032
,
0x00000002
,
0x00100046
,
0x00000003
,
0x00100046
,
0x00000002
,
0x0700000f
,
0x00100042
,
0x00000002
,
0x00100ae6
,
0x00000001
,
0x00100ae6
,
0x00000001
,
0x0500004b
,
0x00100042
,
0x00000002
,
0x0010002a
,
0x00000002
,
0x0700000f
,
0x00100042
,
0x00000001
,
0x00100ae6
,
0x00000001
,
0x00100046
,
0x00000002
,
0x0700000e
,
0x00100042
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0010002a
,
0x00000002
,
0x0700000f
,
0x00100082
,
0x00000001
,
0x00100046
,
0x00000002
,
0x00100046
,
0x00000002
,
0x07000000
,
0x00100082
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x00004001
,
0xbf800000
,
0x0a000032
,
0x00100082
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x8010003a
,
0x00000041
,
0x00000001
,
0x0500004b
,
0x00100082
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x08000000
,
0x00100042
,
0x00000001
,
0x0010003a
,
0x00000001
,
0x8010002a
,
0x00000041
,
0x00000001
,
0x0700000e
,
0x00100042
,
0x00000001
,
0x0010002a
,
0x00000002
,
0x0010002a
,
0x00000001
,
0x0a00002d
,
0x001000f2
,
0x00000002
,
0x00004002
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
0x00107e46
,
0x00000003
,
0x0a00002d
,
0x001000f2
,
0x00000003
,
0x00004002
,
0x00000001
,
0x00000001
,
0x00000001
,
0x00000001
,
0x00107e46
,
0x00000003
,
0x0700001d
,
0x00100082
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0010000a
,
0x00000002
,
0x0304001f
,
0x0010003a
,
0x00000001
,
0x05000036
,
0x00100082
,
0x00000001
,
0x0010003a
,
0x00000003
,
0x05000036
,
0x00100062
,
0x00000002
,
0x00100ff6
,
0x00000003
,
0x05000036
,
0x00100082
,
0x00000002
,
0x0010000a
,
0x00000002
,
0x08000036
,
0x00100032
,
0x00000003
,
0x00004002
,
0x00000001
,
0x00000000
,
0x00000000
,
0x00000000
,
0x01000030
,
0x08000050
,
0x00100042
,
0x00000003
,
0x0010000a
,
0x00000003
,
0x0020800a
,
0x00000000
,
0x00000008
,
0x05000036
,
0x00100022
,
0x00000003
,
0x00004001
,
0x00000000
,
0x03040003
,
0x0010002a
,
0x00000003
,
0x07000029
,
0x00100042
,
0x00000003
,
0x0010000a
,
0x00000003
,
0x00004001
,
0x00000001
,
0x0700002d
,
0x001000f2
,
0x00000004
,
0x00100aa6
,
0x00000003
,
0x00107e46
,
0x00000003
,
0x0700001e
,
0x00100042
,
0x00000003
,
0x0010002a
,
0x00000003
,
0x00004001
,
0x00000001
,
0x0700002d
,
0x001000f2
,
0x00000005
,
0x00100aa6
,
0x00000003
,
0x00107e46
,
0x00000003
,
0x0700001d
,
0x00100042
,
0x00000003
,
0x0010002a
,
0x00000001
,
0x0010003a
,
0x00000002
,
0x0700001d
,
0x00100022
,
0x00000004
,
0x0010000a
,
0x00000004
,
0x0010002a
,
0x00000001
,
0x07000001
,
0x00100042
,
0x00000003
,
0x0010002a
,
0x00000003
,
0x0010001a
,
0x00000004
,
0x0304001f
,
0x0010002a
,
0x00000003
,
0x08000000
,
0x00100022
,
0x00000004
,
0x0010002a
,
0x00000001
,
0x8010003a
,
0x00000041
,
0x00000002
,
0x08000000
,
0x00100042
,
0x00000004
,
0x8010003a
,
0x00000041
,
0x00000002
,
0x0010000a
,
0x00000004
,
0x0700000e
,
0x00100022
,
0x00000004
,
0x0010001a
,
0x00000004
,
0x0010002a
,
0x00000004
,
0x08000000
,
0x00100042
,
0x00000004
,
0x8010001a
,
0x00000041
,
0x00000002
,
0x0010003a
,
0x00000005
,
0x09000032
,
0x00100022
,
0x00000004
,
0x0010001a
,
0x00000004
,
0x0010002a
,
0x00000004
,
0x0010001a
,
0x00000002
,
0x05000036
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000005
,
0x05000036
,
0x00100022
,
0x00000003
,
0x00004001
,
0xffffffff
,
0x05000036
,
0x00100082
,
0x00000001
,
0x0010001a
,
0x00000004
,
0x01000002
,
0x01000015
,
0x05000036
,
0x00100022
,
0x00000002
,
0x0010003a
,
0x00000005
,
0x05000036
,
0x00100082
,
0x00000002
,
0x0010000a
,
0x00000004
,
0x0700001e
,
0x00100012
,
0x00000003
,
0x0010000a
,
0x00000003
,
0x00004001
,
0x00000001
,
0x05000036
,
0x00100042
,
0x00000002
,
0x0010003a
,
0x00000005
,
0x05000036
,
0x00100032
,
0x00000003
,
0x00100086
,
0x00000003
,
0x01000016
,
0x09000037
,
0x00100042
,
0x00000001
,
0x0010001a
,
0x00000003
,
0x0010003a
,
0x00000001
,
0x0010002a
,
0x00000002
,
0x01000012
,
0x05000036
,
0x00100042
,
0x00000001
,
0x0010003a
,
0x00000003
,
0x01000015
,
0x08000038
,
0x00100012
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0020801a
,
0x00000000
,
0x00000005
,
0x01000015
,
0x0300001f
,
0x0010001a
,
0x00000001
,
0x08000020
,
0x00100022
,
0x00000001
,
0x0020800a
,
0x00000000
,
0x00000005
,
0x00004001
,
0x00000003
,
0x0304001f
,
0x0010001a
,
0x00000001
,
0x0800000f
,
0x00100042
,
0x00000001
,
0x00101046
,
0x00000000
,
0x00208046
,
0x00000000
,
0x00000006
,
0x08000000
,
0x00100012
,
0x00000002
,
0x0010002a
,
0x00000001
,
0x0020802a
,
0x00000000
,
0x00000006
,
0x0800000f
,
0x00100042
,
0x00000001
,
0x00101046
,
0x00000000
,
0x00208046
,
0x00000000
,
0x00000007
,
0x08000000
,
0x00100022
,
0x00000002
,
0x0010002a
,
0x00000001
,
0x0020802a
,
0x00000000
,
0x00000007
,
0x09000045
,
0x001000f2
,
0x00000002
,
0x00100046
,
0x00000002
,
0x00107e46
,
0x00000001
,
0x00106000
,
0x00000001
,
0x0a000037
,
0x00100042
,
0x00000001
,
0x0020803a
,
0x00000000
,
0x00000007
,
0x00004001
,
0x3f800000
,
0x0010003a
,
0x00000002
,
0x08000038
,
0x00100012
,
0x00000001
,
0x0010002a
,
0x00000001
,
0x0020801a
,
0x00000000
,
0x00000005
,
0x01000015
,
0x0a000037
,
0x00100012
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x0010000a
,
0x00000001
,
0x0020801a
,
0x00000000
,
0x00000005
,
0x01000015
,
0x01000015
,
0x01000015
,
0x07000038
,
0x001020f2
,
0x00000000
,
0x00100e46
,
0x00000000
,
0x00100006
,
0x00000001
,
0x01000012
,
0x05000036
,
0x001020f2
,
0x00000000
,
0x00100e46
,
0x00000000
,
0x01000015
,
0x0404001f
,
0x0020800a
,
0x00000000
,
0x00000000
,
0x0500000b
,
0x00100032
,
0x00000000
,
0x00101046
,
0x00000001
,
0x0500000c
,
0x001000c2
,
0x00000000
,
0x00101406
,
0x00000001
,
0x08000027
,
0x00100012
,
0x00000001
,
0x0020801a
,
0x00000000
,
0x00000000
,
0x00004001
,
0x00000000
,
0x0500003b
,
0x00100022
,
0x00000001
,
0x0010000a
,
0x00000001
,
0x07000000
,
0x001000c2
,
0x00000001
,
0x00101406
,
0x00000001
,
0x00101406
,
0x00000001
,
0x07000038
,
0x001000f2
,
0x00000002
,
0x00100d86
,
0x00000000
,
0x00100fa6
,
0x00000001
,
0x0a000032
,
0x00100032
,
0x00000000
,
0x00100aa6
,
0x00000001
,
0x00100086
,
0x00000000
,
0x801005d6
,
0x00000041
,
0x00000000
,
0x0700000f
,
0x00100042
,
0x00000000
,
0x00100046
,
0x00000000
,
0x00101ae6
,
0x00000001
,
0x07000031
,
0x00100042
,
0x00000000
,
0x0010002a
,
0x00000000
,
0x00004001
,
0x00000000
,
0x07000001
,
0x00100042
,
0x00000000
,
0x0010001a
,
0x00000001
,
0x0010002a
,
0x00000000
,
0x0304000d
,
0x0010002a
,
0x00000000
,
0x07000038
,
0x00100062
,
0x00000000
,
0x00100556
,
0x00000000
,
0x00101106
,
0x00000003
,
0x09000032
,
0x00100032
,
0x00000000
,
0x00101046
,
0x00000002
,
0x00100006
,
0x00000000
,
0x00100596
,
0x00000000
,
0x0700000f
,
0x00100012
,
0x00000000
,
0x00100046
,
0x00000000
,
0x00100046
,
0x00000000
,
0x0500004b
,
0x00100012
,
0x00000000
,
0x0010000a
,
0x00000000
,
0x07000038
,
0x00100062
,
0x00000000
,
0x00101106
,
0x00000001
,
0x00101106
,
0x00000001
,
0x0a000032
,
0x00100082
,
0x00000000
,
0x0010100a
,
0x00000001
,
0x0010100a
,
0x00000001
,
0x8010101a
,
0x00000041
,
0x00000001
,
0x08000000
,
0x00100012
,
0x00000000
,
0x8010003a
,
0x000000c1
,
0x00000000
,
0x0010000a
,
0x00000000
,
0x07000031
,
0x00100012
,
0x00000000
,
0x0010000a
,
0x00000000
,
0x00004001
,
0x00000000
,
0x07000001
,
0x00100012
,
0x00000000
,
0x0010001a
,
0x00000001
,
0x0010000a
,
0x00000000
,
0x0304000d
,
0x0010000a
,
0x00000000
,
0x07000000
,
0x00100092
,
0x00000000
,
0x00100ea6
,
0x00000002
,
0x00100406
,
0x00000002
,
0x0700000f
,
0x00100022
,
0x00000001
,
0x001000c6
,
0x00000000
,
0x00101ae6
,
0x00000001
,
0x07000031
,
0x00100022
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x00004001
,
0x00000000
,
0x07000001
,
0x00100022
,
0x00000001
,
0x0010000a
,
0x00000001
,
0x0010001a
,
0x00000001
,
0x0304000d
,
0x0010001a
,
0x00000001
,
0x07000038
,
0x00100062
,
0x00000001
,
0x00100ff6
,
0x00000000
,
0x00101106
,
0x00000003
,
0x09000032
,
0x00100092
,
0x00000000
,
0x00101406
,
0x00000002
,
0x00100006
,
0x00000000
,
0x00100956
,
0x00000001
,
0x0700000f
,
0x00100012
,
0x00000000
,
0x001000c6
,
0x00000000
,
0x001000c6
,
0x00000000
,
0x0500004b
,
0x00100012
,
0x00000000
,
0x0010000a
,
0x00000000
,
0x07000000
,
0x00100022
,
0x00000000
,
0x0010002a
,
0x00000000
,
0x0010001a
,
0x00000000
,
0x07000000
,
0x00100022
,
0x00000000
,
0x0010001a
,
0x00000000
,
0x00004001
,
0xbf800000
,
0x08000000
,
0x00100012
,
0x00000000
,
0x8010001a
,
0x000000c1
,
0x00000000
,
0x0010000a
,
0x00000000
,
0x07000031
,
0x00100012
,
0x00000000
,
0x0010000a
,
0x00000000
,
0x00004001
,
0x00000000
,
0x07000001
,
0x00100012
,
0x00000000
,
0x0010000a
,
0x00000001
,
0x0010000a
,
0x00000000
,
0x0304000d
,
0x0010000a
,
0x00000000
,
0x01000012
,
0x08000027
,
0x00100012
,
0x00000000
,
0x0020801a
,
0x00000000
,
0x00000000
,
0x00004001
,
0x00000000
,
0x0500003b
,
0x00100022
,
0x00000000
,
0x0010000a
,
0x00000000
,
0x07000038
,
0x001000c2
,
0x00000000
,
0x00101406
,
0x00000001
,
0x00101406
,
0x00000001
,
0x0a000032
,
0x00100012
,
0x00000001
,
0x0010100a
,
0x00000001
,
0x0010100a
,
0x00000001
,
0x8010101a
,
0x00000041
,
0x00000001
,
0x07000038
,
0x00100012
,
0x00000001
,
0x0010000a
,
0x00000001
,
0x0010102a
,
0x00000001
,
0x07000031
,
0x00100012
,
0x00000001
,
0x0010000a
,
0x00000001
,
0x00004001
,
0x00000000
,
0x07000001
,
0x00100022
,
0x00000000
,
0x0010001a
,
0x00000000
,
0x0010000a
,
0x00000001
,
0x0304000d
,
0x0010001a
,
0x00000000
,
0x07000000
,
0x00100022
,
0x00000000
,
0x0010003a
,
0x00000000
,
0x0010002a
,
0x00000000
,
0x07000000
,
0x00100022
,
0x00000000
,
0x0010001a
,
0x00000000
,
0x00004001
,
0xbf800000
,
0x07000038
,
0x00100022
,
0x00000000
,
0x0010001a
,
0x00000000
,
0x0010102a
,
0x00000001
,
0x07000031
,
0x00100022
,
0x00000000
,
0x0010001a
,
0x00000000
,
0x00004001
,
0x00000000
,
0x07000001
,
0x00100012
,
0x00000000
,
0x0010000a
,
0x00000000
,
0x0010001a
,
0x00000000
,
0x0304000d
,
0x0010000a
,
0x00000000
,
0x01000015
,
0x0100003e
,
};
static
const
char
ps_code
[]
=
"#define BRUSH_TYPE_SOLID 0
\n
"
"#define BRUSH_TYPE_LINEAR 1
\n
"
"#define BRUSH_TYPE_RADIAL 2
\n
"
"#define BRUSH_TYPE_BITMAP 3
\n
"
"#define BRUSH_TYPE_COUNT 4
\n
"
"
\n
"
"bool outline;
\n
"
"bool is_arc;
\n
"
"struct brush
\n
"
"{
\n
"
" uint type;
\n
"
" float opacity;
\n
"
" float4 data[3];
\n
"
"} colour_brush, opacity_brush;
\n
"
"
\n
"
"SamplerState s0, s1;
\n
"
"Texture2D t0, t1;
\n
"
"Buffer<float4> b0, b1;
\n
"
"
\n
"
"struct input
\n
"
"{
\n
"
" float2 p : WORLD_POSITION;
\n
"
" float4 b : BEZIER;
\n
"
" nointerpolation float2x2 stroke_transform : STROKE_TRANSFORM;
\n
"
"};
\n
"
"
\n
"
"float4 sample_gradient(Buffer<float4> gradient, uint stop_count, float position)
\n
"
"{
\n
"
" float4 c_low, c_high;
\n
"
" float p_low, p_high;
\n
"
" uint i;
\n
"
"
\n
"
" p_low = gradient.Load(0).x;
\n
"
" c_low = gradient.Load(1);
\n
"
" c_high = c_low;
\n
"
"
\n
"
" if (position < p_low)
\n
"
" return c_low;
\n
"
"
\n
"
" for (i = 1; i < stop_count; ++i)
\n
"
" {
\n
"
" p_high = gradient.Load(i * 2).x;
\n
"
" c_high = gradient.Load(i * 2 + 1);
\n
"
"
\n
"
" if (position >= p_low && position <= p_high)
\n
"
" return lerp(c_low, c_high, (position - p_low) / (p_high - p_low));
\n
"
"
\n
"
" p_low = p_high;
\n
"
" c_low = c_high;
\n
"
" }
\n
"
"
\n
"
" return c_high;
\n
"
"}
\n
"
"
\n
"
"float4 brush_linear(struct brush brush, Buffer<float4> gradient, float2 position)
\n
"
"{
\n
"
" float2 start, end, v_p, v_q;
\n
"
" uint stop_count;
\n
"
" float p;
\n
"
"
\n
"
" start = brush.data[0].xy;
\n
"
" end = brush.data[0].zw;
\n
"
" stop_count = asuint(brush.data[1].x);
\n
"
"
\n
"
" v_p = position - start;
\n
"
" v_q = end - start;
\n
"
" p = dot(v_q, v_p) / dot(v_q, v_q);
\n
"
"
\n
"
" return sample_gradient(gradient, stop_count, p);
\n
"
"}
\n
"
"
\n
"
"float4 brush_radial(struct brush brush, Buffer<float4> gradient, float2 position)
\n
"
"{
\n
"
" float2 centre, offset, ra, rb, v_p, v_q, r;
\n
"
" float b, c, l, t;
\n
"
" uint stop_count;
\n
"
"
\n
"
" centre = brush.data[0].xy;
\n
"
" offset = brush.data[0].zw;
\n
"
" ra = brush.data[1].xy;
\n
"
" rb = brush.data[1].zw;
\n
"
" stop_count = asuint(brush.data[2].x);
\n
"
"
\n
"
" /* Project onto ra, rb. */
\n
"
" r = float2(dot(ra, ra), dot(rb, rb));
\n
"
" v_p = position - (centre + offset);
\n
"
" v_p = float2(dot(v_p, ra), dot(v_p, rb)) / r;
\n
"
" v_q = float2(dot(offset, ra), dot(offset, rb)) / r;
\n
"
"
\n
"
" /* ‖t·p̂ + q⃑‖ = 1
\n
"
" * (t·p̂ + q⃑) · (t·p̂ + q⃑) = 1
\n
"
" * t² + 2·(p̂·q⃑)·t + (q⃑·q⃑) = 1
\n
"
" *
\n
"
" * b = p̂·q⃑
\n
"
" * c = q⃑·q⃑ - 1
\n
"
" * t = -b + √(b² - c) */
\n
"
" l = length(v_p);
\n
"
" b = dot(v_p, v_q) / l;
\n
"
" c = dot(v_q, v_q) - 1.0;
\n
"
" t = -b + sqrt(b * b - c);
\n
"
"
\n
"
" return sample_gradient(gradient, stop_count, l / t);
\n
"
"}
\n
"
"
\n
"
"float4 brush_bitmap(struct brush brush, Texture2D t, SamplerState s, float2 position)
\n
"
"{
\n
"
" float3 transform[2];
\n
"
" bool ignore_alpha;
\n
"
" float2 texcoord;
\n
"
" float4 colour;
\n
"
"
\n
"
" transform[0] = brush.data[0].xyz;
\n
"
" transform[1] = brush.data[1].xyz;
\n
"
" ignore_alpha = asuint(brush.data[1].w);
\n
"
"
\n
"
" texcoord.x = dot(position.xy, transform[0].xy) + transform[0].z;
\n
"
" texcoord.y = dot(position.xy, transform[1].xy) + transform[1].z;
\n
"
" colour = t.Sample(s, texcoord);
\n
"
" if (ignore_alpha)
\n
"
" colour.a = 1.0;
\n
"
" return colour;
\n
"
"}
\n
"
"
\n
"
"float4 sample_brush(struct brush brush, Texture2D t, SamplerState s, Buffer<float4> b, float2 position)
\n
"
"{
\n
"
" if (brush.type == BRUSH_TYPE_SOLID)
\n
"
" return brush.data[0] * brush.opacity;
\n
"
" if (brush.type == BRUSH_TYPE_LINEAR)
\n
"
" return brush_linear(brush, b, position) * brush.opacity;
\n
"
" if (brush.type == BRUSH_TYPE_RADIAL)
\n
"
" return brush_radial(brush, b, position) * brush.opacity;
\n
"
" if (brush.type == BRUSH_TYPE_BITMAP)
\n
"
" return brush_bitmap(brush, t, s, position) * brush.opacity;
\n
"
" return float4(0.0, 0.0, 0.0, brush.opacity);
\n
"
"}
\n
"
"
\n
"
"float4 main(struct input i) : SV_Target
\n
"
"{
\n
"
" float4 colour;
\n
"
"
\n
"
" colour = sample_brush(colour_brush, t0, s0, b0, i.p);
\n
"
" if (opacity_brush.type < BRUSH_TYPE_COUNT)
\n
"
" colour *= sample_brush(opacity_brush, t1, s1, b1, i.p).a;
\n
"
"
\n
"
" if (outline)
\n
"
" {
\n
"
" float2 du, dv, df;
\n
"
" float4 uv;
\n
"
"
\n
"
" /* Evaluate the implicit form of the curve (u² - v = 0
\n
"
" * for Béziers, u² + v² - 1 = 0 for arcs) in texture
\n
"
" * space, using the screen-space partial derivatives
\n
"
" * to convert the calculated distance to object space.
\n
"
" *
\n
"
" * d(x, y) = |f(x, y)| / ‖∇f(x, y)‖
\n
"
" * = |f(x, y)| / √((∂f/∂x)² + (∂f/∂y)²)
\n
"
" *
\n
"
" * For Béziers:
\n
"
" * f(x, y) = u(x, y)² - v(x, y)
\n
"
" * ∂f/∂x = 2u · ∂u/∂x - ∂v/∂x
\n
"
" * ∂f/∂y = 2u · ∂u/∂y - ∂v/∂y
\n
"
" *
\n
"
" * For arcs:
\n
"
" * f(x, y) = u(x, y)² + v(x, y)² - 1
\n
"
" * ∂f/∂x = 2u · ∂u/∂x + 2v · ∂v/∂x
\n
"
" * ∂f/∂y = 2u · ∂u/∂y + 2v · ∂v/∂y */
\n
"
" uv = i.b;
\n
"
" du = float2(ddx(uv.x), ddy(uv.x));
\n
"
" dv = float2(ddx(uv.y), ddy(uv.y));
\n
"
"
\n
"
" if (!is_arc)
\n
"
" {
\n
"
" df = 2.0f * uv.x * du - dv;
\n
"
"
\n
"
" clip(dot(df, uv.zw));
\n
"
" clip(length(mul(i.stroke_transform, df)) - abs(uv.x * uv.x - uv.y));
\n
"
" }
\n
"
" else
\n
"
" {
\n
"
" df = 2.0f * uv.x * du + 2.0f * uv.y * dv;
\n
"
"
\n
"
" clip(dot(df, uv.zw));
\n
"
" clip(length(mul(i.stroke_transform, df)) - abs(uv.x * uv.x + uv.y * uv.y - 1.0f));
\n
"
" }
\n
"
" }
\n
"
" else
\n
"
" {
\n
"
" /* Evaluate the implicit form of the curve in texture space.
\n
"
" *
\"
i.b.z
\"
determines which side of the curve is shaded. */
\n
"
" if (!is_arc)
\n
"
" {
\n
"
" clip((i.b.x * i.b.x - i.b.y) * i.b.z);
\n
"
" }
\n
"
" else
\n
"
" {
\n
"
" clip((i.b.x * i.b.x + i.b.y * i.b.y - 1.0) * i.b.z);
\n
"
" }
\n
"
" }
\n
"
"
\n
"
" return colour;
\n
"
"}
\n
"
;
static
const
struct
shape_info
{
enum
d2d_shape_type
shape_type
;
...
...
@@ -4005,7 +3746,6 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
shape_info
);
++
i
)
{
const
struct
shape_info
*
si
=
&
shape_info
[
i
];
ID3D10Blob
*
compiled
;
if
(
FAILED
(
hr
=
D3DCompile
(
si
->
vs_code
,
si
->
vs_code_size
,
si
->
name
,
NULL
,
NULL
,
"main"
,
"vs_4_0"
,
0
,
0
,
&
compiled
,
NULL
)))
...
...
@@ -4048,13 +3788,23 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
goto
err
;
}
if
(
FAILED
(
hr
=
D3DCompile
(
ps_code
,
sizeof
(
ps_code
)
-
1
,
"ps"
,
NULL
,
NULL
,
"main"
,
"ps_4_0"
,
0
,
0
,
&
compiled
,
NULL
)))
{
WARN
(
"Failed to compile the pixel shader, hr %#lx.
\n
"
,
hr
);
goto
err
;
}
if
(
FAILED
(
hr
=
ID3D11Device1_CreatePixelShader
(
render_target
->
d3d_device
,
ps_code
,
sizeof
(
ps_code
),
NULL
,
&
render_target
->
ps
)))
ID3D10Blob_GetBufferPointer
(
compiled
),
ID3D10Blob_GetBufferSize
(
compiled
),
NULL
,
&
render_target
->
ps
)))
{
WARN
(
"Failed to create pixel shader, hr %#lx.
\n
"
,
hr
);
ID3D10Blob_Release
(
compiled
);
goto
err
;
}
ID3D10Blob_Release
(
compiled
);
buffer_desc
.
ByteWidth
=
sizeof
(
struct
d2d_ps_cb
);
buffer_desc
.
Usage
=
D3D11_USAGE_DYNAMIC
;
buffer_desc
.
BindFlags
=
D3D11_BIND_CONSTANT_BUFFER
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment