+ *dst++ = src[(i + scrollTableRounded[scanline]) % scrollModTable[scanline]];
+ }
+ src += backgroundW;
+ }
+}
+
+/* src and dst can be the same */
+static void convert32To16(unsigned int *src32, unsigned short *dst16, unsigned int pixelCount) {
+ unsigned int p;
+ while (pixelCount) {
+ p = *src32++;
+ *dst16++ = ((p << 8) & 0xF800) /* R */
+ | ((p >> 5) & 0x07E0) /* G */
+ | ((p >> 19) & 0x001F); /* B */
+ pixelCount--;
+ }
+}
+
+/* Normal map preprocessing */
+/* Scale normal with depth and unpack R component (horizontal component) */
+static void processNormal() {
+ int scanline;
+ unsigned int *normalmap = (unsigned int*)background;
+ normalmap += NORMALMAP_SCANLINE * backgroundW;
+ unsigned short *dst = normalmap;
+ float scale;
+ int i;
+ int x;
+
+ for (scanline = 0; scanline < REFLECTION_HEIGHT; scanline++) {
+ scale = 2.0f - (float)scanline / ((float)REFLECTION_HEIGHT - 1);
+ scrollModTable[scanline] = (int) (backgroundW / scale + 0.5f);
+ for (i = 0; i < backgroundW; i++) {
+ x = (int)(i * scale + 0.5f);
+ *dst++ = x < backgroundW ? normalmap[x] & 0xFF : 0;