kolibrios/programs/games/marblematch3/game/rsgametext.c
alpine ba5bb1ced2 Marble Match 3 game update.
- updated fonts



git-svn-id: svn://kolibrios.org@5242 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-12-19 10:44:00 +00:00

492 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "rs/rsplatform.h"
#include "rsgametext.h"
#include "rsgame.h"
#include "rsgentex.h"
#include "rskos.h"
#ifdef RS_USE_C_LIBS
#include <math.h>
#include <stdlib.h>
#include <string.h>
#endif
signed short pp_seg[32*8] = {
// 0
16, 6-16,
16, 6+16,
16, 6,
13, 0,
// 1
26-16, 16,
26+16, 16,
26, 11,
8, 0,
// 2
26-16, 16,
26+16, 16,
26, 21,
8, 0,
// 3
16, 26-16,
16, 26+16,
16, 26,
13, 0,
// 4
6-16, 16,
6+16, 16,
6, 21,
8, 0,
// 5
6-16, 16,
6+16, 16,
6, 11,
8, 0,
// 6
16, 16-16,
16, 16+16,
16, 16,
13, 0,
// 7
16, 4-22,
16, 4+22,
16, 4,
4, 0,
// 8
16-16, 16,
16+16, 16,
16, 11,
8, 0,
// 9
16-16, 16,
16+16, 16,
16, 21,
8, 0,
// 10
21-16, 11+16,
21+16, 11-16,
21, 11,
9, 0,
// 11 modified
16-16, 16+16,
16+16, 16-16,
21, 21,
9, 0,
// 12
16-16, 16-16,
16+16, 16+16,
21, 11,
9, 0,
// 13
21-16, 21-16,
21+16, 21+16,
21, 21,
9, 0,
// 14
16, 16-16,
16, 16+16,
10, 16,
7, 0,
// 15
16, 16-16,
16, 16+16,
22, 16,
7, 0,
// 16
16-16, 16+16,
16+16, 16-16,
11, 11,
8, 0,
// 17
11-16, 21+16,
11+16, 21-16,
11, 21,
9, 0,
// 18
11-16, 11-16,
11+16, 11+16,
11, 11,
9, 0,
// 19
16-16, 16-16,
16+16, 16+16,
11, 21,
9, 0,
// 20 == copy 11 modified
21-22, 21+22,
21+22, 21-22,
21, 21,
9, 0,
// 21 - right
27-12, 28-9,
27+12, 28+9,
27, 27,
4, 0,
// 22 - left
5-12, 28+9,
5+12, 28-9,
5, 27,
4, 0,
// 23
6-16, 16,
6+16, 16,
6, 8,
5, 0,
// 24
16-33, 16,
16+33, 16,
16, 13,
4, 0,
// 25
16-33, 16,
16+33, 16,
16, 26,
4, 0,
// 26
16, 6-16,
16, 6+16,
11, 6,
7, 0,
// 27
16, 26-16,
16, 26+16,
11, 26,
7, 0,
// 28
16, 6-16,
16, 6+16,
21, 6,
7, 0,
// 29
16, 26-16,
16, 26+16,
21, 26,
7, 0,
// 30 ,
11-22, 27-22,
11+22, 27+22,
11, 25,
6, 0,
// 31 not implemented - need to create up-left DOT for percent(%) sign
16, 26-16,
16, 26+16,
16, 26,
13, 0,
};
unsigned int ch_seg[64] = {
0b00111111 /* | 1<<12 | 1<<19 */, // 0 or O
1<<26 | 1<<8 | 1<<9 | 1<<3, // 1
0b01011011, // 2
1<<0 | 1<<12 | 1<<15 | 1<<2 | 1<<3, // 3
0b01100110, // 4
0b01101101, // 5
1<<0 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6, // 6 // old: 1<<6 | 1<<2 | 1<<3 | 1<<4 | 1<<18 | 1<<28, // 6
1<<23 | 1<<0 | 1<<1 | 1<<13 , //0b00000111 , // 7
0b01111111, // 8
1<<6 | 1<<5 | 1<<0 | 1<<1 | 1<<2 | 1<<3, // 9
1<<24 | 1<<25, // :
1<<8 | 1<<25, // ;
1<<12 | 1<<11, // <
1<<6, // = (-)
1<<16 | 1<<19, // >
1<<23 | 1<<0 | 1<<1 | 1<<15 | 1<<25 | 1<<9, // ?
1<<19 | 1<<12, // @ (/)
1<<0 | 1<<1 | 1<<2 | 1<<6 | 1<<4 | 1<<5, // A
1<<26 | 1<<10 | 1<<6 | 1<<11 | 1<<3 | 1<<4 | 1<<5, // B
1<<0 | 1<<5 | 1<<4 | 1<<3, // C // corners: 1<<28 | 1<<18 | 1<<17 | 1<<29,
1<<26 | 1<<27 | 1<<5 | 1<<4 | 1<<10 | 1<<13 , // D
1<<0 | 1<<14 | 1<<3 | 1<<5 | 1<<4, // E
1<<0 | 1<<14 | 1<<5 | 1<<4, // F
1<<0 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<15, // G
1<<1 | 1<<2 | 1<<5 | 1<<4 | 1<<6, // H
1<<0 | 1<<8 | 1<<9 | 1<<3, // I
1<<1 | 1<<2 | 1<<3 | 1<<4, // J
1<<5 | 1<<4 | 1<<14 | 1<<12 | 1<<11, // K
1<<5 | 1<<4 | 1<<3, // L
1<<5 | 1<<4 | 1<<1 | 1<<2 | 1<<16 | 1<<12, // M
1<<5 | 1<<4 | 1<<16 | 1<<11 | 1<<1 | 1<<2, // N
1<<16 | 1<<11 | 1<<19 | 1<<12 | 1<<6 | 1<<8 | 1<<9, // O - FREE SYMBOL
1<<4 | 1<<5 | 1<<0 | 1<<1 | 1<<6, // P
1<<0 | 1<<1 | 1<<13 | 1<<27 | 1<<4 | 1<<5 | 1<<11, // Q // old: 0b00111111 | 1<<11, // Q
1<<0 | 1<<1 | 1<<6 | 1<<5 | 1<<4 | 1<<11, // R
(1 << 18 | 1 << 13) | (1 << 29 | 1 << 26) | (1 << 5 | 1 << 2) | (1 << 19 | 1 << 12), // percent(%) sign, s == 5 -> // 0b01101101, // S
1<<0 | 1<<8 | 1<<9, // T
1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5, // U
1<<1 | 1<<13 | 1<<17 | 1<<5, // V
1<<5 | 1<<4 | 1<<19 | 1<<11 | 1<<2 | 1<<1, // W
1<<16 | 1<<11 | 1<<19 | 1<<12, // X
1<<5 | 1<<6 | 1<<1 | 1<<2 | 1<<3, // Y
1<<0 | 1<<12 | 1<<19 | 1<<3, // Z
1<<26 | 1<<8 | 1<<9 | 1<<29 | 1<<2 | 1<<15, // [Ъ
1<<5 | 1<<4 | 1<<27 | 1<<9 | 1<<14 | 1<<1 | 1<<2, // \Ы
1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<6, // ]Ь
1<<7 | 1<<5 | 1<<4 | 1<<19 | 1<<12 | 1<<1 | 1<<2, // ^Й
1<<30, // _ (,comma)
1<<25, // ` dot
1<<5 | 1<<0 | 1<<1 | 1<<6 | 1<<2 | 1<<19, // aЯ
1<<0 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<6, // bБ
1<<5 | 1<<4 | 1<<3 | 1<<1 | 1<<2 | 1<<21, // cЦ
0b011001000000010000011100, // dД
1<<0 | 1<<1 | 1<<15 | 1<<2 | 1<<3, // eЭ // with corners: 1<<26 | 1<<10 | 1<<6 | 1<<13 | 1<<27, // eЭ
1<<0 | 1<<1 | 1<<6 | 1<<5 | 1<<8 | 1<<9, // fФ
1<<4 | 1<<5 | 1<<0, // gГ
1<<5 | 1<<4 | 1<<3 | 1<<1 | 1<<2 | 1<<9, // hШ,
1<<5 | 1<<4 | 1<<19 | 1<<12 | 1<<1 | 1<<2, // iИ
1<<5 | 1<<8 | 1<<1 | 1<<6 | 1<<4 | 1<<9 | 1<<2, // old: 1<<16 | 1<<8 | 1<<12 | 1<<19 | 1<<9 | 1<<11, // jЖ
1<<5 | 1<<4 | 1<<14 | 1<<8 | 1<<9 | 1<<1 | 1<<2 | 1<<28 | 1<<29, // k_Ю
1<<4 | 1<<18 | 1<<28 | 1<<1 | 1<<2, // l // old symmetric: 1<<4 | 1<<18 | 1<<10 | 1<<2, // l // old: 1<<19 | 1<<12 | 1<<1 | 1<<2, // lЛ
1<<5 | 1<<4 | 1<<3 | 1<<1 | 1<<2 | 1<<9 | 1<<21, // mЩ,
1<<4 | 1<<5 | 1<<0 | 1<<1 | 1<<2, // n
(1<<8 | 1<<9) | 1<<10 | 1<<18, // 'o' for arrow up ^
};
void game_font_init() {
DEBUG30(":: font init start");
float scale = 1.0;
int seg;
int ch;
int ch_bit;
// // FAT FONT #1 (OK)
// float scales[4] = { 0.4, 0.6, 0.2, 2 }; // 2,1,1,1
// float pows[4] = { 15.0, 19.0, 200.0, 22.0 };
// float ks1[4] = { 1.2, 1.0, 1.2, 0.90 }; // 0.75 straight
// float ks2[4] = { -1.0, -1.0, -1.0, -1.0 };
// float pows1[4] = { 1.0, 0.79, 1.0, 1.0 };
// float pows2[4] = { 1.0, 0.79, 1.0, 1.0 };
// float clamp1[4] = { 0.8, 0.75, 0.65, 0.87 }; // 0.8 to 0.86
// float clamp2[4] = { 0.85, 0.85, 0.85, 0.92 };
// float radiuses[4] = { 1.0, 1.1, 1.2, 0.87 };
float scales[4] = { 0.69, 2.0, 0.2, 0.5 }; // 2,1,1,1
//float pows[4] = { 45.0, 100.0, 200.0, 22.0 };
float pows[4] = { 8.0, 7.0, 15.0, 22.0 };
float ks1[4] = { 0.01, 0.05, 1.2, 0.90 }; // 0.75 straight
float ks2[4] = { -3.75, -2.75, -1.0, -1.0 };
float pows1[4] = { 1.0, 1.0, 1.0, 1.0 };
float pows2[4] = { 0.6, 0.6, 1.0, 1.0 };
float clamp1[4] = { 0.65, 0.69, 0.65, 0.87 }; // 0.8 to 0.86
float clamp2[4] = { 0.85, 0.75, 0.85, 0.92 };
float radiuses[4] = { 0.9667, 0.997, 1.2, 0.87 };
float colors_r[4] = { 0.15, 0.997, 1.0, 0.4 };
float colors_g[4] = { 0.10, 0.875, 1.0, 0.6 };
float colors_b[4] = { 0.05, 0.763, 1.0, 0.8 };
// 1: 0.5, 0.74, 0.79
DEBUG20(":: font init label-a");
int font_index = 0;
int font_index_color = 0;
for (font_index_color = 0; font_index_color < FONTS_COUNT; font_index_color++) {
font_index = font_index_color % 3;
DEBUG30f(":: font init label-b (font index %d) \n", font_index);
scale = scales[font_index];
rs_gen_reg.cell_scale = scale;
int char_tex_size = scale*32;
// DEBUG10f("char_tex_size %d \n", char_tex_size);
rs_gen_init(97, char_tex_size);
for (seg = 0; seg < 32; seg++) {
rs_gen_func_cell(seg, 1, 2, &pp_seg[8*seg], ks1[font_index], pows1[font_index], ks2[font_index], pows2[font_index], 0.0, 0.0);
//rs_gen_func_cell(seg, 1, 2, &pp_seg[8*seg], 1.2, 1.0, -1.0, 1.0, 0.0, 0.0);
//rs_gen_func_cell(seg, 1, 2, &pp_seg[8*seg], 0.48450032, 1.0, -1.0, 2.20, 0.0, 0.0); // toon
rs_gen_func_normalize(seg, 0.0, 1.0); // 0.1 to 1.0
rs_gen_func_clamp(seg, clamp1[font_index], clamp2[font_index]); // 0.8, 0.86); // toon 0.775, 0.839889
rs_gen_func_normalize(seg, 0.0, 1.0); // 0.1 to 1.0
rs_gen_func_set(96, 0.0);
rs_gen_func_radial(96, (float)pp_seg[8*seg + 4]/32.0, (float)pp_seg[8*seg + 5]/32.0, (float)pp_seg[8*seg + 6]/32.0*radiuses[font_index], 1.0, pows[font_index]);
rs_gen_func_mult(seg, seg, 96);
};
for (ch = 0; ch < 64; ch++) {
rs_gen_func_set(32+ch, 0.0);
for (ch_bit = 0; ch_bit < 32; ch_bit++) {
if ( (1<<ch_bit) & (ch_seg[ch]) ) {
rs_gen_func_add_lerped(32+ch, 32+ch, ch_bit, 1.0, 1.0);
}
}
rs_gen_func_clamp(32+ch, (ch+ch/8)%2 ? 0.0 : 0.0, 1.0);
// rs_gen_func_set(32+ch, (ch+ch/8)%2 ? 0.5 : 0.0);
rs_gen_func_set(96, 1.0);
rs_gen_tex_out_rgba_set(0.0, 0.0, 0.0, 0.0);
//rs_gen_tex_out_rgba(32+ch, 32+ch, 32+ch, 32+ch, colors_b[font_index_color], colors_g[font_index_color], colors_r[font_index_color], 1.0);
rs_gen_tex_out_rgba(96, 96, 96, 32+ch, colors_b[font_index_color], colors_g[font_index_color], colors_r[font_index_color], 1.0);
texture_init(&game.tex_font[font_index_color*64 + ch], char_tex_size, char_tex_size);
memcpy(game.tex_font[font_index_color*64 + ch].data, rs_gen_reg.tex_out, char_tex_size*char_tex_size*4 );
}
/*
float *fontdata = malloc(256*scale*256*scale*4);
int i, j, k;
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
for (k = 0; k < 32*scale; k++) {
memcpy( &(fontdata[i*256*(32*scale)*scale + k*256*scale + (j)*(32*scale)]), &(rs_gen_reg.tex[k*(32*scale) + (32+j+i*8)*(32*scale)*(32*scale)] ), 32*4*scale );
};
};
};
rs_gen_term();
int font_tex_size = 256*scale;
rs_gen_init(2, font_tex_size);
memcpy( rs_gen_reg.tex, fontdata, 256*256 * 4 *scale*scale);
rs_gen_func_set(1, 1.0);
rs_gen_tex_out_rgba_set(0.0, 0.0, 0.0, 0.0);
rs_gen_tex_out_rgba(1, 1, 1, 0, 1.0, 1.0, 1.0, 1.0);
//game.font_texture[font_index] = rs_tx_create_from_data(font_tex_size, font_tex_size, 4, 1, 0, rs_gen_reg.tex_out);
game_loader_create_texture( &(game.font_texture[font_index]), font_tex_size, font_tex_size, 4, 1, 0, rs_gen_reg.tex_out );
save_image(0, rs_gen_reg.tex_out, 256*scale, 256*scale, 4);
*/
rs_gen_term();
// free(fontdata);
//
// game.loader_progress = font_index+2;
};
rs_gen_reg.cell_scale = 1;
};
void game_font_term() {
int i;
for (i = 0; i < 64*FONTS_COUNT; i++) {
texture_free(&game.tex_font[i]);
};
};
//float game_colors[4*7] = {
// 0.0, 0.0, 0.0, 1.0,
// 1.0, 1.0, 1.0, 1.0,
// 1.0, 0.9, 0.3, 1.0,
// 1.0, 0.4, 0.3, 1.0,
// 0.6, 0.8, 1.0, 1.0,
// 1.0, 0.8, 0.6, 1.0,
// 0.6, 0.6, 0.6, 0.9,
//};
void game_textout(int x, int y, int font_index, char* s) {
game_textout_adv(&game.framebuffer, x, y, font_index, DRAW_MODE_ALPHA, s);
};
void game_textout_at_center(int x, int y, int font_index, char *s) {
x += (GAME_WIDTH - game.tex_font[font_index*64].w*strlen(s))/2;
game_textout_adv(&game.framebuffer, x, y, font_index, DRAW_MODE_ALPHA, s);
};
void game_textout_adv(rs_texture_t *dest, int x, int y, int font_index, int draw_mode, char* s) {
int i = 0;
while (*s) {
if (*s != ' ') {
texture_draw(dest, &game.tex_font[ 64*font_index + ((*s - 48) % 64) ], x+i*game.tex_font[64*font_index+0].w, y, draw_mode);
};
s++;
i++;
};
};