gpmark

view src/radialblur.cpp @ 0:5019d031b485

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 05 Jun 2013 22:33:37 +0300
parents
children
line source
1 #include <math.h>
3 #include "main.h"
4 #include "sky1.h"
6 unsigned char rbmp[ScreenSize];
7 unsigned char gbmp[ScreenSize];
8 unsigned char bbmp[ScreenSize];
10 unsigned char rbuffer[ScreenSize];
11 unsigned char gbuffer[ScreenSize];
12 unsigned char bbuffer[ScreenSize];
14 short radir0[ScreenSize];
15 short radir1[ScreenSize];
16 short radir2[ScreenSize];
18 short radir3[ScreenSize];
19 short radir4[ScreenSize];
20 short radir5[ScreenSize];
22 void InitRadialBitmap1()
23 {
24 int x, y, i = 0;
25 unsigned short c;
26 for (y=0; y<ScreenHeight; y++)
27 {
28 for (x=0; x<ScreenWidth; x ++)
29 {
30 c = sky1[(x&255) + (((ScreenHeight-1)-y)<<8)];
31 rbmp[i] = ((c>>11) & 31) << 3;
32 gbmp[i] = ((c>>5) & 63) << 2;
33 bbmp[i] = (c & 31) << 3;
34 i++;
35 }
36 }
37 }
39 void InitRadialblur()
40 {
41 InitRadialBitmap1();
43 float rb_shortness = 4.0f;
45 int xi, yi;
46 int i=0;
47 int x, y;
48 for (y=0; y<ScreenHeight; y++)
49 {
50 for (x=0; x<ScreenWidth; x++)
51 {
52 xi = (int)(-(x/rb_shortness));
53 yi = (int)(-(y/rb_shortness));
54 radir0[i] = (xi>>1) + (yi>>1)*ScreenWidth;
55 radir1[i] = (xi>>2) + (yi>>2)*ScreenWidth;
56 radir2[i] = (xi>>3) + (yi>>3)*ScreenWidth;
57 i++;
58 }
59 }
61 i=0;
62 for (y=0; y<ScreenHeight; y++)
63 {
64 for (x=0; x<ScreenWidth; x++)
65 {
66 xi = (int)(-(x/rb_shortness));
67 yi = (int)(y/rb_shortness);
68 radir3[i] = (xi>>1) + (yi>>1)*ScreenWidth;
69 radir4[i] = (xi>>2) + (yi>>2)*ScreenWidth;
70 radir5[i] = (xi>>3) + (yi>>3)*ScreenWidth;
71 i++;
72 }
73 }
74 }
77 void InitRadialBitmapCopy()
78 {
79 int i;
80 unsigned int *rbuffer32 = (unsigned int*)rbuffer, *gbuffer32 = (unsigned int*)gbuffer, *bbuffer32 = (unsigned int*)bbuffer;
81 for (i=0; i<ScreenSize; i+=4)
82 {
83 *rbuffer32++ = rbmp[i] | (rbmp[i+1]<<8) | (rbmp[i+2]<<16) | (rbmp[i+3]<<24);
84 *gbuffer32++ = gbmp[i] | (gbmp[i+1]<<8) | (gbmp[i+2]<<16) | (gbmp[i+3]<<24);
85 *bbuffer32++ = bbmp[i] | (bbmp[i+1]<<8) | (bbmp[i+2]<<16) | (bbmp[i+3]<<24);
86 }
87 }
89 void Radial(int ntime, unsigned short *vram)
90 {
91 int i,ri;
93 int dcx = (int)(sin((float)ntime/23.0f)*(ScreenWidth>>1));
94 int dcy = (int)(sin((float)ntime/32.0f)*(ScreenHeight>>1));
95 int dci = dcx + dcy*ScreenWidth;
97 InitRadialBitmapCopy();
99 unsigned short *avram;
101 // 1o tetarthmorio
103 avram=(unsigned short*)vram + (ScreenWidth/2-1) + (ScreenHeight/2-1)*ScreenWidth + dci;
105 i=(ScreenWidth/2-1) + (ScreenHeight/2-1)*ScreenWidth + dci;
106 ri=0;
107 for (int y=ScreenHeight/2-1+dcy; y>=0; y--)
108 {
109 for (int x=ScreenWidth/2-1+dcx; x>=0; x--)
110 {
112 rbuffer[i] = (rbuffer[i] + rbuffer[i - radir0[ri]] + rbuffer[i - radir1[ri]] + rbuffer[i - radir2[ri]])>>2;
113 gbuffer[i] = (gbuffer[i] + gbuffer[i - radir0[ri]] + gbuffer[i - radir1[ri]] + gbuffer[i - radir2[ri]])>>2;
114 bbuffer[i] = (bbuffer[i] + bbuffer[i - radir0[ri]] + bbuffer[i - radir1[ri]] + bbuffer[i - radir2[ri]])>>2;
115 *avram-- = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3);
116 i--;
117 ri++;
118 }
119 i=i-ScreenWidth/2+dcx;
120 ri+=ScreenWidth/2-dcx;
121 avram=avram-ScreenWidth/2+dcx;
122 }
125 // 2 tetarthmorio
127 avram=(unsigned short*)vram + ScreenWidth/2 + (ScreenHeight/2-1)*ScreenWidth + dci;
129 i=ScreenWidth/2 + (ScreenHeight/2-1)*ScreenWidth + dci;
130 ri=0;
131 for (int y=ScreenHeight/2-1+dcy; y>=0; y--)
132 {
133 for (int x=ScreenWidth/2+dcx; x<ScreenWidth; x++)
134 {
135 rbuffer[i] = (rbuffer[i] + rbuffer[i + radir3[ri]] + rbuffer[i + radir4[ri]] + rbuffer[i + radir5[ri]])>>2;
136 gbuffer[i] = (gbuffer[i] + gbuffer[i + radir3[ri]] + gbuffer[i + radir4[ri]] + gbuffer[i + radir5[ri]])>>2;
137 bbuffer[i] = (bbuffer[i] + bbuffer[i + radir3[ri]] + bbuffer[i + radir4[ri]] + bbuffer[i + radir5[ri]])>>2;
138 *avram++ = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3);
139 i++;
140 ri++;
141 }
142 i=i-3*(ScreenWidth/2)+dcx;
143 ri+=ScreenWidth/2+dcx;
144 avram=avram-3*(ScreenWidth/2)+dcx;
145 }
148 // 3 tetarthmorio
150 avram=(unsigned short*)vram + ScreenWidth/2 + (ScreenHeight/2)*ScreenWidth + dci;
152 i=ScreenWidth/2 + (ScreenHeight/2)*ScreenWidth + dci;
153 ri=0;
154 for (int y=ScreenHeight/2+dcy; y<ScreenHeight; y++)
155 {
156 for (int x=ScreenWidth/2+dcx; x<ScreenWidth; x++)
157 {
158 rbuffer[i] = (rbuffer[i] + rbuffer[i + radir0[ri]] + rbuffer[i + radir1[ri]] + rbuffer[i + radir2[ri]])>>2;
159 gbuffer[i] = (gbuffer[i] + gbuffer[i + radir0[ri]] + gbuffer[i + radir1[ri]] + gbuffer[i + radir2[ri]])>>2;
160 bbuffer[i] = (bbuffer[i] + bbuffer[i + radir0[ri]] + bbuffer[i + radir1[ri]] + bbuffer[i + radir2[ri]])>>2;
161 *avram++ = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3);
162 i++;
163 ri++;
164 }
165 i+=ScreenWidth/2+dcx;
166 ri+=ScreenWidth/2+dcx;
167 avram+=ScreenWidth/2+dcx;
168 }
172 // 4o tetarthmorio
174 avram=(unsigned short*)vram + (ScreenWidth/2-1) + (ScreenHeight/2)*ScreenWidth + dci;
176 i=(ScreenWidth/2-1) + (ScreenHeight/2)*ScreenWidth + dci;
177 ri=0;
178 for (int y=ScreenHeight/2+dcy; y<ScreenHeight; y++)
179 {
180 for (int x=ScreenWidth/2-1+dcx; x>=0; x--)
181 {
182 rbuffer[i] = (rbuffer[i] + rbuffer[i - radir3[ri]] + rbuffer[i - radir4[ri]] + rbuffer[i - radir5[ri]])>>2;
183 gbuffer[i] = (gbuffer[i] + gbuffer[i - radir3[ri]] + gbuffer[i - radir4[ri]] + gbuffer[i - radir5[ri]])>>2;
184 bbuffer[i] = (bbuffer[i] + bbuffer[i - radir3[ri]] + bbuffer[i - radir4[ri]] + bbuffer[i - radir5[ri]])>>2;
185 *avram-- = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3);
186 i--;
187 ri++;
188 }
189 i+=3*(ScreenWidth/2)+dcx;
190 ri+=ScreenWidth/2-dcx;
191 avram+=3*(ScreenWidth/2)+dcx;
192 }
193 }
195 void RunRadialblur(int ntime, unsigned short *vram)
196 {
197 Radial(ntime, vram);
198 }