summaryrefslogtreecommitdiff
path: root/csrc
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-09-28 10:50:51 +0800
committerIru Cai <mytbk920423@gmail.com>2018-09-28 10:50:51 +0800
commitbbc4041694744cdf68462619d7a9fddfae82eff4 (patch)
tree4c1c644c36a7eaa4c00dadb01ce66fb9752026d9 /csrc
parent8db05a1a311f5d196c14e7946a1c0e6c3603007f (diff)
downloadrich4-bbc4041694744cdf68462619d7a9fddfae82eff4.tar.xz
move update_pixels to mkf.c
Diffstat (limited to 'csrc')
-rw-r--r--csrc/mkf.c50
-rw-r--r--csrc/mkf_cfunc.c124
2 files changed, 46 insertions, 128 deletions
diff --git a/csrc/mkf.c b/csrc/mkf.c
index 535d120..a454fdd 100644
--- a/csrc/mkf.c
+++ b/csrc/mkf.c
@@ -13,9 +13,6 @@
/* mkf_00455040.c */
void fcn_00455040(char *arg1, char *arg2);
-/* mkf_cfunc.c */
-void fcn_00451801(int16_t *a, int nbytes);
-
struct mkf
{
HANDLE handle;
@@ -89,8 +86,53 @@ static void update_spr_smp_ptr(char *s)
}
}
+int pixel_fmt;
+
+static void update_pixels(uint16_t *a, int nbytes)
+{
+ int nw = nbytes >> 1;
+
+ switch (pixel_fmt) {
+ case 1:
+ for (int i = 0; i < nw; i++) {
+ uint16_t t = a[i];
+ uint16_t t2 = t * 2;
+ t &= 0x001f; /* t[0:4] */
+ t2 &= 0xffc0; /* t2[6:15] = t[5:14] */
+ a[i] = t | t2; /* t[0:4],0,t[5:14] */
+ }
+ return;
+ case 2:
+ for (int i = 0; i < nw; i++) {
+ uint16_t t = a[i];
+ uint16_t v1 = (t & 0x7c00) >> 10; /* v1[0:4] = t[10:14] */
+ uint16_t v2 = (t & 0x03e0) << 1; /* v2[6:10] = t[5:9] */
+ uint16_t v3 = (t & 0x001f) << 11; /* v3[11:15] = t[0:4] */
+ a[i] = v1 | v2 | v3; /* t[10:14],0,t[5:9],t[0:4] */
+ }
+ return;
+ case 3:
+ for (int i = 0; i < nw; i++) {
+ uint16_t t = a[i];
+ uint16_t v1 = (t & 0x7800) >> 3; /* v1[8:11] = t[11:14] */
+ uint16_t v2 = (t & 0x03c0) >> 2; /* v2[4:7] = t[6:9] */
+ uint16_t v3 = (t & 0x001e) >> 1; /* v3[0:3] = t[1:4] */
+ a[i] = v1 | v2 | v3; /* t[1:4],t[6:9],t[11:14] */
+ }
+ return;
+ default:
+ return;
+ }
+}
+
char * read_mkf(int mkf_idx, int a1, char *buf, int *bufsize)
{
+ /* 4-dword mkf info:
+ * [0]: real data size
+ * [1]: original size in file
+ * [2]: graphics data offset
+ * [3]: graphics data size in bytes
+ */
uint32_t data[4];
int sz;
@@ -115,7 +157,7 @@ char * read_mkf(int mkf_idx, int a1, char *buf, int *bufsize)
free(tmpbuf);
}
if (data[3] != 0) {
- fcn_00451801(buf+data[2], data[3]);
+ update_pixels((uint16_t*)(buf + data[2]), data[3]);
}
if (bufsize != NULL) {
*bufsize = data[0];
diff --git a/csrc/mkf_cfunc.c b/csrc/mkf_cfunc.c
deleted file mode 100644
index 3855fc6..0000000
--- a/csrc/mkf_cfunc.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2018 Iru Cai <mytbk920423@gmail.com>
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
-
-#include <string.h>
-#include <stdint.h>
-
-int pixel_fmt;
-
-#ifndef UNROLL
-void fcn_00451801(int16_t *a, int nbytes)
-#else
-void fcn_00451801_no_unroll(int16_t *a, int nbytes)
-#endif
-{
- int nw = nbytes >> 1;
-
- switch (pixel_fmt) {
- case 1:
- for (int i = 0; i < nw; i++) {
- uint16_t t = a[i];
- uint16_t t2 = t * 2;
- t &= 0x001f; /* t[0:4] */
- t2 &= 0xffc0; /* t2[6:15] = t[5:14] */
- a[i] = t | t2; /* t[0:4],0,t[5:14] */
- }
- return;
- case 2:
- for (int i = 0; i < nw; i++) {
- uint16_t t = a[i];
- uint16_t v1 = (t & 0x7c00) >> 10; /* v1[0:4] = t[10:14] */
- uint16_t v2 = (t & 0x03e0) << 1; /* v2[6:10] = t[5:9] */
- uint16_t v3 = (t & 0x001f) << 11; /* v3[11:15] = t[0:4] */
- a[i] = v1 | v2 | v3; /* t[10:14],0,t[5:9],t[0:4] */
- }
- return;
- case 3:
- for (int i = 0; i < nw; i++) {
- uint16_t t = a[i];
- uint16_t v1 = (t & 0x7800) >> 3; /* v1[8:11] = t[11:14] */
- uint16_t v2 = (t & 0x03c0) >> 2; /* v2[4:7] = t[6:9] */
- uint16_t v3 = (t & 0x001e) >> 1; /* v3[0:3] = t[1:4] */
- a[i] = v1 | v2 | v3; /* t[1:4],t[6:9],t[11:14] */
- }
- return;
- default:
- return;
- }
-}
-
-#if 0
-void fcn_00451801(int16_t *a1, int nbytes)
-{
- int t; /* esp + 8 */
- int s; /* esp */
- int u; /* esp + 4 */
- uint32_t *edi = a1;
- uint32_t *edx;
- esi = nbytes;
- t = (nbytes >> 1) & 1;
- esi >>= 2;
- eax = dw_47637c;
- switch (eax) {
- case 1:
- for (eax = 0; eax < esi; eax++) {
- edx = &edi[eax];
- ecx = *edx;
- ebx = ecx*2;
- ecx &= 0x001f001f;
- ebx &= 0xffc0ffc0;
- *edx = ecx | ebx;
- }
- if (t == 0)
- return;
- eax = 0;
- ax = *(int16_t*)edx;
- ecx = eax * 2;
- eax &= 0x1f;
- ecx &= 0xffc0;
- *(uint16_t*)edx = (uint16_t)(eax | ecx);
- return;
- case 2:
- for (eax = 0; eax < esi; eax++) {
- edx = &edi[eax];
- ecx = *edx;
- s = (ecx & 0x7c007c00) >> 10;
- u = (ecx & 0x03e003e0) * 2;
- ebx = (ecx & 0x001f001f) << 11;
- ecx = s | u | ebx;
- *edx = ecx;
- }
- if (t == 0)
- return;
- eax = 0;
- ax = *(uint16_t*)edx;
- s = (eax & 0x7c00) >> 10;
- u = (eax & 0x03e0) * 2;
- eax = (eax & 0x001f) << 11;
- *(uint16_t)edx = (uint16_t)(eax | s | u);
- return;
- case 3:
- for (eax = 0; eax < esi; eax++) {
- edx = &edi[eax];
- ecx = *edx;
- ebx = (ecx & 0x78007800) >> 3;
- ebp = (ecx & 0x03c003c0) >> 2;
- ecx = (ecx & 0x001e001e) >> 1;
- *edx = ecx | ebx | ebp;
- }
- if (s==0)
- return;
- eax = 0;
- ax = *(uint16_t*)edx;
- s = (eax & 0x7800) >> 3;
- u = (eax & 0x03c0) >> 2;
- ecx = (eax & 0x001e) >> 1;
- *(uint16_t*)edx = (uint16_t)(s | u | ecx);
- return;
- default:
- return;
- }
-}
-#endif