diff options
author | Takamichi Horikawa <takamichiho@gmail.com> | 2017-09-21 23:51:14 +0900 |
---|---|---|
committer | Takamichi Horikawa <takamichiho@gmail.com> | 2017-09-21 23:51:14 +0900 |
commit | 492884b28d517363b244dc21c4c007ef093e9c69 (patch) | |
tree | a48d3042d34986211fa82204d80bc63491ce55f6 | |
parent | 8ff1fce2a918f4ff2b1df41efad2163e630c322f (diff) |
fmdsp-pacc: add music file name line
-rw-r--r-- | fmdsp/fmdsp-pacc.c | 418 | ||||
-rw-r--r-- | fmdsp/fmdsp-pacc.h | 7 | ||||
-rw-r--r-- | fmdsp/fmdsp_sprites.h | 2 |
3 files changed, 304 insertions, 123 deletions
diff --git a/fmdsp/fmdsp-pacc.c b/fmdsp/fmdsp-pacc.c index 39fbdfb..00fb935 100644 --- a/fmdsp/fmdsp-pacc.c +++ b/fmdsp/fmdsp-pacc.c @@ -136,6 +136,7 @@ struct fmdsp_pacc { struct pacc_tex *tex_panpot; struct pacc_tex *tex_comment; struct pacc_tex *tex_comment_tri; + struct pacc_tex *tex_playing; struct pacc_buf *buf_font_7; struct pacc_buf *buf_font_2, *buf_font_2_d; struct pacc_buf *buf_font_1, *buf_font_1_d; @@ -166,11 +167,14 @@ struct fmdsp_pacc { struct pacc_buf *buf_panpot_1_d, *buf_panpot_5_d; struct pacc_buf *buf_comment; struct pacc_buf *buf_comment_tri_d; + struct pacc_buf *buf_playing; struct opna *opna; struct fmdriver_work *work; struct fmplayer_fft_input_data *fftin; uint8_t curr_palette[FMDSP_PALETTE_COLORS*3]; uint8_t target_palette[FMDSP_PALETTE_COLORS*3]; + uint8_t comment_tex_buf[PC98_W*CHECKER_H]; + bool comment_tex_buf_changed; enum fmdsp_left_mode lmode; enum fmdsp_right_mode rmode; bool mode_changed; @@ -209,82 +213,167 @@ static struct pacc_tex *tex_from_font( return tex; } +static void fmdsp_pacc_deinit_buf(struct fmdsp_pacc *fp) { + fp->pacc.buf_delete(fp->buf_font_1); + fp->buf_font_1 = 0; + fp->pacc.buf_delete(fp->buf_font_1_d); + fp->buf_font_1_d = 0; + fp->pacc.buf_delete(fp->buf_font_2); + fp->buf_font_2 = 0; + fp->pacc.buf_delete(fp->buf_font_2_d); + fp->buf_font_2_d = 0; + fp->pacc.buf_delete(fp->buf_font_7); + fp->buf_font_7 = 0; + fp->pacc.buf_delete(fp->buf_checker); + fp->buf_checker = 0; + fp->pacc.buf_delete(fp->buf_checker_1); + fp->buf_checker_1 = 0; + fp->pacc.buf_delete(fp->buf_key_left); + fp->buf_key_left = 0; + fp->pacc.buf_delete(fp->buf_key_right); + fp->buf_key_right = 0; + fp->pacc.buf_delete(fp->buf_key_mask); + fp->buf_key_mask = 0; + fp->pacc.buf_delete(fp->buf_key_mask_sub); + fp->buf_key_mask_sub = 0; + fp->pacc.buf_delete(fp->buf_key_bg); + fp->buf_key_bg = 0; + fp->pacc.buf_delete(fp->buf_num); + fp->buf_num = 0; + fp->pacc.buf_delete(fp->buf_dt_sign); + fp->buf_dt_sign = 0; + fp->pacc.buf_delete(fp->buf_solid_2); + fp->buf_solid_2 = 0; + fp->pacc.buf_delete(fp->buf_solid_2_d); + fp->buf_solid_2_d = 0; + fp->pacc.buf_delete(fp->buf_solid_3); + fp->buf_solid_3 = 0; + fp->pacc.buf_delete(fp->buf_solid_3_d); + fp->buf_solid_3_d = 0; + fp->pacc.buf_delete(fp->buf_solid_7); + fp->buf_solid_7 = 0; + fp->pacc.buf_delete(fp->buf_solid_7_d); + fp->buf_solid_7_d = 0; + fp->pacc.buf_delete(fp->buf_vertical_2); + fp->buf_vertical_2 = 0; + fp->pacc.buf_delete(fp->buf_vertical_3); + fp->buf_vertical_3 = 0; + fp->pacc.buf_delete(fp->buf_vertical_7); + fp->buf_vertical_7 = 0; + fp->pacc.buf_delete(fp->buf_horizontal_2_d); + fp->buf_horizontal_2_d = 0; + fp->pacc.buf_delete(fp->buf_horizontal_3); + fp->buf_horizontal_3 = 0; + fp->pacc.buf_delete(fp->buf_horizontal_7_d); + fp->buf_horizontal_7_d = 0; + fp->pacc.buf_delete(fp->buf_logo); + fp->buf_logo = 0; + fp->pacc.buf_delete(fp->buf_ver); + fp->buf_ver = 0; + fp->pacc.buf_delete(fp->buf_text); + fp->buf_text = 0; + fp->pacc.buf_delete(fp->buf_tri); + fp->buf_tri = 0; + fp->pacc.buf_delete(fp->buf_tri_7); + fp->buf_tri_7 = 0; + fp->pacc.buf_delete(fp->buf_curl_left); + fp->buf_curl_left = 0; + fp->pacc.buf_delete(fp->buf_curl_right); + fp->buf_curl_right = 0; + fp->pacc.buf_delete(fp->buf_play); + fp->buf_play = 0; + fp->pacc.buf_delete(fp->buf_stop); + fp->buf_stop = 0; + fp->pacc.buf_delete(fp->buf_pause); + fp->buf_pause = 0; + fp->pacc.buf_delete(fp->buf_fade); + fp->buf_fade = 0; + fp->pacc.buf_delete(fp->buf_ff); + fp->buf_ff = 0; + fp->pacc.buf_delete(fp->buf_rew); + fp->buf_rew = 0; + fp->pacc.buf_delete(fp->buf_floppy); + fp->buf_floppy = 0; + fp->pacc.buf_delete(fp->buf_circle); + fp->buf_circle = 0; + fp->pacc.buf_delete(fp->buf_panpot_1_d); + fp->buf_panpot_1_d = 0; + fp->pacc.buf_delete(fp->buf_panpot_5_d); + fp->buf_panpot_5_d = 0; + fp->pacc.buf_delete(fp->buf_comment); + fp->buf_comment = 0; + fp->pacc.buf_delete(fp->buf_comment_tri_d); + fp->buf_comment_tri_d = 0; + fp->pacc.buf_delete(fp->buf_playing); + fp->buf_playing = 0; +} + +static void fmdsp_pacc_deinit_tex(struct fmdsp_pacc *fp) { + fp->pacc.tex_delete(fp->tex_font); + fp->tex_font = 0; + fp->pacc.tex_delete(fp->tex_checker); + fp->tex_checker = 0; + fp->pacc.tex_delete(fp->tex_key_left); + fp->tex_key_left = 0; + fp->pacc.tex_delete(fp->tex_key_right); + fp->tex_key_right = 0; + fp->pacc.tex_delete(fp->tex_key_mask); + fp->tex_key_mask = 0; + fp->pacc.tex_delete(fp->tex_key_bg); + fp->tex_key_bg = 0; + fp->pacc.tex_delete(fp->tex_num); + fp->tex_num = 0; + fp->pacc.tex_delete(fp->tex_dt_sign); + fp->tex_dt_sign = 0; + fp->pacc.tex_delete(fp->tex_solid); + fp->tex_solid = 0; + fp->pacc.tex_delete(fp->tex_vertical); + fp->tex_vertical = 0; + fp->pacc.tex_delete(fp->tex_horizontal); + fp->tex_horizontal = 0; + fp->pacc.tex_delete(fp->tex_logo); + fp->tex_logo = 0; + fp->pacc.tex_delete(fp->tex_ver); + fp->tex_ver = 0; + fp->pacc.tex_delete(fp->tex_text); + fp->tex_text = 0; + fp->pacc.tex_delete(fp->tex_tri); + fp->tex_tri = 0; + fp->pacc.tex_delete(fp->tex_curl_left); + fp->tex_curl_left = 0; + fp->pacc.tex_delete(fp->tex_curl_right); + fp->tex_curl_right = 0; + fp->pacc.tex_delete(fp->tex_play); + fp->tex_play = 0; + fp->pacc.tex_delete(fp->tex_stop); + fp->tex_stop = 0; + fp->pacc.tex_delete(fp->tex_pause); + fp->tex_pause = 0; + fp->pacc.tex_delete(fp->tex_fade); + fp->tex_fade = 0; + fp->pacc.tex_delete(fp->tex_ff); + fp->tex_ff = 0; + fp->pacc.tex_delete(fp->tex_rew); + fp->tex_rew = 0; + fp->pacc.tex_delete(fp->tex_floppy); + fp->tex_floppy = 0; + fp->pacc.tex_delete(fp->tex_circle); + fp->tex_circle = 0; + fp->pacc.tex_delete(fp->tex_panpot); + fp->tex_panpot = 0; + fp->pacc.tex_delete(fp->tex_comment); + fp->tex_comment = 0; + fp->pacc.tex_delete(fp->tex_comment_tri); + fp->tex_comment_tri = 0; + fp->pacc.tex_delete(fp->tex_playing); + fp->tex_playing = 0; +} + void fmdsp_pacc_release(struct fmdsp_pacc *fp) { if (fp) { if (fp->pc) { - fp->pacc.buf_delete(fp->buf_font_1); - fp->pacc.buf_delete(fp->buf_font_1_d); - fp->pacc.buf_delete(fp->buf_font_2); - fp->pacc.buf_delete(fp->buf_font_2_d); - fp->pacc.buf_delete(fp->buf_font_7); - fp->pacc.buf_delete(fp->buf_checker); - fp->pacc.buf_delete(fp->buf_checker_1); - fp->pacc.buf_delete(fp->buf_key_left); - fp->pacc.buf_delete(fp->buf_key_right); - fp->pacc.buf_delete(fp->buf_key_mask); - fp->pacc.buf_delete(fp->buf_key_mask_sub); - fp->pacc.buf_delete(fp->buf_key_bg); - fp->pacc.buf_delete(fp->buf_num); - fp->pacc.buf_delete(fp->buf_dt_sign); - fp->pacc.buf_delete(fp->buf_solid_2); - fp->pacc.buf_delete(fp->buf_solid_2_d); - fp->pacc.buf_delete(fp->buf_solid_3); - fp->pacc.buf_delete(fp->buf_solid_3_d); - fp->pacc.buf_delete(fp->buf_solid_7); - fp->pacc.buf_delete(fp->buf_solid_7_d); - fp->pacc.buf_delete(fp->buf_vertical_2); - fp->pacc.buf_delete(fp->buf_vertical_3); - fp->pacc.buf_delete(fp->buf_vertical_7); - fp->pacc.buf_delete(fp->buf_horizontal_2_d); - fp->pacc.buf_delete(fp->buf_horizontal_3); - fp->pacc.buf_delete(fp->buf_horizontal_7_d); - fp->pacc.buf_delete(fp->buf_logo); - fp->pacc.buf_delete(fp->buf_ver); - fp->pacc.buf_delete(fp->buf_text); - fp->pacc.buf_delete(fp->buf_tri); - fp->pacc.buf_delete(fp->buf_tri_7); - fp->pacc.buf_delete(fp->buf_curl_left); - fp->pacc.buf_delete(fp->buf_curl_right); - fp->pacc.buf_delete(fp->buf_play); - fp->pacc.buf_delete(fp->buf_stop); - fp->pacc.buf_delete(fp->buf_pause); - fp->pacc.buf_delete(fp->buf_fade); - fp->pacc.buf_delete(fp->buf_ff); - fp->pacc.buf_delete(fp->buf_rew); - fp->pacc.buf_delete(fp->buf_floppy); - fp->pacc.buf_delete(fp->buf_circle); - fp->pacc.buf_delete(fp->buf_panpot_1_d); - fp->pacc.buf_delete(fp->buf_panpot_5_d); - fp->pacc.buf_delete(fp->buf_comment); - fp->pacc.buf_delete(fp->buf_comment_tri_d); - fp->pacc.tex_delete(fp->tex_font); - fp->pacc.tex_delete(fp->tex_checker); - fp->pacc.tex_delete(fp->tex_key_left); - fp->pacc.tex_delete(fp->tex_key_right); - fp->pacc.tex_delete(fp->tex_key_mask); - fp->pacc.tex_delete(fp->tex_key_bg); - fp->pacc.tex_delete(fp->tex_num); - fp->pacc.tex_delete(fp->tex_dt_sign); - fp->pacc.tex_delete(fp->tex_solid); - fp->pacc.tex_delete(fp->tex_vertical); - fp->pacc.tex_delete(fp->tex_horizontal); - fp->pacc.tex_delete(fp->tex_logo); - fp->pacc.tex_delete(fp->tex_ver); - fp->pacc.tex_delete(fp->tex_text); - fp->pacc.tex_delete(fp->tex_tri); - fp->pacc.tex_delete(fp->tex_curl_left); - fp->pacc.tex_delete(fp->tex_curl_right); - fp->pacc.tex_delete(fp->tex_play); - fp->pacc.tex_delete(fp->tex_stop); - fp->pacc.tex_delete(fp->tex_pause); - fp->pacc.tex_delete(fp->tex_fade); - fp->pacc.tex_delete(fp->tex_ff); - fp->pacc.tex_delete(fp->tex_rew); - fp->pacc.tex_delete(fp->tex_floppy); - fp->pacc.tex_delete(fp->tex_circle); - fp->pacc.tex_delete(fp->tex_panpot); - fp->pacc.tex_delete(fp->tex_comment); - fp->pacc.tex_delete(fp->tex_comment_tri); + fmdsp_pacc_deinit_buf(fp); + fmdsp_pacc_deinit_tex(fp); } free(fp); } @@ -535,14 +624,7 @@ static void update_track_10(struct fmdsp_pacc *fp, const uint8_t *track_table, i } } -struct fmdsp_pacc *fmdsp_pacc_init( - struct pacc_ctx *pc, const struct pacc_vtable *vtable) { - struct fmdsp_pacc *fp = malloc(sizeof(*fp)); - if (!fp) goto err; - *fp = (struct fmdsp_pacc) { - .pc = pc, - .pacc = *vtable, - }; +static bool fmdsp_pacc_init_tex(struct fmdsp_pacc *fp) { fp->tex_font = tex_from_font(fp->pc, &fp->pacc, &font_fmdsp_small); if (!fp->tex_font) goto err; fp->tex_checker = fp->pacc.gen_tex(fp->pc, 2, 2); @@ -595,10 +677,12 @@ struct fmdsp_pacc *fmdsp_pacc_init( if (!fp->tex_circle) goto err; fp->tex_panpot = fp->pacc.gen_tex(fp->pc, PANPOT_W, PANPOT_H*6); if (!fp->tex_panpot) goto err; - fp->tex_comment = fp->pacc.gen_tex(fp->pc, PC98_W, COMMENT_H*3); + fp->tex_comment = fp->pacc.gen_tex(fp->pc, PC98_W, CHECKER_H); if (!fp->tex_comment) goto err; fp->tex_comment_tri = fp->pacc.gen_tex(fp->pc, COMMENT_TRI_W, COMMENT_TRI_H*2); if (!fp->tex_comment_tri) goto err; + fp->tex_playing = fp->pacc.gen_tex(fp->pc, PLAYING_W, PLAYING_H); + if (!fp->tex_playing) goto err; uint8_t *buf; buf = fp->pacc.tex_lock(fp->tex_checker); @@ -666,6 +750,9 @@ struct fmdsp_pacc *fmdsp_pacc_init( buf = fp->pacc.tex_lock(fp->tex_comment_tri); memcpy(buf, s_comment_tri, COMMENT_TRI_W*COMMENT_TRI_H*2); fp->pacc.tex_unlock(fp->tex_comment_tri); + buf = fp->pacc.tex_lock(fp->tex_playing); + memcpy(buf, s_playing, PLAYING_W*PLAYING_H); + fp->pacc.tex_unlock(fp->tex_playing); buf = fp->pacc.tex_lock(fp->tex_solid); buf[0] = 1; fp->pacc.tex_unlock(fp->tex_solid); @@ -715,7 +802,13 @@ struct fmdsp_pacc *fmdsp_pacc_init( } } fp->pacc.tex_unlock(fp->tex_circle); + return true; +err: + fmdsp_pacc_deinit_tex(fp); + return false; +} +static bool fmdsp_pacc_init_buf(struct fmdsp_pacc *fp) { fp->buf_font_1 = fp->pacc.gen_buf(fp->pc, fp->tex_font, pacc_buf_mode_static); if (!fp->buf_font_1) goto err; fp->buf_font_1_d = fp->pacc.gen_buf(fp->pc, fp->tex_font, pacc_buf_mode_stream); @@ -806,12 +899,41 @@ struct fmdsp_pacc *fmdsp_pacc_init( if (!fp->buf_comment) goto err; fp->buf_comment_tri_d = fp->pacc.gen_buf(fp->pc, fp->tex_comment_tri, pacc_buf_mode_stream); if (!fp->buf_comment_tri_d) goto err; + fp->buf_playing = fp->pacc.gen_buf(fp->pc, fp->tex_playing, pacc_buf_mode_static); + if (!fp->buf_playing) goto err; + return true; +err: + fmdsp_pacc_deinit_buf(fp); + return false; +} - fp->pacc.buf_rect_off(fp->pc, fp->buf_checker, 1, CHECKER_Y, PC98_W-1, CHECKER_H, 1, 0); - fp->pacc.buf_rect(fp->pc, fp->buf_checker, 0, CHECKER_Y+2, 1, CHECKER_H-4); - fp->pacc.buf_rect(fp->pc, fp->buf_comment, 0, COMMENT_Y, PC98_W, COMMENT_H*3); - memcpy(fp->target_palette, s_palettes[0], sizeof(fp->target_palette)); +bool fmdsp_pacc_init(struct fmdsp_pacc *fp, struct pacc_ctx *pc, const struct pacc_vtable *pacc) { + fp->pc = pc; + fp->pacc = *pacc; + if (!fmdsp_pacc_init_tex(fp)) goto err; + if (!fmdsp_pacc_init_buf(fp)) goto err; + fp->pacc.palette(fp->pc, fp->curr_palette, FMDSP_PALETTE_COLORS); fp->mode_changed = true; + return true; +err: + fp->pc = 0; + return false; +} + +void fmdsp_pacc_deinit(struct fmdsp_pacc *fp) { + if (fp->pc) { + fmdsp_pacc_deinit_buf(fp); + fmdsp_pacc_deinit_tex(fp); + fp->pc = 0; + } +} + +struct fmdsp_pacc *fmdsp_pacc_alloc(void) { + struct fmdsp_pacc *fp = malloc(sizeof(*fp)); + if (!fp) goto err; + *fp = (struct fmdsp_pacc) {0}; + + memcpy(fp->target_palette, s_palettes[0], sizeof(fp->target_palette)); return fp; err: fmdsp_pacc_release(fp); @@ -1299,9 +1421,11 @@ static void update_default(struct fmdsp_pacc *fp) { fp->pacc.buf_rect( fp->pc, fp->buf_vertical_3, 352, 70, 144, 4); - fp->pacc.buf_rect( - fp->pc, fp->buf_vertical_2, - 352 + pos*2, 70, 8, 4); + if (fp->work->playing) { + fp->pacc.buf_rect( + fp->pc, fp->buf_vertical_2, + 352 + pos*2, 70, 8, 4); + } fp->pacc.buf_rect( fp->pc, fp->work->loop_cnt ? fp->buf_solid_7_d : fp->buf_solid_3_d, 496, 70, 16, 4); @@ -1309,7 +1433,7 @@ static void update_default(struct fmdsp_pacc *fp) { // circle int clock = 8; if (fp->work->playing) { - if (fp->work->paused && (fp->framecnt % 32) < 16) { + if (fp->work->paused && (fp->framecnt % 32) >= 16) { clock = 8; } else { clock = (fp->work->timerb_cnt / 8) % 8; @@ -1470,10 +1594,26 @@ static void update_default(struct fmdsp_pacc *fp) { fp->pc, fp->buf_font_1_d, LEVEL_X + LEVEL_W*c, LEVEL_PROG_Y, "%03d", levels[c].prog); + } else { + fp->pacc.buf_printf( + fp->pc, fp->buf_font_1_d, + LEVEL_X + LEVEL_W*c, LEVEL_PROG_Y, + "%c%c%c", + fp->opna->drum.drums[0].playing ? 'B' : ' ', + fp->opna->drum.drums[1].playing ? 'S' : ' ', + fp->opna->drum.drums[2].playing ? 'T' : ' '); } uint8_t oct = levels[c].key >> 4; uint8_t n = levels[c].key & 0xf; - if (c != 9 && levels[c].playing && n < 12) { + if (c == 9) { + fp->pacc.buf_printf( + fp->pc, fp->buf_font_1_d, + LEVEL_X + LEVEL_W*c, LEVEL_KEY_Y, + "%c%c%c", + fp->opna->drum.drums[3].playing ? 'H' : ' ', + fp->opna->drum.drums[4].playing ? 'T' : ' ', + fp->opna->drum.drums[5].playing ? 'R' : ' '); + } else if (levels[c].playing && n < 12) { fp->pacc.buf_printf( fp->pc, fp->buf_font_1_d, LEVEL_X + LEVEL_W*c, LEVEL_KEY_Y, @@ -1514,8 +1654,32 @@ static void mode_update(struct fmdsp_pacc *fp) { fp->pacc.buf_clear(fp->buf_ff); fp->pacc.buf_clear(fp->buf_rew); fp->pacc.buf_clear(fp->buf_floppy); + fp->pacc.buf_clear(fp->buf_comment); + fp->pacc.buf_clear(fp->buf_playing); + fp->pacc.buf_rect_off(fp->pc, fp->buf_checker, 1, CHECKER_Y, PC98_W-1, CHECKER_H, 1, 0); fp->pacc.buf_rect(fp->pc, fp->buf_checker, 0, CHECKER_Y+2, 1, CHECKER_H-4); + fp->pacc.buf_rect(fp->pc, fp->buf_comment, 0, CHECKER_Y, PC98_W, CHECKER_H); + fp->pacc.buf_rect(fp->pc, fp->buf_playing, + PLAYING_X, PLAYING_Y, PLAYING_W, PLAYING_H); + fp->pacc.buf_rect(fp->pc, fp->buf_solid_7, 74, 332, PC98_W-74, 1); + fp->pacc.buf_rect(fp->pc, fp->buf_solid_2, 78, 324, 2, 7); + fp->pacc.buf_printf( + fp->pc, fp->buf_font_2, FILEBAR_MUS_X, PLAYING_Y+1, + "MUS"); + fp->pacc.buf_printf( + fp->pc, fp->buf_font_2, FILEBAR_IC_X, PLAYING_Y+1, + "IC"); + fp->pacc.buf_printf( + fp->pc, fp->buf_font_2, FILEBAR_F_X, PLAYING_Y+1, + "F"); + fp->pacc.buf_printf( + fp->pc, fp->buf_font_2, FILEBAR_ILE_X, PLAYING_Y+1, + "ILE"); + fp->pacc.buf_rect( + fp->pc, fp->buf_tri, + FILEBAR_TRI_X, FILEBAR_TRI_Y, FILEBAR_TRI_W, FILEBAR_TRI_H); + switch (fp->lmode) { case FMDSP_LEFT_MODE_OPNA: init_track_10(fp, track_disp_table_opna, 0); @@ -1547,6 +1711,12 @@ static void mode_update(struct fmdsp_pacc *fp) { } void fmdsp_pacc_render(struct fmdsp_pacc *fp) { + if (!fp->pc) return; + if (fp->comment_tex_buf_changed) { + void *buf = fp->pacc.tex_lock(fp->tex_comment); + memcpy(buf, fp->comment_tex_buf, sizeof(fp->comment_tex_buf)); + fp->pacc.tex_unlock(fp->tex_comment); + } if (memcmp(fp->curr_palette, fp->target_palette, sizeof(fp->target_palette))) { for (int i = 0; i < FMDSP_PALETTE_COLORS*3; i++) { uint8_t p = fp->curr_palette[i]; @@ -1706,6 +1876,7 @@ void fmdsp_pacc_render(struct fmdsp_pacc *fp) { fp->pacc.draw(fp->pc, fp->buf_curl_left, pacc_mode_copy); fp->pacc.draw(fp->pc, fp->buf_curl_right, pacc_mode_copy); fp->pacc.draw(fp->pc, fp->buf_circle, pacc_mode_copy); + fp->pacc.draw(fp->pc, fp->buf_playing, pacc_mode_copy); fp->pacc.color(fp->pc, 2); fp->pacc.draw(fp->pc, fp->buf_comment, pacc_mode_color_trans); fp->pacc.draw(fp->pc, fp->buf_comment_tri_d, pacc_mode_color_trans); @@ -1786,13 +1957,14 @@ static void font_putline( const char *strptr, uint8_t *tex, int texwidth, const struct fmdsp_font *font, - int x, int y) { + int x, int y, int maxwidth) { const uint8_t *cp932str = (const uint8_t *)strptr; bool sjis_is2nd = false; uint8_t sjis_1st; int fw = font->width_half; int fh = font->height; int xo = 0; + if (!maxwidth) maxwidth = texwidth - x; enum { STATE_NORMAL, @@ -1831,7 +2003,7 @@ static void font_putline( xo -= (xo % (fw*8)); cp932str++; } else { - if ((x+xo+fw) > texwidth) return; + if ((xo+fw) > maxwidth) return; const void *fp = font->get(font, *cp932str++, FMDSP_FONT_ANK); if (fp) { font_putchar(tex, texwidth, fp, x+xo, y, fw, fh); @@ -1846,7 +2018,7 @@ static void font_putline( uint8_t sjis_2nd = *cp932str++; uint16_t jis = sjis2jis(sjis_1st, sjis_2nd); bool half = jis_is_halfwidth(jis); - if ((x+xo+fw*(half ? 1 : 2)) > texwidth) return; + if ((xo+fw*(half ? 1 : 2)) > maxwidth) return; const void *fp = font->get(font, jis, FMDSP_FONT_JIS_LEFT); if (fp) { font_putchar(tex, texwidth, fp, x+xo, y, fw, fh); @@ -1879,8 +2051,7 @@ static void draw_tri(uint8_t *buf, int width, int x, int y) { static void fmdsp_pacc_comment_draw(struct fmdsp_pacc *fp) { if (!fp->font16) return; if (!fp->work) return; - uint8_t *buf = fp->pacc.tex_lock(fp->tex_comment); - memset(buf, 0, PC98_W*COMMENT_H*3); + memset(fp->comment_tex_buf, 0, PC98_W*CHECKER_H); const char *str; if (fp->work->comment_mode_pmd) { fp->comment_prev_avail = fp->comment_offset; @@ -1891,39 +2062,45 @@ static void fmdsp_pacc_comment_draw(struct fmdsp_pacc *fp) { if (n == 0) { str = fp->work->get_comment(fp->work, 0); if (str) { - font_putline("MUS", buf, PC98_W, &font_fmdsp_small, - 14, COMMENT_H*i+7); - font_putline("IC", buf, PC98_W, &font_fmdsp_small, - 28, COMMENT_H*i+7); - font_putline("T", buf, PC98_W, &font_fmdsp_small, - 40, COMMENT_H*i+7); - font_putline("ITLE", buf, PC98_W, &font_fmdsp_small, - 44, COMMENT_H*i+7); - draw_tri(buf, PC98_W, 65, COMMENT_H*i+10); - font_putline(str, buf, PC98_W, fp->font16, 81, COMMENT_H*i); + font_putline("MUS", fp->comment_tex_buf, PC98_W, &font_fmdsp_small, + 14, COMMENT_H*i+12, 0); + font_putline("IC", fp->comment_tex_buf, PC98_W, &font_fmdsp_small, + 28, COMMENT_H*i+12, 0); + font_putline("T", fp->comment_tex_buf, PC98_W, &font_fmdsp_small, + 40, COMMENT_H*i+12, 0); + font_putline("ITLE", fp->comment_tex_buf, PC98_W, &font_fmdsp_small, + 44, COMMENT_H*i+12, 0); + draw_tri(fp->comment_tex_buf, PC98_W, 65, COMMENT_H*i+15); + font_putline(str, fp->comment_tex_buf, + PC98_W, fp->font16, 80, COMMENT_H*i+4, 0); } } else if (n == 1) { str = fp->work->get_comment(fp->work, 1); if (str) { - font_putline("COMPOSER", buf, PC98_W, &font_fmdsp_small, - 24, COMMENT_H*i+7); - draw_tri(buf, PC98_W, 65, COMMENT_H*i+10); - font_putline(str, buf, PC98_W, fp->font16, 81, COMMENT_H*i); + font_putline("COMPOSER", + fp->comment_tex_buf, PC98_W, &font_fmdsp_small, + 24, COMMENT_H*i+12, 0); + draw_tri(fp->comment_tex_buf, PC98_W, 65, COMMENT_H*i+15); + font_putline(str, fp->comment_tex_buf, + PC98_W, fp->font16, 80, COMMENT_H*i+4, 224); } str = fp->work->get_comment(fp->work, 2); if (str) { - font_putline("ARRANGER", buf, PC98_W, &font_fmdsp_small, - 312, COMMENT_H*i+7); - draw_tri(buf, PC98_W, 353, COMMENT_H*i+10); - font_putline(str, buf, PC98_W, fp->font16, 371, COMMENT_H*i); + font_putline("ARRANGER", + fp->comment_tex_buf, PC98_W, &font_fmdsp_small, + 312, COMMENT_H*i+12, 0); + draw_tri(fp->comment_tex_buf, PC98_W, 353, COMMENT_H*i+15); + font_putline(str, fp->comment_tex_buf, + PC98_W, fp->font16, 368, COMMENT_H*i+4, 0); } } else { str = fp->work->get_comment(fp->work, n+1); if (str) { - font_putline("MEMO", buf, PC98_W, &font_fmdsp_small, - 44, COMMENT_H*i+7); - draw_tri(buf, PC98_W, 65, COMMENT_H*i+10); - font_putline(str, buf, PC98_W, fp->font16, 81, COMMENT_H*i); + font_putline("MEMO", fp->comment_tex_buf, PC98_W, &font_fmdsp_small, + 44, COMMENT_H*i+12, 0); + draw_tri(fp->comment_tex_buf, PC98_W, 65, COMMENT_H*i+15); + font_putline(str, fp->comment_tex_buf, + PC98_W, fp->font16, 80, COMMENT_H*i+4, 0); } } } @@ -1932,10 +2109,11 @@ static void fmdsp_pacc_comment_draw(struct fmdsp_pacc *fp) { fp->comment_next_avail = false; for (int i = 0; i < 3; i++) { const char *str = fp->work->get_comment(fp->work, i); - if (str) font_putline(str, buf, PC98_W, fp->font16, 0, i*COMMENT_H); + if (str) font_putline(str, fp->comment_tex_buf, + PC98_W, fp->font16, 0, COMMENT_H*i+5, 0); } } - fp->pacc.tex_unlock(fp->tex_comment); + fp->comment_tex_buf_changed = true; } void fmdsp_pacc_comment_reset(struct fmdsp_pacc *fp) { diff --git a/fmdsp/fmdsp-pacc.h b/fmdsp/fmdsp-pacc.h index b5d7bf8..7fabd0b 100644 --- a/fmdsp/fmdsp-pacc.h +++ b/fmdsp/fmdsp-pacc.h @@ -38,10 +38,13 @@ enum fmdsp_right_mode { FMDSP_RIGHT_MODE_CNT }; -struct fmdsp_pacc *fmdsp_pacc_init( +struct fmdsp_pacc *fmdsp_pacc_alloc(void); +void fmdsp_pacc_release(struct fmdsp_pacc *fp); +bool fmdsp_pacc_init(struct fmdsp_pacc *fp, struct pacc_ctx *pc, const struct pacc_vtable *vtable); +void fmdsp_pacc_deinit(struct fmdsp_pacc *fp); + void fmdsp_pacc_set(struct fmdsp_pacc *pacc, struct fmdriver_work *work, struct opna *opna, struct fmplayer_fft_input_data *fftin); -void fmdsp_pacc_release(struct fmdsp_pacc *fp); void fmdsp_pacc_render(struct fmdsp_pacc *fp); void fmdsp_pacc_palette(struct fmdsp_pacc *fp, int p); diff --git a/fmdsp/fmdsp_sprites.h b/fmdsp/fmdsp_sprites.h index fa0c032..1553400 100644 --- a/fmdsp/fmdsp_sprites.h +++ b/fmdsp/fmdsp_sprites.h @@ -46,7 +46,7 @@ enum { PLAYING_Y = 324, PLAYING_W = 72, PLAYING_H = 9, - FILEBAR_X = 78, + FILEBAR_X = 77, FILEBAR_MUS_X = FILEBAR_X + 6, FILEBAR_IC_X = FILEBAR_MUS_X + 14, FILEBAR_F_X = FILEBAR_IC_X + 11, |