summaryrefslogtreecommitdiffstats
path: root/baseline/source/epic/epic.c
diff options
context:
space:
mode:
Diffstat (limited to 'baseline/source/epic/epic.c')
-rw-r--r--baseline/source/epic/epic.c1141
1 files changed, 1141 insertions, 0 deletions
diff --git a/baseline/source/epic/epic.c b/baseline/source/epic/epic.c
new file mode 100644
index 0000000..13ba442
--- /dev/null
+++ b/baseline/source/epic/epic.c
@@ -0,0 +1,1141 @@
1/*
2
3 This program is part of the TACLeBench benchmark suite.
4 Version V 2.0
5
6 Name: epic
7
8 Author: Designed by Eero P. Simoncelli and Edward H. Adelson
9 Written by Eero P. Simoncelli
10 Developed at the Vision Science Group, The Media Laboratory
11 Copyright 1989, Massachusetts Institute of Technology
12 All rights reserved.
13
14 Function: Efficient Pyramid Image Coder
15
16 Source: MediaBench
17
18
19 Original name: epic
20
21 Changes: no major functional changes
22
23 License:
24 Permission to use, copy, or modify this software and its documentation
25 for educational and research purposes only and without fee is hereby
26 granted, provided that this copyright notice appear on all copies and
27 supporting documentation. For any other uses of this software, in
28 original or modified form, including but not limited to distribution
29 in whole or in part, specific prior permission must be obtained from
30 M.I.T. and the authors. These programs shall not be used, rewritten,
31 or adapted as the basis of a commercial software or hardware product
32 without first obtaining appropriate licenses from M.I.T. M.I.T. makes
33 no representations about the suitability of this software for any
34 purpose. It is provided "as is" without express or implied warranty.
35*/
36
37
38#include "../extra.h"
39#include "epic.h"
40
41#define X_SIZE 64
42#define Y_SIZE 64
43
44float epic_image[] = {
45 0x89, 0x88, 0x87, 0x86, 0x89, 0x87, 0x84, 0x86,
46 0x83, 0x89, 0x82, 0x83, 0x84, 0x81, 0x80, 0x80,
47 0x81, 0x83, 0x88, 0x8A, 0x8E, 0x90, 0x96, 0x98,
48 0x95, 0x92, 0x93, 0x88, 0x78, 0x7B, 0x60, 0x52,
49 0x41, 0x3F, 0x3A, 0x46, 0x46, 0x48, 0x49, 0x48,
50 0x4F, 0x4A, 0x49, 0x50, 0x4C, 0x4B, 0x4D, 0x4C,
51 0x4E, 0x4E, 0x4A, 0x49, 0x4D, 0x54, 0x50, 0x59,
52 0x51, 0x5A, 0x5E, 0x5A, 0x5D, 0x61, 0x59, 0x65,
53 0x63, 0x65, 0x60, 0x62, 0x68, 0x67, 0x64, 0x61,
54 0x64, 0x5E, 0x66, 0x63, 0x63, 0x61, 0x67, 0x68,
55 0x62, 0x64, 0x66, 0x67, 0x64, 0x63, 0x66, 0x64,
56 0x67, 0x66, 0x65, 0x64, 0x64, 0x6A, 0x66, 0x65,
57 0x68, 0x66, 0x69, 0x67, 0x6A, 0x66, 0x68, 0x66,
58 0x6C, 0x65, 0x69, 0x64, 0x65, 0x64, 0x66, 0x62,
59 0x63, 0x68, 0x68, 0x65, 0x64, 0x64, 0x62, 0x63,
60 0x68, 0x65, 0x66, 0x69, 0x66, 0x65, 0x61, 0x66,
61 0x6E, 0x69, 0x64, 0x61, 0x63, 0x63, 0x66, 0x63,
62 0x62, 0x64, 0x60, 0x68, 0x63, 0x61, 0x62, 0x65,
63 0x60, 0x63, 0x60, 0x62, 0x60, 0x5E, 0x61, 0x62,
64 0x5D, 0x5C, 0x57, 0x5B, 0x58, 0x53, 0x54, 0x47,
65 0x49, 0x54, 0x5C, 0x6B, 0x6F, 0x77, 0x7F, 0x80,
66 0x88, 0x8A, 0x8C, 0x85, 0x7A, 0x7D, 0x7F, 0x7D,
67 0x80, 0x80, 0x81, 0x80, 0x85, 0x82, 0x81, 0x7E,
68 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7E, 0x83, 0x7F,
69 0x81, 0x83, 0x87, 0x82, 0x83, 0x88, 0x84, 0x82,
70 0x82, 0x8A, 0xB3, 0xC5, 0xCD, 0xCF, 0xD4, 0xD3,
71 0xD6, 0xCC, 0xB5, 0x80, 0x4E, 0x48, 0x4D, 0x4D,
72 0x57, 0x5A, 0x59, 0x5C, 0x62, 0x58, 0x5C, 0x5B,
73 0x5B, 0x62, 0x5D, 0x5C, 0x59, 0x5C, 0x5A, 0x59,
74 0x5D, 0x5F, 0x5B, 0x5F, 0x60, 0x5E, 0x5E, 0x57,
75 0x5F, 0x5F, 0x60, 0x61, 0x5C, 0x61, 0x60, 0x5B,
76 0x56, 0x56, 0x57, 0x58, 0x6E, 0x91, 0x96, 0x7E,
77 0x89, 0x88, 0x87, 0x86, 0x8A, 0x87, 0x84, 0x87,
78 0x83, 0x89, 0x82, 0x83, 0x84, 0x81, 0x80, 0x80,
79 0x81, 0x83, 0x88, 0x8A, 0x8E, 0x90, 0x96, 0x98,
80 0x94, 0x93, 0x93, 0x88, 0x78, 0x7B, 0x60, 0x52,
81 0x41, 0x3F, 0x39, 0x46, 0x46, 0x48, 0x49, 0x47,
82 0x50, 0x4A, 0x49, 0x50, 0x4D, 0x4B, 0x4D, 0x4C,
83 0x4E, 0x4E, 0x4A, 0x49, 0x4E, 0x54, 0x4F, 0x59,
84 0x51, 0x5A, 0x5E, 0x5A, 0x5D, 0x61, 0x59, 0x65,
85 0x63, 0x65, 0x5F, 0x62, 0x68, 0x67, 0x64, 0x61,
86 0x64, 0x5E, 0x66, 0x63, 0x63, 0x61, 0x67, 0x69,
87 0x61, 0x63, 0x66, 0x67, 0x65, 0x63, 0x66, 0x64,
88 0x67, 0x67, 0x65, 0x64, 0x64, 0x6A, 0x66, 0x65,
89 0x68, 0x66, 0x69, 0x67, 0x6A, 0x67, 0x69, 0x66,
90 0x6C, 0x65, 0x69, 0x64, 0x65, 0x64, 0x66, 0x62,
91 0x63, 0x68, 0x68, 0x66, 0x64, 0x64, 0x62, 0x63,
92 0x68, 0x65, 0x66, 0x6A, 0x67, 0x65, 0x60, 0x66,
93 0x6F, 0x6A, 0x64, 0x61, 0x64, 0x63, 0x66, 0x63,
94 0x62, 0x64, 0x60, 0x69, 0x64, 0x61, 0x62, 0x65,
95 0x60, 0x63, 0x60, 0x62, 0x60, 0x5E, 0x61, 0x62,
96 0x5D, 0x5C, 0x57, 0x5B, 0x59, 0x53, 0x54, 0x47,
97 0x49, 0x54, 0x5C, 0x6B, 0x6F, 0x77, 0x7F, 0x80,
98 0x88, 0x8A, 0x8C, 0x85, 0x7A, 0x7D, 0x7F, 0x7C,
99 0x80, 0x80, 0x81, 0x80, 0x85, 0x82, 0x81, 0x7E,
100 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7E, 0x83, 0x7F,
101 0x81, 0x83, 0x87, 0x81, 0x83, 0x88, 0x84, 0x82,
102 0x82, 0x8A, 0xB5, 0xC5, 0xCD, 0xCF, 0xD4, 0xD3,
103 0xD6, 0xCC, 0xB4, 0x7E, 0x4D, 0x48, 0x4E, 0x4D,
104 0x57, 0x5A, 0x59, 0x5C, 0x62, 0x58, 0x5C, 0x5B,
105 0x5B, 0x62, 0x5D, 0x5C, 0x59, 0x5C, 0x5A, 0x59,
106 0x5D, 0x5F, 0x5B, 0x5F, 0x60, 0x5E, 0x5E, 0x57,
107 0x5F, 0x5F, 0x60, 0x61, 0x5C, 0x61, 0x60, 0x5B,
108 0x56, 0x56, 0x57, 0x58, 0x6F, 0x94, 0x9A, 0x82,
109 0x88, 0x89, 0x87, 0x86, 0x88, 0x86, 0x84, 0x85,
110 0x82, 0x87, 0x82, 0x81, 0x83, 0x81, 0x7F, 0x80,
111 0x82, 0x82, 0x87, 0x8A, 0x8F, 0x90, 0x95, 0x98,
112 0x95, 0x92, 0x92, 0x88, 0x79, 0x77, 0x5F, 0x51,
113 0x41, 0x3E, 0x3B, 0x44, 0x44, 0x46, 0x49, 0x4A,
114 0x4C, 0x49, 0x49, 0x4E, 0x4A, 0x4A, 0x4E, 0x4A,
115 0x4D, 0x4D, 0x48, 0x4A, 0x4C, 0x52, 0x52, 0x58,
116 0x52, 0x59, 0x5E, 0x5A, 0x5D, 0x5F, 0x59, 0x64,
117 0x64, 0x64, 0x62, 0x61, 0x66, 0x66, 0x64, 0x60,
118 0x62, 0x5F, 0x65, 0x63, 0x62, 0x62, 0x65, 0x66,
119 0x62, 0x65, 0x67, 0x66, 0x64, 0x64, 0x65, 0x65,
120 0x66, 0x65, 0x65, 0x63, 0x63, 0x67, 0x65, 0x64,
121 0x67, 0x67, 0x68, 0x66, 0x6A, 0x66, 0x67, 0x66,
122 0x6C, 0x65, 0x6A, 0x64, 0x64, 0x63, 0x66, 0x62,
123 0x63, 0x67, 0x69, 0x65, 0x64, 0x63, 0x62, 0x63,
124 0x68, 0x65, 0x66, 0x69, 0x66, 0x65, 0x61, 0x65,
125 0x6C, 0x69, 0x64, 0x61, 0x62, 0x62, 0x64, 0x63,
126 0x61, 0x63, 0x60, 0x66, 0x63, 0x61, 0x62, 0x65,
127 0x60, 0x62, 0x60, 0x62, 0x60, 0x5E, 0x60, 0x61,
128 0x5C, 0x5C, 0x59, 0x5B, 0x57, 0x53, 0x52, 0x47,
129 0x48, 0x54, 0x5C, 0x69, 0x6E, 0x77, 0x7D, 0x80,
130 0x88, 0x89, 0x8C, 0x84, 0x7B, 0x7D, 0x7E, 0x7D,
131 0x7F, 0x80, 0x81, 0x7F, 0x85, 0x82, 0x80, 0x7E,
132 0x7F, 0x7E, 0x7F, 0x7F, 0x7E, 0x7F, 0x82, 0x7F,
133 0x81, 0x83, 0x86, 0x82, 0x83, 0x87, 0x84, 0x82,
134 0x81, 0x88, 0xB0, 0xC5, 0xCD, 0xCF, 0xD4, 0xD4,
135 0xD6, 0xCD, 0xB8, 0x86, 0x51, 0x47, 0x4B, 0x4D,
136 0x56, 0x59, 0x59, 0x5B, 0x5F, 0x59, 0x5C, 0x5D,
137 0x5B, 0x62, 0x5D, 0x5B, 0x5B, 0x5C, 0x5B, 0x5A,
138 0x5E, 0x5F, 0x5D, 0x5F, 0x60, 0x5D, 0x5F, 0x58,
139 0x5E, 0x5F, 0x5F, 0x5F, 0x5B, 0x60, 0x60, 0x5C,
140 0x57, 0x56, 0x59, 0x5B, 0x6E, 0x8A, 0x87, 0x6C,
141 0x84, 0x88, 0x86, 0x84, 0x87, 0x85, 0x84, 0x82,
142 0x80, 0x84, 0x82, 0x7E, 0x82, 0x7F, 0x7C, 0x80,
143 0x84, 0x80, 0x84, 0x8B, 0x90, 0x92, 0x93, 0x95,
144 0x97, 0x91, 0x8E, 0x86, 0x79, 0x6F, 0x5B, 0x4F,
145 0x41, 0x3A, 0x3D, 0x3F, 0x40, 0x42, 0x48, 0x4B,
146 0x46, 0x48, 0x47, 0x4A, 0x46, 0x49, 0x4D, 0x48,
147 0x48, 0x4D, 0x46, 0x4C, 0x4B, 0x4F, 0x55, 0x55,
148 0x54, 0x58, 0x5D, 0x5B, 0x5D, 0x5C, 0x5A, 0x61,
149 0x62, 0x60, 0x65, 0x61, 0x63, 0x65, 0x64, 0x5F,
150 0x60, 0x61, 0x63, 0x63, 0x61, 0x63, 0x61, 0x63,
151 0x64, 0x66, 0x67, 0x66, 0x64, 0x65, 0x65, 0x67,
152 0x64, 0x64, 0x66, 0x63, 0x62, 0x64, 0x63, 0x62,
153 0x65, 0x67, 0x66, 0x65, 0x68, 0x65, 0x64, 0x64,
154 0x69, 0x63, 0x69, 0x65, 0x63, 0x61, 0x63, 0x61,
155 0x63, 0x68, 0x6B, 0x65, 0x63, 0x61, 0x62, 0x64,
156 0x66, 0x64, 0x65, 0x66, 0x63, 0x63, 0x63, 0x65,
157 0x65, 0x67, 0x65, 0x60, 0x60, 0x5E, 0x60, 0x64,
158 0x5E, 0x63, 0x60, 0x61, 0x5F, 0x60, 0x61, 0x63,
159 0x62, 0x62, 0x5E, 0x60, 0x61, 0x60, 0x5E, 0x5D,
160 0x5C, 0x5D, 0x5C, 0x5A, 0x54, 0x51, 0x4E, 0x4A,
161 0x46, 0x50, 0x59, 0x62, 0x6A, 0x75, 0x79, 0x80,
162 0x86, 0x86, 0x8B, 0x83, 0x7F, 0x7E, 0x7E, 0x7E,
163 0x7E, 0x81, 0x81, 0x7E, 0x83, 0x82, 0x80, 0x80,
164 0x7F, 0x7F, 0x7F, 0x81, 0x81, 0x81, 0x7F, 0x7E,
165 0x80, 0x82, 0x84, 0x83, 0x81, 0x84, 0x83, 0x82,
166 0x7F, 0x82, 0x9D, 0xBD, 0xC9, 0xCE, 0xD2, 0xD4,
167 0xD6, 0xD2, 0xC4, 0xA1, 0x68, 0x49, 0x48, 0x4D,
168 0x54, 0x56, 0x59, 0x5A, 0x5A, 0x5B, 0x5B, 0x60,
169 0x5B, 0x60, 0x5B, 0x5B, 0x5C, 0x5C, 0x5D, 0x5D,
170 0x60, 0x5C, 0x5E, 0x5E, 0x5E, 0x5B, 0x5E, 0x5C,
171 0x5D, 0x5E, 0x5F, 0x5C, 0x5C, 0x60, 0x61, 0x5E,
172 0x5A, 0x58, 0x5F, 0x62, 0x5F, 0x5D, 0x48, 0x32,
173 0x81, 0x85, 0x85, 0x81, 0x86, 0x83, 0x84, 0x80,
174 0x7F, 0x84, 0x83, 0x7E, 0x80, 0x7E, 0x7D, 0x80,
175 0x82, 0x7F, 0x85, 0x8D, 0x91, 0x93, 0x92, 0x95,
176 0x95, 0x8F, 0x8C, 0x84, 0x76, 0x6B, 0x5D, 0x50,
177 0x41, 0x38, 0x39, 0x3B, 0x41, 0x41, 0x46, 0x47,
178 0x45, 0x47, 0x44, 0x47, 0x45, 0x4A, 0x49, 0x48,
179 0x45, 0x4C, 0x48, 0x4C, 0x4E, 0x4E, 0x51, 0x56,
180 0x56, 0x59, 0x5A, 0x5C, 0x5C, 0x5E, 0x5A, 0x60,
181 0x5D, 0x60, 0x62, 0x61, 0x63, 0x64, 0x62, 0x5F,
182 0x61, 0x62, 0x64, 0x62, 0x61, 0x64, 0x61, 0x64,
183 0x63, 0x65, 0x65, 0x67, 0x63, 0x66, 0x65, 0x64,
184 0x63, 0x65, 0x66, 0x61, 0x60, 0x67, 0x64, 0x62,
185 0x63, 0x65, 0x64, 0x65, 0x65, 0x63, 0x62, 0x63,
186 0x63, 0x61, 0x67, 0x66, 0x63, 0x5F, 0x5E, 0x60,
187 0x63, 0x66, 0x6A, 0x64, 0x62, 0x60, 0x64, 0x63,
188 0x65, 0x62, 0x62, 0x62, 0x60, 0x62, 0x63, 0x63,
189 0x61, 0x64, 0x65, 0x60, 0x60, 0x5D, 0x61, 0x62,
190 0x5D, 0x61, 0x5E, 0x60, 0x5C, 0x60, 0x5F, 0x60,
191 0x61, 0x61, 0x5F, 0x60, 0x61, 0x61, 0x5E, 0x5D,
192 0x5D, 0x5B, 0x5A, 0x58, 0x52, 0x51, 0x4E, 0x4D,
193 0x47, 0x4A, 0x51, 0x5B, 0x66, 0x70, 0x76, 0x7C,
194 0x81, 0x84, 0x8A, 0x85, 0x81, 0x80, 0x7F, 0x7C,
195 0x7F, 0x82, 0x82, 0x81, 0x82, 0x82, 0x81, 0x84,
196 0x80, 0x82, 0x81, 0x80, 0x81, 0x81, 0x80, 0x80,
197 0x81, 0x82, 0x81, 0x82, 0x7F, 0x81, 0x80, 0x81,
198 0x7F, 0x7D, 0x86, 0xAB, 0xC1, 0xCB, 0xCF, 0xD2,
199 0xD3, 0xD5, 0xCF, 0xBA, 0x8A, 0x57, 0x48, 0x4D,
200 0x51, 0x52, 0x55, 0x5A, 0x5A, 0x5B, 0x59, 0x5F,
201 0x59, 0x5C, 0x59, 0x5C, 0x5A, 0x5A, 0x5B, 0x5C,
202 0x5F, 0x5C, 0x5D, 0x5B, 0x5D, 0x5C, 0x5C, 0x5E,
203 0x5C, 0x5D, 0x61, 0x5E, 0x5D, 0x5F, 0x62, 0x61,
204 0x61, 0x5F, 0x60, 0x5A, 0x3D, 0x28, 0x19, 0x13,
205 0x82, 0x84, 0x83, 0x7F, 0x84, 0x83, 0x83, 0x81,
206 0x80, 0x83, 0x84, 0x82, 0x7F, 0x7F, 0x80, 0x7F,
207 0x81, 0x83, 0x87, 0x8E, 0x92, 0x91, 0x93, 0x94,
208 0x91, 0x8F, 0x8E, 0x83, 0x72, 0x6A, 0x60, 0x4F,
209 0x3F, 0x36, 0x37, 0x3D, 0x42, 0x3F, 0x43, 0x47,
210 0x45, 0x45, 0x46, 0x46, 0x47, 0x4B, 0x44, 0x46,
211 0x44, 0x47, 0x48, 0x4B, 0x51, 0x4D, 0x4F, 0x56,
212 0x56, 0x5A, 0x5A, 0x5B, 0x5B, 0x5D, 0x5B, 0x5F,
213 0x5C, 0x62, 0x5D, 0x61, 0x62, 0x63, 0x60, 0x63,
214 0x62, 0x63, 0x64, 0x60, 0x61, 0x64, 0x60, 0x66,
215 0x5F, 0x63, 0x65, 0x67, 0x63, 0x63, 0x63, 0x63,
216 0x63, 0x65, 0x63, 0x61, 0x62, 0x66, 0x63, 0x63,
217 0x62, 0x63, 0x61, 0x62, 0x64, 0x61, 0x64, 0x63,
218 0x61, 0x64, 0x66, 0x63, 0x63, 0x5E, 0x5D, 0x5E,
219 0x63, 0x61, 0x64, 0x63, 0x63, 0x60, 0x63, 0x62,
220 0x64, 0x62, 0x63, 0x61, 0x62, 0x61, 0x63, 0x60,
221 0x61, 0x61, 0x63, 0x63, 0x61, 0x62, 0x62, 0x60,
222 0x5E, 0x5F, 0x5F, 0x61, 0x5D, 0x61, 0x5F, 0x5F,
223 0x5F, 0x5E, 0x61, 0x60, 0x5F, 0x5F, 0x62, 0x61,
224 0x5D, 0x5A, 0x56, 0x58, 0x54, 0x52, 0x51, 0x4F,
225 0x4C, 0x47, 0x4B, 0x57, 0x61, 0x6C, 0x72, 0x79,
226 0x7E, 0x82, 0x89, 0x87, 0x82, 0x82, 0x7F, 0x7E,
227 0x80, 0x82, 0x86, 0x84, 0x85, 0x84, 0x83, 0x85,
228 0x82, 0x82, 0x82, 0x80, 0x81, 0x83, 0x82, 0x80,
229 0x80, 0x83, 0x80, 0x81, 0x7F, 0x81, 0x7F, 0x81,
230 0x83, 0x7A, 0x7D, 0x95, 0xB7, 0xC6, 0xCD, 0xD0,
231 0xD3, 0xD5, 0xD4, 0xC9, 0xA9, 0x73, 0x4B, 0x48,
232 0x4D, 0x50, 0x53, 0x57, 0x59, 0x5A, 0x57, 0x5C,
233 0x5B, 0x5A, 0x59, 0x5B, 0x59, 0x58, 0x58, 0x5A,
234 0x5F, 0x5D, 0x5B, 0x58, 0x5D, 0x5A, 0x5C, 0x5D,
235 0x5D, 0x5E, 0x5E, 0x5F, 0x5C, 0x5D, 0x62, 0x65,
236 0x66, 0x65, 0x55, 0x3D, 0x20, 0x13, 0x12, 0x17,
237 0x83, 0x83, 0x80, 0x81, 0x84, 0x82, 0x81, 0x81,
238 0x81, 0x83, 0x81, 0x83, 0x7F, 0x80, 0x80, 0x7E,
239 0x83, 0x8A, 0x8A, 0x90, 0x93, 0x91, 0x92, 0x92,
240 0x8F, 0x90, 0x8D, 0x83, 0x71, 0x69, 0x5D, 0x4D,
241 0x41, 0x37, 0x37, 0x3F, 0x3C, 0x3F, 0x42, 0x48,
242 0x44, 0x46, 0x49, 0x4B, 0x4A, 0x4A, 0x41, 0x45,
243 0x45, 0x44, 0x44, 0x48, 0x50, 0x4C, 0x51, 0x53,
244 0x57, 0x57, 0x5A, 0x5A, 0x5D, 0x5B, 0x5D, 0x5D,
245 0x5C, 0x5E, 0x5E, 0x62, 0x5E, 0x62, 0x60, 0x65,
246 0x63, 0x63, 0x61, 0x5F, 0x61, 0x63, 0x5E, 0x65,
247 0x5E, 0x61, 0x66, 0x63, 0x63, 0x61, 0x63, 0x65,
248 0x61, 0x62, 0x62, 0x64, 0x64, 0x63, 0x62, 0x62,
249 0x60, 0x63, 0x62, 0x61, 0x64, 0x61, 0x64, 0x63,
250 0x62, 0x66, 0x66, 0x63, 0x64, 0x5E, 0x60, 0x5F,
251 0x63, 0x62, 0x60, 0x63, 0x62, 0x60, 0x62, 0x62,
252 0x64, 0x66, 0x66, 0x63, 0x65, 0x61, 0x65, 0x61,
253 0x60, 0x61, 0x61, 0x64, 0x61, 0x63, 0x63, 0x61,
254 0x61, 0x5F, 0x61, 0x61, 0x5F, 0x62, 0x5E, 0x60,
255 0x5F, 0x5B, 0x5F, 0x61, 0x5E, 0x5F, 0x65, 0x60,
256 0x5A, 0x5B, 0x58, 0x59, 0x56, 0x53, 0x52, 0x50,
257 0x4E, 0x4B, 0x47, 0x51, 0x5A, 0x67, 0x6E, 0x77,
258 0x7B, 0x7F, 0x87, 0x87, 0x86, 0x84, 0x82, 0x83,
259 0x83, 0x83, 0x86, 0x87, 0x89, 0x88, 0x87, 0x84,
260 0x84, 0x83, 0x80, 0x80, 0x81, 0x84, 0x81, 0x81,
261 0x80, 0x81, 0x7F, 0x7F, 0x7F, 0x82, 0x80, 0x81,
262 0x84, 0x7C, 0x7E, 0x82, 0xA5, 0xC0, 0xCA, 0xCF,
263 0xD3, 0xD5, 0xD5, 0xD2, 0xBF, 0x96, 0x5C, 0x47,
264 0x4B, 0x4E, 0x50, 0x55, 0x55, 0x58, 0x57, 0x5A,
265 0x5D, 0x5A, 0x5C, 0x59, 0x5C, 0x55, 0x57, 0x5B,
266 0x60, 0x5B, 0x5B, 0x59, 0x5B, 0x5B, 0x5F, 0x5B,
267 0x5D, 0x5E, 0x5B, 0x5D, 0x5D, 0x5D, 0x65, 0x68,
268 0x63, 0x5A, 0x3A, 0x23, 0x19, 0x12, 0x17, 0x19,
269 0x83, 0x83, 0x81, 0x84, 0x82, 0x80, 0x82, 0x81,
270 0x81, 0x81, 0x80, 0x81, 0x80, 0x7F, 0x7E, 0x82,
271 0x86, 0x8C, 0x90, 0x91, 0x91, 0x92, 0x91, 0x92,
272 0x90, 0x8F, 0x87, 0x82, 0x72, 0x69, 0x5D, 0x4E,
273 0x42, 0x39, 0x37, 0x3E, 0x3A, 0x42, 0x44, 0x43,
274 0x46, 0x4B, 0x49, 0x4E, 0x4A, 0x49, 0x42, 0x48,
275 0x48, 0x44, 0x42, 0x45, 0x4C, 0x4D, 0x51, 0x51,
276 0x55, 0x56, 0x5A, 0x5C, 0x5E, 0x5C, 0x5C, 0x5F,
277 0x5D, 0x5C, 0x60, 0x60, 0x5C, 0x62, 0x62, 0x64,
278 0x63, 0x61, 0x61, 0x60, 0x61, 0x61, 0x60, 0x63,
279 0x61, 0x61, 0x65, 0x62, 0x62, 0x65, 0x65, 0x65,
280 0x61, 0x62, 0x64, 0x65, 0x66, 0x63, 0x64, 0x5F,
281 0x5F, 0x62, 0x65, 0x64, 0x64, 0x63, 0x62, 0x65,
282 0x63, 0x64, 0x65, 0x62, 0x65, 0x60, 0x63, 0x60,
283 0x61, 0x66, 0x61, 0x64, 0x5F, 0x60, 0x63, 0x62,
284 0x64, 0x67, 0x66, 0x67, 0x66, 0x61, 0x65, 0x64,
285 0x60, 0x65, 0x61, 0x62, 0x61, 0x60, 0x64, 0x5F,
286 0x63, 0x61, 0x60, 0x5F, 0x5F, 0x5E, 0x5D, 0x60,
287 0x61, 0x5D, 0x60, 0x61, 0x60, 0x60, 0x62, 0x5F,
288 0x59, 0x5D, 0x5B, 0x5A, 0x57, 0x54, 0x51, 0x56,
289 0x4E, 0x4E, 0x48, 0x4C, 0x55, 0x60, 0x6E, 0x75,
290 0x79, 0x7D, 0x84, 0x87, 0x89, 0x89, 0x87, 0x85,
291 0x84, 0x86, 0x87, 0x8A, 0x89, 0x8A, 0x8A, 0x85,
292 0x82, 0x84, 0x82, 0x81, 0x83, 0x83, 0x7D, 0x80,
293 0x80, 0x7E, 0x7F, 0x7C, 0x7E, 0x7F, 0x80, 0x80,
294 0x7F, 0x80, 0x7F, 0x7B, 0x8D, 0xB5, 0xC5, 0xCC,
295 0xD2, 0xD4, 0xD5, 0xD6, 0xCC, 0xB4, 0x7F, 0x4E,
296 0x4C, 0x4B, 0x4F, 0x51, 0x56, 0x55, 0x54, 0x59,
297 0x5C, 0x59, 0x5D, 0x59, 0x5B, 0x57, 0x57, 0x5D,
298 0x5D, 0x58, 0x5D, 0x5D, 0x5A, 0x5F, 0x61, 0x5D,
299 0x5F, 0x5E, 0x5D, 0x60, 0x60, 0x63, 0x69, 0x62,
300 0x50, 0x38, 0x1D, 0x1A, 0x1C, 0x17, 0x19, 0x18,
301 0x81, 0x82, 0x83, 0x82, 0x81, 0x7E, 0x83, 0x83,
302 0x80, 0x82, 0x82, 0x80, 0x80, 0x7D, 0x80, 0x88,
303 0x8A, 0x8D, 0x93, 0x8F, 0x91, 0x91, 0x90, 0x8F,
304 0x90, 0x8C, 0x84, 0x81, 0x71, 0x69, 0x5E, 0x4B,
305 0x40, 0x3A, 0x38, 0x3B, 0x3B, 0x45, 0x44, 0x3E,
306 0x46, 0x4B, 0x4A, 0x4B, 0x45, 0x47, 0x45, 0x49,
307 0x44, 0x45, 0x42, 0x47, 0x4A, 0x4F, 0x52, 0x51,
308 0x53, 0x57, 0x59, 0x5D, 0x5B, 0x5E, 0x5A, 0x60,
309 0x5F, 0x5F, 0x5F, 0x61, 0x5C, 0x61, 0x64, 0x63,
310 0x62, 0x60, 0x62, 0x62, 0x63, 0x60, 0x61, 0x60,
311 0x64, 0x64, 0x66, 0x63, 0x61, 0x68, 0x65, 0x65,
312 0x63, 0x66, 0x65, 0x63, 0x65, 0x63, 0x64, 0x61,
313 0x60, 0x60, 0x62, 0x66, 0x64, 0x61, 0x63, 0x65,
314 0x64, 0x62, 0x66, 0x60, 0x67, 0x63, 0x61, 0x5E,
315 0x5D, 0x66, 0x65, 0x63, 0x60, 0x60, 0x61, 0x62,
316 0x66, 0x68, 0x66, 0x6B, 0x65, 0x62, 0x65, 0x63,
317 0x63, 0x64, 0x63, 0x62, 0x60, 0x61, 0x62, 0x5D,
318 0x62, 0x62, 0x61, 0x5E, 0x5F, 0x5A, 0x5E, 0x5E,
319 0x61, 0x60, 0x62, 0x60, 0x62, 0x5E, 0x5F, 0x60,
320 0x5E, 0x5F, 0x59, 0x5B, 0x56, 0x54, 0x51, 0x59,
321 0x4E, 0x4E, 0x49, 0x47, 0x52, 0x5B, 0x6B, 0x72,
322 0x76, 0x7C, 0x82, 0x86, 0x87, 0x8E, 0x89, 0x85,
323 0x85, 0x87, 0x88, 0x8D, 0x89, 0x89, 0x8A, 0x89,
324 0x82, 0x84, 0x85, 0x86, 0x86, 0x80, 0x7E, 0x7E,
325 0x7E, 0x7F, 0x81, 0x7D, 0x7F, 0x7C, 0x7E, 0x7D,
326 0x7E, 0x80, 0x7D, 0x7C, 0x7B, 0x9F, 0xBD, 0xC9,
327 0xD0, 0xD3, 0xD5, 0xD6, 0xD3, 0xC6, 0xA3, 0x64,
328 0x4C, 0x47, 0x50, 0x4D, 0x58, 0x53, 0x52, 0x58,
329 0x59, 0x5A, 0x5C, 0x59, 0x5B, 0x5E, 0x58, 0x5E,
330 0x5B, 0x5D, 0x5F, 0x5C, 0x5B, 0x60, 0x63, 0x5F,
331 0x62, 0x62, 0x60, 0x64, 0x65, 0x68, 0x63, 0x4F,
332 0x30, 0x17, 0x14, 0x13, 0x17, 0x1A, 0x15, 0x17,
333 0x82, 0x83, 0x83, 0x80, 0x82, 0x7F, 0x83, 0x86,
334 0x83, 0x86, 0x81, 0x81, 0x80, 0x7F, 0x85, 0x88,
335 0x8C, 0x8F, 0x92, 0x8E, 0x93, 0x8F, 0x8E, 0x8B,
336 0x8E, 0x8A, 0x85, 0x7E, 0x71, 0x68, 0x5E, 0x4F,
337 0x42, 0x3E, 0x38, 0x39, 0x3D, 0x45, 0x42, 0x42,
338 0x44, 0x47, 0x4B, 0x49, 0x45, 0x46, 0x47, 0x46,
339 0x42, 0x45, 0x44, 0x48, 0x4A, 0x50, 0x52, 0x51,
340 0x55, 0x54, 0x57, 0x5A, 0x5A, 0x5D, 0x57, 0x5F,
341 0x5E, 0x60, 0x5D, 0x61, 0x5E, 0x61, 0x64, 0x62,
342 0x60, 0x62, 0x62, 0x63, 0x63, 0x62, 0x62, 0x61,
343 0x63, 0x62, 0x65, 0x63, 0x60, 0x65, 0x64, 0x63,
344 0x64, 0x66, 0x64, 0x61, 0x62, 0x64, 0x63, 0x63,
345 0x63, 0x5F, 0x61, 0x67, 0x62, 0x61, 0x64, 0x63,
346 0x63, 0x62, 0x65, 0x61, 0x68, 0x61, 0x63, 0x61,
347 0x5D, 0x65, 0x68, 0x62, 0x60, 0x5E, 0x5E, 0x63,
348 0x67, 0x69, 0x68, 0x69, 0x69, 0x64, 0x65, 0x64,
349 0x65, 0x61, 0x64, 0x64, 0x64, 0x62, 0x62, 0x5C,
350 0x60, 0x62, 0x63, 0x61, 0x61, 0x5B, 0x5C, 0x5C,
351 0x60, 0x60, 0x61, 0x5F, 0x63, 0x5B, 0x5D, 0x60,
352 0x61, 0x5F, 0x5B, 0x5C, 0x5A, 0x53, 0x52, 0x56,
353 0x4E, 0x4C, 0x48, 0x44, 0x4E, 0x5A, 0x65, 0x6F,
354 0x74, 0x7C, 0x81, 0x85, 0x85, 0x8E, 0x88, 0x87,
355 0x88, 0x87, 0x88, 0x8E, 0x89, 0x8A, 0x8A, 0x8B,
356 0x86, 0x83, 0x84, 0x87, 0x86, 0x83, 0x80, 0x7F,
357 0x7F, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7F,
358 0x80, 0x7D, 0x7C, 0x7C, 0x78, 0x84, 0xAD, 0xC3,
359 0xCC, 0xD2, 0xD4, 0xD6, 0xD6, 0xCF, 0xB9, 0x87,
360 0x54, 0x47, 0x51, 0x4D, 0x56, 0x53, 0x54, 0x59,
361 0x57, 0x5B, 0x5E, 0x5B, 0x5E, 0x61, 0x5A, 0x5E,
362 0x5A, 0x63, 0x5D, 0x5D, 0x5F, 0x5E, 0x62, 0x5F,
363 0x62, 0x65, 0x63, 0x68, 0x6A, 0x63, 0x4D, 0x33,
364 0x17, 0x12, 0x1B, 0x11, 0x16, 0x18, 0x14, 0x16,
365 0x84, 0x83, 0x82, 0x7F, 0x83, 0x81, 0x82, 0x86,
366 0x86, 0x85, 0x80, 0x83, 0x7E, 0x80, 0x85, 0x86,
367 0x8C, 0x90, 0x8F, 0x8E, 0x93, 0x8C, 0x8C, 0x8B,
368 0x88, 0x88, 0x84, 0x7C, 0x74, 0x68, 0x62, 0x5B,
369 0x45, 0x3F, 0x38, 0x3A, 0x3F, 0x42, 0x41, 0x45,
370 0x4D, 0x46, 0x49, 0x48, 0x44, 0x47, 0x45, 0x43,
371 0x47, 0x46, 0x45, 0x45, 0x4B, 0x51, 0x50, 0x52,
372 0x57, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x57, 0x5E,
373 0x5B, 0x5E, 0x5E, 0x60, 0x61, 0x60, 0x63, 0x61,
374 0x5E, 0x63, 0x61, 0x63, 0x62, 0x63, 0x63, 0x62,
375 0x61, 0x61, 0x63, 0x64, 0x60, 0x60, 0x64, 0x61,
376 0x63, 0x61, 0x63, 0x61, 0x61, 0x61, 0x63, 0x62,
377 0x64, 0x60, 0x61, 0x64, 0x60, 0x61, 0x61, 0x62,
378 0x63, 0x60, 0x61, 0x62, 0x65, 0x5F, 0x66, 0x63,
379 0x61, 0x63, 0x65, 0x62, 0x5E, 0x5E, 0x5F, 0x62,
380 0x65, 0x66, 0x67, 0x67, 0x6D, 0x64, 0x62, 0x63,
381 0x65, 0x61, 0x62, 0x62, 0x69, 0x61, 0x64, 0x5C,
382 0x5F, 0x61, 0x61, 0x60, 0x61, 0x5C, 0x5B, 0x5E,
383 0x60, 0x5F, 0x60, 0x60, 0x60, 0x5B, 0x5E, 0x5E,
384 0x60, 0x5C, 0x5D, 0x5C, 0x60, 0x57, 0x53, 0x53,
385 0x4E, 0x4D, 0x49, 0x44, 0x4C, 0x55, 0x61, 0x6C,
386 0x74, 0x7B, 0x80, 0x84, 0x86, 0x8B, 0x89, 0x89,
387 0x89, 0x87, 0x87, 0x8D, 0x89, 0x8C, 0x89, 0x8A,
388 0x89, 0x83, 0x83, 0x83, 0x85, 0x86, 0x7F, 0x81,
389 0x80, 0x82, 0x7E, 0x7F, 0x7D, 0x80, 0x7F, 0x81,
390 0x7F, 0x7C, 0x7D, 0x7B, 0x7B, 0x76, 0x95, 0xBA,
391 0xC7, 0xD0, 0xD2, 0xD5, 0xD7, 0xD4, 0xC8, 0xAA,
392 0x70, 0x48, 0x4F, 0x4D, 0x54, 0x52, 0x55, 0x58,
393 0x56, 0x59, 0x5A, 0x5C, 0x5F, 0x5E, 0x59, 0x5D,
394 0x5A, 0x5D, 0x5D, 0x62, 0x63, 0x61, 0x61, 0x62,
395 0x63, 0x66, 0x68, 0x6D, 0x65, 0x4A, 0x31, 0x1C,
396 0x12, 0x1B, 0x22, 0x16, 0x1B, 0x16, 0x16, 0x18,
397 0x84, 0x83, 0x7E, 0x82, 0x83, 0x81, 0x82, 0x85,
398 0x87, 0x84, 0x83, 0x84, 0x7D, 0x80, 0x83, 0x88,
399 0x8E, 0x90, 0x90, 0x8C, 0x8F, 0x8D, 0x8C, 0x88,
400 0x85, 0x86, 0x83, 0x7C, 0x78, 0x6A, 0x63, 0x5A,
401 0x43, 0x3A, 0x39, 0x3D, 0x3F, 0x3E, 0x42, 0x43,
402 0x57, 0x45, 0x48, 0x44, 0x43, 0x4B, 0x43, 0x44,
403 0x48, 0x46, 0x46, 0x46, 0x4C, 0x52, 0x4D, 0x52,
404 0x56, 0x59, 0x55, 0x58, 0x57, 0x5A, 0x5B, 0x5B,
405 0x5D, 0x5C, 0x5D, 0x60, 0x63, 0x62, 0x60, 0x61,
406 0x60, 0x5F, 0x62, 0x63, 0x5F, 0x60, 0x62, 0x62,
407 0x61, 0x61, 0x63, 0x64, 0x61, 0x60, 0x64, 0x63,
408 0x62, 0x60, 0x64, 0x63, 0x60, 0x5F, 0x63, 0x62,
409 0x61, 0x64, 0x5E, 0x61, 0x60, 0x60, 0x5E, 0x62,
410 0x60, 0x5F, 0x60, 0x60, 0x61, 0x5F, 0x61, 0x61,
411 0x61, 0x61, 0x61, 0x61, 0x5D, 0x60, 0x5E, 0x5F,
412 0x63, 0x62, 0x66, 0x66, 0x69, 0x64, 0x61, 0x62,
413 0x64, 0x62, 0x63, 0x61, 0x65, 0x61, 0x60, 0x5F,
414 0x5E, 0x63, 0x5E, 0x5D, 0x5D, 0x5D, 0x5B, 0x60,
415 0x5F, 0x5F, 0x5D, 0x5F, 0x5B, 0x5B, 0x5F, 0x5E,
416 0x5D, 0x5A, 0x5C, 0x5B, 0x5C, 0x58, 0x52, 0x51,
417 0x4E, 0x51, 0x4A, 0x47, 0x4D, 0x51, 0x5E, 0x69,
418 0x74, 0x7B, 0x7E, 0x82, 0x86, 0x89, 0x8B, 0x89,
419 0x88, 0x8A, 0x86, 0x88, 0x88, 0x8C, 0x88, 0x89,
420 0x89, 0x88, 0x85, 0x7F, 0x83, 0x84, 0x80, 0x80,
421 0x80, 0x81, 0x7C, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
422 0x7E, 0x7B, 0x7D, 0x7C, 0x78, 0x74, 0x7F, 0xA8,
423 0xC1, 0xCB, 0xD1, 0xD4, 0xD6, 0xD6, 0xD2, 0xC1,
424 0x94, 0x57, 0x49, 0x4C, 0x52, 0x53, 0x57, 0x5A,
425 0x57, 0x59, 0x53, 0x5A, 0x5E, 0x5C, 0x5A, 0x5A,
426 0x5A, 0x57, 0x60, 0x63, 0x65, 0x64, 0x63, 0x64,
427 0x66, 0x69, 0x6A, 0x67, 0x4E, 0x30, 0x1C, 0x12,
428 0x15, 0x19, 0x1F, 0x1A, 0x1A, 0x16, 0x1A, 0x1B,
429 0x81, 0x81, 0x7D, 0x83, 0x85, 0x81, 0x84, 0x84,
430 0x86, 0x83, 0x84, 0x83, 0x7E, 0x84, 0x86, 0x8B,
431 0x8F, 0x8F, 0x94, 0x8D, 0x8D, 0x8B, 0x8C, 0x85,
432 0x85, 0x85, 0x84, 0x7D, 0x79, 0x6B, 0x5C, 0x4F,
433 0x3F, 0x36, 0x36, 0x3A, 0x3E, 0x3B, 0x43, 0x44,
434 0x4E, 0x45, 0x47, 0x42, 0x45, 0x4B, 0x44, 0x44,
435 0x48, 0x44, 0x46, 0x4A, 0x4B, 0x4F, 0x4D, 0x50,
436 0x56, 0x5A, 0x57, 0x59, 0x56, 0x58, 0x5E, 0x5C,
437 0x5F, 0x5F, 0x5C, 0x5F, 0x5D, 0x65, 0x5D, 0x62,
438 0x5F, 0x5C, 0x61, 0x60, 0x5F, 0x5E, 0x61, 0x62,
439 0x61, 0x61, 0x63, 0x60, 0x5F, 0x61, 0x63, 0x63,
440 0x61, 0x61, 0x64, 0x62, 0x60, 0x61, 0x66, 0x63,
441 0x62, 0x64, 0x5E, 0x61, 0x60, 0x5F, 0x5C, 0x5F,
442 0x5C, 0x60, 0x5E, 0x5D, 0x5E, 0x5E, 0x5B, 0x5F,
443 0x60, 0x5D, 0x5E, 0x60, 0x5E, 0x60, 0x5B, 0x5E,
444 0x61, 0x60, 0x63, 0x64, 0x64, 0x65, 0x63, 0x61,
445 0x63, 0x61, 0x64, 0x64, 0x60, 0x62, 0x5C, 0x5F,
446 0x5D, 0x63, 0x5E, 0x5C, 0x5D, 0x5D, 0x5B, 0x5F,
447 0x5E, 0x60, 0x5D, 0x5D, 0x5B, 0x5D, 0x5E, 0x5E,
448 0x5C, 0x5B, 0x5D, 0x59, 0x5A, 0x58, 0x52, 0x4D,
449 0x4F, 0x4F, 0x4A, 0x4B, 0x50, 0x54, 0x5C, 0x66,
450 0x71, 0x79, 0x7C, 0x83, 0x85, 0x89, 0x8B, 0x8A,
451 0x87, 0x8D, 0x86, 0x84, 0x87, 0x89, 0x88, 0x88,
452 0x87, 0x89, 0x86, 0x81, 0x83, 0x84, 0x82, 0x80,
453 0x82, 0x80, 0x7C, 0x7D, 0x7F, 0x7D, 0x7D, 0x7C,
454 0x7F, 0x7C, 0x7C, 0x7D, 0x78, 0x75, 0x75, 0x91,
455 0xB7, 0xC7, 0xCF, 0xD4, 0xD5, 0xD6, 0xD7, 0xCE,
456 0xB2, 0x7C, 0x4A, 0x4A, 0x4F, 0x53, 0x58, 0x5B,
457 0x5B, 0x5C, 0x57, 0x59, 0x5E, 0x5C, 0x5A, 0x58,
458 0x59, 0x5B, 0x5E, 0x60, 0x61, 0x62, 0x63, 0x64,
459 0x69, 0x6B, 0x63, 0x50, 0x2B, 0x27, 0x19, 0x11,
460 0x13, 0x15, 0x15, 0x17, 0x14, 0x18, 0x1E, 0x1A,
461 0x7F, 0x7F, 0x81, 0x82, 0x84, 0x82, 0x85, 0x83,
462 0x83, 0x83, 0x85, 0x82, 0x81, 0x89, 0x8A, 0x8D,
463 0x8F, 0x90, 0x92, 0x8E, 0x8A, 0x87, 0x89, 0x85,
464 0x87, 0x87, 0x85, 0x7D, 0x78, 0x6C, 0x58, 0x4B,
465 0x3B, 0x33, 0x30, 0x36, 0x3E, 0x3D, 0x43, 0x46,
466 0x43, 0x46, 0x46, 0x45, 0x48, 0x47, 0x46, 0x44,
467 0x49, 0x42, 0x46, 0x4A, 0x4B, 0x4B, 0x4F, 0x4F,
468 0x56, 0x5B, 0x57, 0x58, 0x57, 0x5A, 0x5B, 0x5E,
469 0x5F, 0x61, 0x5C, 0x5E, 0x5D, 0x61, 0x5E, 0x62,
470 0x5D, 0x5E, 0x5F, 0x5E, 0x61, 0x61, 0x60, 0x62,
471 0x61, 0x61, 0x60, 0x5F, 0x5D, 0x60, 0x5F, 0x61,
472 0x61, 0x60, 0x62, 0x5E, 0x60, 0x64, 0x65, 0x63,
473 0x66, 0x65, 0x65, 0x60, 0x5F, 0x5C, 0x59, 0x5B,
474 0x5B, 0x5D, 0x59, 0x5C, 0x5B, 0x5D, 0x5E, 0x5F,
475 0x5F, 0x5A, 0x5C, 0x5E, 0x5E, 0x5F, 0x5A, 0x60,
476 0x5D, 0x5F, 0x5F, 0x63, 0x62, 0x64, 0x63, 0x61,
477 0x61, 0x63, 0x64, 0x66, 0x60, 0x61, 0x5E, 0x5D,
478 0x5D, 0x5F, 0x5E, 0x5D, 0x60, 0x5C, 0x5D, 0x5F,
479 0x5D, 0x5E, 0x5E, 0x5D, 0x5C, 0x60, 0x5E, 0x5D,
480 0x5D, 0x5B, 0x5C, 0x59, 0x5C, 0x5B, 0x53, 0x4E,
481 0x50, 0x4A, 0x48, 0x4B, 0x50, 0x56, 0x5C, 0x63,
482 0x6E, 0x74, 0x7E, 0x83, 0x84, 0x88, 0x8B, 0x89,
483 0x89, 0x8B, 0x85, 0x85, 0x87, 0x86, 0x88, 0x85,
484 0x86, 0x87, 0x86, 0x85, 0x82, 0x84, 0x82, 0x81,
485 0x83, 0x80, 0x7F, 0x7E, 0x7D, 0x7F, 0x7F, 0x7C,
486 0x7F, 0x7C, 0x7E, 0x7D, 0x7A, 0x78, 0x75, 0x7C,
487 0xA4, 0xC2, 0xCC, 0xD3, 0xD4, 0xD7, 0xD9, 0xD5,
488 0xC7, 0xA2, 0x60, 0x46, 0x4E, 0x50, 0x54, 0x57,
489 0x5C, 0x5E, 0x5D, 0x5A, 0x5D, 0x5A, 0x5A, 0x59,
490 0x59, 0x5E, 0x5E, 0x5D, 0x5E, 0x61, 0x63, 0x67,
491 0x69, 0x64, 0x4C, 0x2D, 0x12, 0x1C, 0x1B, 0x10,
492 0x0E, 0x14, 0x11, 0x13, 0x12, 0x1B, 0x1D, 0x1A,
493 0x82, 0x81, 0x85, 0x82, 0x83, 0x82, 0x85, 0x85,
494 0x84, 0x84, 0x87, 0x85, 0x84, 0x8C, 0x8C, 0x90,
495 0x91, 0x91, 0x8E, 0x8E, 0x87, 0x84, 0x85, 0x85,
496 0x86, 0x89, 0x86, 0x7F, 0x76, 0x69, 0x59, 0x4D,
497 0x3A, 0x35, 0x31, 0x36, 0x3F, 0x40, 0x42, 0x45,
498 0x45, 0x46, 0x49, 0x44, 0x49, 0x47, 0x48, 0x44,
499 0x47, 0x43, 0x46, 0x49, 0x4B, 0x4B, 0x50, 0x52,
500 0x54, 0x5A, 0x58, 0x58, 0x59, 0x5E, 0x5B, 0x5C,
501 0x5F, 0x5E, 0x5B, 0x5D, 0x62, 0x5F, 0x5F, 0x5F,
502 0x5D, 0x5E, 0x60, 0x5F, 0x63, 0x63, 0x5E, 0x62,
503 0x61, 0x60, 0x5E, 0x61, 0x60, 0x60, 0x5E, 0x62,
504 0x62, 0x5F, 0x5F, 0x5C, 0x60, 0x61, 0x60, 0x65,
505 0x67, 0x68, 0x68, 0x61, 0x5F, 0x5A, 0x58, 0x5A,
506 0x5A, 0x58, 0x57, 0x59, 0x5A, 0x5D, 0x5F, 0x60,
507 0x5D, 0x5C, 0x5C, 0x5C, 0x5B, 0x5D, 0x5C, 0x5F,
508 0x5E, 0x5F, 0x60, 0x60, 0x61, 0x62, 0x63, 0x65,
509 0x62, 0x64, 0x64, 0x64, 0x61, 0x60, 0x60, 0x5C,
510 0x5E, 0x5F, 0x5E, 0x60, 0x5E, 0x5D, 0x5C, 0x5E,
511 0x5D, 0x5B, 0x5D, 0x5D, 0x5B, 0x61, 0x5F, 0x5C,
512 0x5F, 0x5C, 0x5B, 0x5B, 0x57, 0x59, 0x56, 0x52,
513 0x50, 0x4C, 0x49, 0x4B, 0x4E, 0x55, 0x5E, 0x65,
514 0x6D, 0x73, 0x7F, 0x81, 0x85, 0x85, 0x8A, 0x89,
515 0x8A, 0x88, 0x86, 0x86, 0x88, 0x84, 0x89, 0x83,
516 0x88, 0x84, 0x84, 0x84, 0x82, 0x82, 0x82, 0x81,
517 0x83, 0x80, 0x80, 0x7F, 0x7F, 0x85, 0x80, 0x7E,
518 0x7D, 0x7D, 0x7E, 0x7D, 0x79, 0x79, 0x77, 0x73,
519 0x8B, 0xB6, 0xC7, 0xD0, 0xD3, 0xD5, 0xD8, 0xD8,
520 0xD2, 0xBC, 0x86, 0x4A, 0x48, 0x50, 0x52, 0x56,
521 0x58, 0x5A, 0x58, 0x5C, 0x5C, 0x59, 0x5B, 0x5B,
522 0x5A, 0x5E, 0x5E, 0x5E, 0x5F, 0x64, 0x66, 0x69,
523 0x62, 0x49, 0x27, 0x13, 0x0D, 0x14, 0x18, 0x10,
524 0x12, 0x12, 0x12, 0x14, 0x14, 0x1C, 0x19, 0x21,
525 0x82, 0x83, 0x86, 0x83, 0x83, 0x84, 0x84, 0x86,
526 0x86, 0x85, 0x85, 0x89, 0x8A, 0x8F, 0x8F, 0x91,
527 0x92, 0x8F, 0x8E, 0x8D, 0x86, 0x85, 0x84, 0x84,
528 0x85, 0x8A, 0x88, 0x83, 0x76, 0x69, 0x5E, 0x4E,
529 0x3D, 0x39, 0x34, 0x38, 0x3F, 0x40, 0x42, 0x45,
530 0x48, 0x47, 0x4C, 0x45, 0x4B, 0x49, 0x46, 0x44,
531 0x46, 0x43, 0x45, 0x48, 0x4A, 0x4A, 0x4F, 0x51,
532 0x53, 0x55, 0x59, 0x59, 0x5A, 0x5D, 0x5B, 0x59,
533 0x5F, 0x5C, 0x5D, 0x5C, 0x61, 0x61, 0x5F, 0x5D,
534 0x5D, 0x5B, 0x5F, 0x60, 0x61, 0x62, 0x5E, 0x60,
535 0x60, 0x60, 0x5F, 0x61, 0x61, 0x61, 0x60, 0x61,
536 0x61, 0x5F, 0x60, 0x5E, 0x61, 0x5C, 0x60, 0x65,
537 0x65, 0x64, 0x65, 0x62, 0x60, 0x5F, 0x5B, 0x58,
538 0x59, 0x55, 0x59, 0x57, 0x5B, 0x5A, 0x5C, 0x5F,
539 0x5E, 0x5C, 0x5C, 0x5D, 0x5D, 0x5A, 0x5C, 0x5D,
540 0x5E, 0x5F, 0x64, 0x5E, 0x60, 0x62, 0x61, 0x65,
541 0x67, 0x62, 0x64, 0x60, 0x60, 0x5D, 0x5F, 0x5E,
542 0x60, 0x61, 0x60, 0x60, 0x61, 0x5E, 0x58, 0x5E,
543 0x5C, 0x5A, 0x5D, 0x5B, 0x5B, 0x60, 0x5E, 0x5F,
544 0x5F, 0x61, 0x5A, 0x59, 0x55, 0x55, 0x57, 0x54,
545 0x4F, 0x4D, 0x4B, 0x4A, 0x4A, 0x55, 0x5F, 0x66,
546 0x6A, 0x74, 0x7B, 0x7D, 0x84, 0x84, 0x86, 0x89,
547 0x88, 0x87, 0x86, 0x84, 0x88, 0x82, 0x88, 0x84,
548 0x88, 0x84, 0x83, 0x83, 0x83, 0x82, 0x81, 0x81,
549 0x84, 0x81, 0x7F, 0x7F, 0x82, 0x88, 0x81, 0x83,
550 0x7D, 0x7F, 0x7D, 0x7D, 0x7A, 0x7A, 0x77, 0x72,
551 0x79, 0x9D, 0xBB, 0xCA, 0xD0, 0xD4, 0xD7, 0xD8,
552 0xD8, 0xCD, 0xAE, 0x6D, 0x49, 0x50, 0x50, 0x57,
553 0x55, 0x58, 0x54, 0x5B, 0x59, 0x5B, 0x5C, 0x5C,
554 0x5E, 0x5D, 0x5C, 0x61, 0x62, 0x66, 0x67, 0x65,
555 0x51, 0x27, 0x10, 0x0D, 0x15, 0x14, 0x15, 0x10,
556 0x16, 0x13, 0x15, 0x17, 0x17, 0x18, 0x19, 0x23
557};
558
559
560
561/*
562 Macro definitions
563*/
564
565#define abs(x) (x>=0 ? x : -(x))
566#define FILTER 0
567#define EXPAND 1
568#define IS ==
569#define ISNT !=
570#define AND &&
571#define OR ||
572
573#define NUM_LEVELS 4
574
575
576/*
577 Forward declaration of functions
578*/
579
580void epic_init( void );
581void epic_build_pyr( float *image, int x_size, int y_size, int num_levels,
582 float *lo_filter, float *hi_filter, int filter_size );
583void epic_build_level( float *image, int level_x_size, int level_y_size,
584 float *lo_filter, float *hi_filter,
585 int filter_size, float *result_block );
586void epic_internal_transpose( float *mat, int rows, int cols );
587void epic_internal_filter( float *image, int x_dim, int y_dim, float *filt,
588 float *temp, int x_fdim, int y_fdim,
589 int xgrid_start, int xgrid_step, int ygrid_start,
590 int ygrid_step, float *result );
591void epic_reflect1( float *filt, int x_dim, int y_dim, int x_pos, int y_pos,
592 float *result, int f_or_e );
593void epic_main( void );
594//int main( void );
595
596
597/*
598 Declaration of global variables
599*/
600
601float epic_filtertemp[FILTER_SIZE];
602float epic_hi_imagetemp[X_SIZE * Y_SIZE / 2];
603float epic_lo_imagetemp[X_SIZE * Y_SIZE / 2];
604
605static float epic_lo_filter[FILTER_SIZE] = {
606 -0.0012475221, -0.0024950907, 0.0087309530, 0.0199579580,
607 -0.0505290000, -0.1205509700, 0.2930455800,
608 0.7061761600,
609 0.2930455800, -0.1205509700, -0.0505290000,
610 0.0199579580, 0.0087309530, -0.0024950907, -0.0012475221
611};
612
613static float epic_hi_filter[FILTER_SIZE] = {
614 0.0012475221, -0.0024950907, -0.0087309530, 0.0199579580,
615 0.0505290000, -0.1205509700, -0.2930455800,
616 0.7061761600,
617 -0.2930455800, -0.1205509700, 0.0505290000,
618 0.0199579580, -0.0087309530, -0.0024950907, 0.0012475221
619};
620
621
622/*
623 Initialization function
624*/
625
626void epic_init( void )
627{
628 int i;
629
630 _Pragma( "loopbound min 4096 max 9801" )
631 for ( i = 0; i < X_SIZE * Y_SIZE; ++i )
632 epic_image[i] *= SCALE_FACTOR;
633}
634
635
636/*
637 Algorithm core functions
638*/
639
640/*
641 ======================================================================
642 epic_build_pyr() -- builds a separable QMF-style pyramid. The pyramid
643 is written over the original image. NOTE: the image size must be
644 divisible by 2^num_levels, but we do not check this here.
645 ======================================================================
646*/
647void epic_build_pyr( float *image, int x_size, int y_size, int num_levels,
648 float *lo_filter, float *hi_filter, int filter_size )
649{
650 int x_level, y_level, level;
651
652 x_level = x_size;
653 y_level = y_size;
654
655 _Pragma( "loopbound min 4 max 4" )
656 for ( level = 0; level < num_levels; ++level ){
657 epic_build_level( image, x_level, y_level, lo_filter, hi_filter,
658 filter_size, image );
659 x_level /= 2;
660 y_level /= 2;
661 }
662}
663
664
665/*
666 ======================================================================
667 epic_build_level() -- builds a level of the pyramid by computing 4
668 filtered and subsampled images. Since the convolution is separable,
669 image and result-block can point to the same place! Image order is
670 lowpass, horizontal, vertical (transposed), and diagonal.
671 ======================================================================
672*/
673void epic_build_level( float *image, int level_x_size, int level_y_size,
674 float *lo_filter, float *hi_filter,
675 int filter_size, float *result_block )
676{
677 int total_size = level_x_size * level_y_size;
678
679 /* filter and subsample in the X direction */
680 epic_internal_filter ( image, level_x_size, level_y_size,
681 lo_filter, epic_filtertemp, filter_size, 1,
682 0, 2, 0, 1, epic_lo_imagetemp );
683 epic_internal_filter ( image, level_x_size, level_y_size,
684 hi_filter, epic_filtertemp, filter_size, 1,
685 1, 2, 0, 1, epic_hi_imagetemp );
686
687 level_x_size /= 2;
688 /* now filter and subsample in the Y direction */
689 epic_internal_filter ( epic_lo_imagetemp, level_x_size,
690 level_y_size, /* lowpass */
691 lo_filter, epic_filtertemp, 1, filter_size,
692 0, 1, 0, 2, result_block );
693 epic_internal_filter ( epic_lo_imagetemp, level_x_size,
694 level_y_size, /* horizontal */
695 hi_filter, epic_filtertemp, 1, filter_size,
696 0, 1, 1, 2, ( result_block += ( total_size / 4 ) ) );
697 epic_internal_filter ( epic_hi_imagetemp, level_x_size,
698 level_y_size, /* vertical */
699 lo_filter, epic_filtertemp, 1, filter_size,
700 0, 1, 0, 2, ( result_block += ( total_size / 4 ) ) );
701 /* transpose the vertical band for more efficient scanning */
702 epic_internal_transpose( result_block, level_y_size / 2, level_x_size );
703 epic_internal_filter ( epic_hi_imagetemp, level_x_size,
704 level_y_size, /* diagonal */
705 hi_filter, epic_filtertemp, 1, filter_size,
706 0, 1, 1, 2, ( result_block += ( total_size / 4 ) ) );
707}
708
709
710/*
711 ======================================================================
712 In-place matrix tranpose algorithm. Handles non-square matrices,
713 too! Is there a faster algorithm??
714 ======================================================================
715*/
716void epic_internal_transpose( float *mat, int rows, int cols )
717{
718 register int swap_pos;
719 register int modulus = rows * cols - 1;
720 register int current_pos;
721 register float swap_val;
722
723 /* loop, ignoring first and last elements */
724 _Pragma( "loopbound min 1022 max 2399" )
725 for ( current_pos = 1; current_pos < modulus; ++current_pos ) {
726 /* Compute swap position */
727 swap_pos = current_pos;
728
729 _Pragma( "loopbound min 1 max 2" )
730 do {
731 swap_pos = ( swap_pos * cols ) % modulus;
732 } while ( swap_pos < current_pos );
733
734 if ( current_pos != swap_pos ) {
735 swap_val = mat[swap_pos];
736 mat[swap_pos] = mat[current_pos];
737 mat[current_pos] = swap_val;
738 }
739 }
740}
741
742
743/* --------------------------------------------------------------------
744 Correlate FILT with IMAGE, subsampling according to GRID parameters,
745 with values placed into result array. TEMP is a temporary
746 array the size of the filter. EDGES is a string -- see convolve.h.
747 The convolution is done in 9 sections, where the border sections use
748 specially computed edge-handling filters (see edges.c). The origin
749 of the filter is assumed to be (floor(x_fdim/2), floor(y_fdim/2)).
750 10/6/89 - approximately optimized the choice of register vars on SPARCS.
751 ------------------------------------------------------------------------ */
752void epic_internal_filter( float *image, int x_dim, int y_dim, float *filt,
753 float *temp, int x_fdim, int y_fdim,
754 int xgrid_start, int xgrid_step, int ygrid_start,
755 int ygrid_step, float *result )
756{
757 //register double sum;
758 register float sum;
759 register int x_filt, im_pos, y_filt_lin;
760 register int y_im_lin, x_pos, filt_size = x_fdim * y_fdim;
761 register int y_pos, res_pos;
762 register int last_ctr_col = x_dim - x_fdim;
763 int last_ctr_row = ( y_dim - y_fdim ) * x_dim;
764 int first_row, first_col ;
765 int x_fmid = x_fdim / 2;
766 int y_fmid = y_fdim / 2;
767 int x_stop = x_fdim - x_fmid + 1;
768 int y_stop = y_fdim - y_fmid + 1;
769 int ygrid_step_full = ygrid_step * x_dim;
770 int prev_res_pos, x_res_dim = ( x_dim - xgrid_start + xgrid_step - 1 ) /
771 xgrid_step;
772 int rt_edge_res_pos = x_res_dim;
773
774 res_pos = 0;
775 first_col = xgrid_start - x_fmid + xgrid_step;
776
777 _Pragma( "loopbound min 1 max 4" )
778 for ( y_pos = ygrid_start - y_fmid - 1; y_pos < 0; y_pos += ygrid_step ) {
779 _Pragma( "loopbound min 1 max 4" )
780 for ( x_pos = xgrid_start - x_fmid; /* top-left corner */
781 x_pos < 0;
782 x_pos += xgrid_step ) {
783 epic_reflect1( filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER );
784 sum = 0.0f;
785 x_filt = y_im_lin = 0;
786 _Pragma( "loopbound min 1 max 15" )
787 for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size;
788 y_filt_lin += x_fdim ) {
789 im_pos = y_im_lin;
790
791 _Pragma( "loopbound min 1 max 15" )
792 for ( ; x_filt < y_filt_lin; ++x_filt ) {
793 sum += image[im_pos] * temp[x_filt];
794 ++im_pos;
795 }
796 y_im_lin += x_dim;
797 }
798 result[res_pos] = sum;
799 ++res_pos;
800 }
801 first_col = x_pos + 1;
802 epic_reflect1( filt, x_fdim, y_fdim, 0, y_pos, temp, FILTER );
803 _Pragma( "loopbound min 41 max 46" )
804 for ( x_pos = first_col; /* top edge */
805 x_pos < last_ctr_col;
806 x_pos += xgrid_step ) {
807 sum = 0.0f;
808 x_filt = y_im_lin = 0;
809 _Pragma( "loopbound min 1 max 15" )
810 for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size;
811 y_filt_lin += x_fdim ) {
812 im_pos = x_pos + y_im_lin;
813 _Pragma( "loopbound min 1 max 15" )
814 for ( ; x_filt < y_filt_lin; ++x_filt ) {
815 sum += image[im_pos] * temp[x_filt];
816 ++im_pos;
817 }
818 y_im_lin += x_dim;
819 }
820 result[res_pos] = sum;
821 ++res_pos;
822 }
823 rt_edge_res_pos = res_pos + x_res_dim; /* save this for later ... */
824 _Pragma( "loopbound min 1 max 4" )
825 for ( x_pos += ( 1 - last_ctr_col ); /* top-right corner */
826 x_pos < x_stop;
827 x_pos += xgrid_step ) {
828 epic_reflect1( filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER );
829 sum = 0.0f;
830 x_filt = y_im_lin = 0;
831 _Pragma( "loopbound min 1 max 15" )
832 for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size;
833 y_filt_lin += x_fdim ) {
834 im_pos = y_im_lin + last_ctr_col;
835
836 _Pragma( "loopbound min 1 max 15" )
837 for ( ; x_filt < y_filt_lin; ++x_filt ) {
838 sum += image[im_pos] * temp[x_filt];
839 ++im_pos;
840 }
841 y_im_lin += x_dim;
842 }
843 result[res_pos] = sum;
844 ++res_pos;
845 }
846 } /* end top */
847
848 first_row = x_dim * ( y_pos + 1 ); /* need this to go down the sides */
849 prev_res_pos = res_pos;
850 _Pragma( "loopbound min 1 max 4" )
851 for ( x_pos = xgrid_start - x_fmid; /* left edge */
852 x_pos < 1;
853 x_pos += xgrid_step ) {
854 res_pos = prev_res_pos;
855 epic_reflect1( filt, x_fdim, y_fdim, x_pos, 0, temp, FILTER );
856 _Pragma( "loopbound min 41 max 97" )
857 for ( y_pos = first_row; y_pos < last_ctr_row;
858 y_pos += ygrid_step_full ) {
859 sum = 0.0f;
860 x_filt = 0, y_im_lin = y_pos;
861 _Pragma( "loopbound min 1 max 15" )
862 for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size;
863 y_filt_lin += x_fdim ) {
864 im_pos = y_im_lin;
865 _Pragma( "loopbound min 1 max 15" )
866 for ( ; x_filt < y_filt_lin; x_filt++ ) {
867 sum += image[im_pos] * temp[x_filt];
868 ++im_pos;
869 }
870 y_im_lin += x_dim;
871 }
872 result[res_pos] = sum;
873 res_pos += x_res_dim;
874 }
875 prev_res_pos++;
876 }
877 epic_reflect1( filt, x_fdim, y_fdim, 0, 0, temp, FILTER );
878 _Pragma( "loopbound min 41 max 97" )
879 for ( y_pos = first_row; /* center region of image */
880 y_pos < last_ctr_row;
881 y_pos += ygrid_step_full ) {
882 res_pos = prev_res_pos;
883 _Pragma( "loopbound min 41 max 46" )
884 for ( x_pos = first_col;
885 x_pos < last_ctr_col;
886 x_pos += xgrid_step ) {
887 sum = 0.0f;
888 x_filt = 0, y_im_lin = y_pos;
889 _Pragma( "loopbound min 1 max 15" )
890 for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size;
891 y_filt_lin += x_fdim ) {
892 im_pos = x_pos + y_im_lin;
893 _Pragma( "loopbound min 1 max 15" )
894 for ( ; x_filt < y_filt_lin; ++x_filt ) {
895 sum += image[im_pos] * temp[x_filt];
896 ++im_pos;
897 }
898 y_im_lin += x_dim;
899 }
900 result[res_pos] = sum;
901 ++res_pos;
902 }
903 prev_res_pos += x_res_dim;
904 }
905 prev_res_pos = rt_edge_res_pos;
906 _Pragma( "loopbound min 1 max 4" )
907 for ( x_pos += ( 1 - last_ctr_col ); /* right edge */
908 x_pos < x_stop;
909 x_pos += xgrid_step ) {
910 res_pos = prev_res_pos;
911 epic_reflect1( filt, x_fdim, y_fdim, x_pos, 0, temp, FILTER );
912 _Pragma( "loopbound min 41 max 97" )
913 for ( y_pos = first_row; y_pos < last_ctr_row;
914 y_pos += ygrid_step_full ) {
915 sum = 0.0f;
916 x_filt = 0, y_im_lin = y_pos;
917 _Pragma( "loopbound min 1 max 15" )
918 for ( y_filt_lin = x_fdim;
919 y_filt_lin <= filt_size;
920 y_filt_lin += x_fdim ) {
921 _Pragma( "loopbound min 1 max 15" )
922 for ( im_pos = y_im_lin + last_ctr_col;
923 x_filt < y_filt_lin;
924 ++x_filt ) {
925 sum += image[im_pos] * temp[x_filt];
926 ++im_pos;
927 }
928 y_im_lin += x_dim;
929 }
930 result[res_pos] = sum;
931 res_pos += x_res_dim;
932 }
933 prev_res_pos++;
934 } /* end mid */
935
936 res_pos -= ( x_res_dim - 1 ); /* go to lower left corner */
937 _Pragma( "loopbound min 1 max 4" )
938 for ( y_pos = ( ( y_pos - last_ctr_row ) / x_dim ) + 1; /* bottom */
939 y_pos < y_stop;
940 y_pos += ygrid_step ) {
941 _Pragma( "loopbound min 1 max 4" )
942 for ( x_pos = xgrid_start - x_fmid; /* bottom-left corner */
943 x_pos < 1;
944 x_pos += xgrid_step ) {
945 epic_reflect1( filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER );
946 sum = 0.0f;
947 x_filt = 0, y_im_lin = last_ctr_row;
948 _Pragma( "loopbound min 1 max 15" )
949 for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size;
950 y_filt_lin += x_fdim ) {
951 _Pragma( "loopbound min 1 max 15" )
952 for ( im_pos = y_im_lin;
953 x_filt < y_filt_lin;
954 ++x_filt ) {
955 sum += image[im_pos] * temp[x_filt];
956 ++im_pos;
957 }
958 y_im_lin += x_dim;
959 }
960 result[res_pos] = sum;
961 ++res_pos;
962 }
963 epic_reflect1( filt, x_fdim, y_fdim, 0, y_pos, temp, FILTER );
964 _Pragma( "loopbound min 41 max 46" )
965 for ( x_pos = first_col; /* bottom edge */
966 x_pos < last_ctr_col;
967 x_pos += xgrid_step ) {
968 sum = 0.0f;
969 x_filt = 0, y_im_lin = last_ctr_row;
970 _Pragma( "loopbound min 1 max 15" )
971 for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size;
972 y_filt_lin += x_fdim ) {
973 _Pragma( "loopbound min 1 max 15" )
974 for ( im_pos = x_pos + y_im_lin;
975 x_filt < y_filt_lin;
976 ++x_filt ) {
977 sum += image[im_pos] * temp[x_filt];
978 ++im_pos;
979 }
980 y_im_lin += x_dim;
981 }
982 result[res_pos] = sum;
983 ++res_pos;
984 }
985 _Pragma( "loopbound min 1 max 4" )
986 for ( x_pos += 1 - last_ctr_col; /* bottom-right corner */
987 x_pos < x_stop;
988 x_pos += xgrid_step ) {
989 epic_reflect1( filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER );
990 sum = 0.0f;
991 x_filt = 0, y_im_lin = last_ctr_row;
992 _Pragma( "loopbound min 1 max 15" )
993 for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size;
994 y_filt_lin += x_fdim ) {
995 _Pragma( "loopbound min 1 max 15" )
996 for ( im_pos = y_im_lin + last_ctr_col;
997 x_filt < y_filt_lin;
998 ++x_filt ) {
999 sum += image[im_pos] * temp[x_filt];
1000 ++im_pos;
1001 }
1002 y_im_lin += x_dim;
1003 }
1004 result[res_pos] = sum;
1005 ++res_pos;
1006 }
1007 } /* end bottom */
1008
1009} /* end of epic_internal_filter */
1010
1011
1012/*
1013 The following function determine how edges are to be handled
1014 when performing convolutions of images with linear filters.
1015 Any edge handling function which is local and linear may be defined,
1016 except (unfortunately) constants cannot be added. So to treat the
1017 edges as if the image is surrounded by a gray field, you must paste it
1018 into a gray image, convolve, and crop it out...
1019 The main convolution function is called epic_internal_filter. The idea
1020 is that the convolution function calls the edge handling function which
1021 computes a new filter based on the old filter and the distance to the
1022 edge of the image. For example, reflection is done by reflecting the
1023 filter through the appropriate axis and summing.
1024*/
1025
1026/*
1027 ---------------- EDGE HANDLER ARGUMENTS ------------------------
1028 filt - floating point array of filter taps.
1029 x_dim, y_dim - x and y dimensions of filt.
1030 x_pos - position of filter relative to the horizontal image edges. Negative
1031 values indicate left edge, positive indicate right edge. Zero
1032 indicates that the filter is not touching either edge. An absolute
1033 value of 1 indicates that the edge tap of the filter is over the
1034 edge pixel of the image.
1035 y_pos - analogous to x_pos.
1036 result - floating point array where the resulting filter will go. The edge
1037 of this filter will be aligned with the image for application...
1038 f_or_e - equal to one of the two constants EXPAND or FILTER.
1039 --------------------------------------------------------------------
1040*/
1041
1042/* --------------------------------------------------------------------
1043 epic_reflect1() - Reflection through the edge pixels. This is the right
1044 thing to do if you are subsampling by 2, since it maintains parity (even
1045 pixels positions remain even, odd ones remain odd). (note: procedure differs
1046 depending on f_or_e parameter). */
1047void epic_reflect1( float *filt, int x_dim, int y_dim, int x_pos, int y_pos,
1048 float *result, int f_or_e )
1049{
1050 int filt_sz = x_dim * y_dim;
1051 register int x_start = 0, y_start = 0, x_stop = x_dim, y_stop = filt_sz;
1052 register int y_filt, x_filt, y_edge, x_edge;
1053 register int x_base = ( x_pos > 0 ) ? ( x_dim - 1 ) : 0;
1054 register int y_base = ( y_pos > 0 ) ? ( x_dim * ( y_dim - 1 ) ) : 0;
1055 int x_edge_dist = ( x_pos > 0 ) ? ( x_pos - x_dim ) : ( ( x_pos < -1 ) ?
1056 ( x_pos + 1 ) : 0 );
1057 int y_edge_dist = x_dim * ( ( y_pos > 0 ) ? ( y_pos - y_dim ) : ( (
1058 y_pos < -1 ) ? ( y_pos + 1 ) : 0 ) );
1059 int i;
1060 int mx_pos = ( x_dim / 2 ) + 1;
1061 int my_pos = ( y_dim / 2 ) + 1;
1062
1063 _Pragma( "loopbound min 15 max 15" )
1064 for ( i = 0; i < filt_sz; ++i ) result[i] = 0.0f;
1065
1066 /* if EXPAND and filter is centered on image edge, do not reflect */
1067 if ( f_or_e IS EXPAND ) {
1068 if ( x_pos IS mx_pos ) x_stop = ( x_dim + 1 ) / 2;
1069 else
1070 if ( x_pos IS - mx_pos ) {
1071 x_start = x_dim / 2;
1072 x_edge_dist = 0;
1073 }
1074
1075 if ( y_pos IS my_pos ) y_stop = x_dim * ( ( y_dim + 1 ) / 2 );
1076 else
1077 if ( y_pos IS - my_pos ) {
1078 y_start = x_dim * ( y_dim / 2 );
1079 y_edge_dist = 0;
1080 }
1081 }
1082
1083 y_edge = y_edge_dist;
1084 /* reflect at boundary of image */
1085 _Pragma( "loopbound min 1 max 15" )
1086 for ( y_filt = y_start; y_filt < y_stop; y_filt += x_dim ) {
1087 x_edge = x_edge_dist;
1088 _Pragma( "loopbound min 1 max 15" )
1089 for ( x_filt = y_filt + x_start; x_filt < y_filt + x_stop; ++x_filt ) {
1090 result[abs( y_base - abs( y_edge ) ) + abs( x_base - abs( x_edge ) )]
1091 += filt[x_filt];
1092 ++x_edge;
1093 }
1094 y_edge += x_dim;
1095 }
1096
1097 /* if EXPAND and filter is not centered on image edge, mult edge by 2 */
1098 if ( f_or_e IS EXPAND ) {
1099 if ( ( abs( x_pos ) ISNT mx_pos ) AND ( x_pos ISNT 0 ) )
1100 _Pragma( "loopbound min 0 max 0" )
1101 for ( y_filt = x_base; y_filt < filt_sz; y_filt += x_dim )
1102 result[y_filt] += result[y_filt];
1103 if ( ( abs( y_pos ) ISNT my_pos ) AND ( y_pos ISNT 0 ) )
1104 _Pragma( "loopbound min 0 max 0" )
1105 for ( x_filt = y_base; x_filt < y_base + x_dim; ++x_filt )
1106 result[x_filt] += result[x_filt];
1107 }
1108}
1109
1110
1111/*
1112 Main functions
1113*/
1114
1115void _Pragma( "entrypoint" ) epic_main( void )
1116{
1117 epic_build_pyr( epic_image, X_SIZE, Y_SIZE, NUM_LEVELS, epic_lo_filter,
1118 epic_hi_filter, FILTER_SIZE );
1119}
1120
1121int epic_return(){
1122 int i;
1123 int checksum = 0;
1124 for ( i=0 ; i<X_SIZE*Y_SIZE ; i+=Y_SIZE+1 ){
1125 checksum += epic_image[i];
1126 }
1127 return ( checksum == 43968 ? 0 : 1);
1128}
1129
1130int main( int argc, char **argv )
1131{
1132 SET_UP
1133 for (jobsComplete=-1; jobsComplete<maxJobs; jobsComplete++){
1134 START_LOOP
1135 epic_init();
1136 epic_main();
1137 STOP_LOOP
1138 }
1139 WRITE_TO_FILE
1140 return epic_return();
1141}