Skip to content
Snippets Groups Projects
Commit 741cf8f4 authored by Fang Lu's avatar Fang Lu
Browse files

osufs -fixes

parent 10558d01
No related branches found
No related tags found
No related merge requests found
......@@ -52,10 +52,6 @@ uint16_t img_write_dither128(const char *filename, mdev *dev, uint16_t addr) {
fprintf(stderr, "Internal Error: failed to read palette!\n");
return addr;
}
printf("Read %d palette entries\n", nplt);
for (int i=0; i<nplt; i++) {
printf("%02x #%02x%02x%02x\n", i, plt[i].red, plt[i].green, plt[i].blue);
}
// Dump palette
uint8_t buf[512], *pltbuf = buf + 3;
......@@ -63,9 +59,9 @@ uint16_t img_write_dither128(const char *filename, mdev *dev, uint16_t addr) {
buf[1] = 'L';
buf[2] = 'T';
for (int i=0; i<128; i++) {
pltbuf[i*3+0] = plt[i].red;
pltbuf[i*3+1] = plt[i].green;
pltbuf[i*3+2] = plt[i].blue;
pltbuf[i*3+0] = plt[i+128].red;
pltbuf[i*3+1] = plt[i+128].green;
pltbuf[i*3+2] = plt[i+128].blue;
}
blkio_write(dev, addr++, buf);
......@@ -83,14 +79,14 @@ uint16_t img_write_dither128(const char *filename, mdev *dev, uint16_t addr) {
return addr;
}
size_t img_write_rgb16(const char *filename, mdev *dev, uint16_t addr) {
size_t img_write_rgb16(const char *filename, mdev *dev, uint16_t addr, int w, int h) {
char cbuf[1024];
int ret;
system("rm -f /tmp/source.bmp");
system("rm -f /tmp/source.png");
// Resize
sprintf(cbuf, "ffmpeg -i \"%s\" -vf \"scale=640:480\" -pix_fmt rgb24 /tmp/source.png", filename);
sprintf(cbuf, "ffmpeg -i \"%s\" -vf \"scale=%d:%d\" -pix_fmt rgba /tmp/source.png", filename, w, h);
ret = system(cbuf);
if (ret != 0) {
fprintf(stderr, "ffmpeg resize failed with exit code: %d\n", ret);
......@@ -103,9 +99,9 @@ size_t img_write_rgb16(const char *filename, mdev *dev, uint16_t addr) {
return addr;
}
PNGImage img = pngimg_read("/tmp/dither.png");
if (img.color_type != PNG_COLOR_TYPE_RGB) {
fprintf(stderr, "Internal Error: resized image is not RGB24!\n");
PNGImage img = pngimg_read("/tmp/source.png");
if (img.color_type != PNG_COLOR_TYPE_RGBA) {
fprintf(stderr, "Internal Error: resized image is not RGBA!\n");
return addr;
}
......@@ -114,15 +110,21 @@ size_t img_write_rgb16(const char *filename, mdev *dev, uint16_t addr) {
uint16_t buf[256];
size_t npixels = img.width * img.height;
int bufptr, pixptr = 0;
uint8_t r, g, b;
uint8_t r, g, b, a;
png_bytep pixdata = img.row_pointers[0];
while (pixptr < npixels) {
bufptr = 0;
while (bufptr < 256) {
r = pixdata[pixptr*3+0];
g = pixdata[pixptr*3+1];
b = pixdata[pixptr*3+2];
buf[bufptr++] = 0;
r = pixdata[pixptr*4+0]>>3;
g = pixdata[pixptr*4+1]>>2;
b = pixdata[pixptr*4+2]>>3;
a = pixdata[pixptr*4+3];
if (a < 96) {
// Transparent
buf[bufptr++] = 0x07e0;
} else {
buf[bufptr++] = (r<<11)|(g<<5)|b;
}
pixptr++;
if (pixptr >= npixels)
break;
......@@ -135,5 +137,5 @@ size_t img_write_rgb16(const char *filename, mdev *dev, uint16_t addr) {
fclose(fp);
return 0;
return addr;
}
......@@ -17,7 +17,7 @@ extern "C" {
#include "blkio.h"
uint16_t img_write_dither128(const char *filename, mdev *dev, uint16_t addr);
uint16_t img_write_r(const char *filename, mdev *dev, uint16_t addr);
size_t img_write_rgb16(const char *filename, mdev *dev, uint16_t addr, int w, int h);
#ifdef __cplusplus
}
......
......@@ -63,6 +63,7 @@ osufs_init:
while (1) {
buf[0] = '\0';
printf("OsuFs> ");
memset(buf, 0, IO_BUFLEN);
if (!fgets(buf, IO_BUFLEN, stdin)) {
// EOF
printf("exit\n");
......@@ -134,7 +135,15 @@ osufs_init:
}
filename = osu_read_dir(dir);
}
} else if (strcasecmp(pcmd, "install") == 0) {
if (!phead) {
printf("Usage: install skin directory\n");
goto parse_end;
}
printf("Installing directory as default skin...\n");
osu_install_skin(phead, dev, &meta);
} else if (strcasecmp(pcmd, "flushmeta") == 0) {
printf("Flushing meta...\n");
osu_write_meta(dev, &meta);
} else if (strcasecmp(pcmd, "exit") == 0) {
break;
......@@ -145,7 +154,8 @@ osufs_init:
parse_end:
void(0);
}
printf("Flushing meta...\n");
osu_write_meta(dev, &meta);
blkio_close(dev);
return 0;
......
......@@ -21,6 +21,15 @@
using namespace std;
void osu_install_skin(const char *dirname, mdev *dev, osu_meta *meta) {
char cbuf[1024];
sprintf(cbuf, "%s/test.png", dirname);
meta->test_w=150;
meta->test_h=150;
meta->available_block = img_write_rgb16(cbuf, dev, meta->available_block, 150, 150);
}
osu_dir osu_open_dir(const char *dirname) {
osu_dir ret;
ret.dir = opendir(dirname);
......
......@@ -22,6 +22,8 @@ typedef struct osu_dir_t {
std::map< std::string, std::pair<uint16_t,uint16_t> > fs;
} osu_dir;
void osu_install_skin(const char *dirname, mdev *dev, osu_meta *meta);
osu_song osu_read_osu(const char *filename, mdev *dev, osu_meta *meta,
osu_dir *cont);
osu_dir osu_open_dir(const char *dirname);
......
......@@ -106,23 +106,12 @@ extern "C" {
uint16_t soft_padding_len; // 206 - 207
// Image resources
uint32_t cursor_begin;
uint16_t cursor_w;
uint16_t cursor_h;
uint32_t test_img;
uint16_t test_w;
uint16_t test_h;
uint32_t menu_bg_begin;
uint32_t menu_bg_len;
uint32_t menu_back_begin;
uint16_t menu_back_w;
uint16_t menu_back_h;
char _padding[502]; // 10 - 511
char _padding[296]; // 10 - 511
} osu_meta;
typedef struct __attribute__((__packed__)) osu_song_t {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment