void text_printC(int x, [purple]int[/purple] y, [purple]char[/purple] c, [purple]int[/purple] size, [purple]int[/purple] color)
{
[purple]int[/purple] i, j, byte_width, alpha;
char* data;
[b][blue]if[/blue][/b](c<32 || c>127 || size<1) [b][blue]return[/blue][/b];
byte_width = ((used_font[b]->[/b]width-1)>>3)+1;
data = used_font[b]->[/b]data + byte_width * used_font[b]->[/b]height * (c-32);
alpha = [maroon]32[/maroon] - ((color>>16) % 32);
color &= [maroon]0[/maroon]xFFFF;
[b][blue]for[/blue][/b](i=[maroon]0[/maroon] ; i<used_font[b]->[/b]height ; i++) {
[b][blue]for[/blue][/b](j=[maroon]0[/maroon] ; j<used_font[b]->[/b]width ; j++) {
[b][blue]if[/blue][/b](data[i*byte_width+(j>>3)] & (128>>(j&7)))
text_drawPoint(x+j*size, y+i*size, size, color, alpha);
[b][blue]else[/blue][/b] if(used_font[b]->[/b]flags & ANTIALIASING) { [green]// Antialiasing[/green]
[b][blue]if[/blue][/b](text_readPix(data, j, i-1, used_font[b]->[/b]width, used_font[b]->[/b]height)) {
[b][blue]if[/blue][/b](text_readPix(data, j-1, i, used_font[b]->[/b]width, used_font[b]->[/b]height)) text_antialias(x+j*size, y+i*size, size, color, alpha, [maroon]0[/maroon]);
[b][blue]if[/blue][/b](text_readPix(data, j+1, i, used_font[b]->[/b]width, used_font[b]->[/b]height)) text_antialias(x+j*size, y+i*size, size, color, alpha, [maroon]1[/maroon]);
}
[b][blue]if[/blue][/b](text_readPix(data, j, i+1, used_font[b]->[/b]width, used_font[b]->[/b]height)) {
[b][blue]if[/blue][/b](text_readPix(data, j-1, i, used_font[b]->[/b]width, used_font[b]->[/b]height)) text_antialias(x+j*size, y+i*size, size, color, alpha, [maroon]2[/maroon]);
[b][blue]if[/blue][/b](text_readPix(data, j+1, i, used_font[b]->[/b]width, used_font[b]->[/b]height)) text_antialias(x+j*size, y+i*size, size, color, alpha, [maroon]3[/maroon]);
}
}
}
}
}
void text_print(int x, [purple]int[/purple] y, char* c, [purple]int[/purple] size, [purple]int[/purple] color)
{
[purple]int[/purple] save_x = x;
[b][blue]for[/blue][/b]( ; *c ; c++) {
[b][blue]if[/blue][/b](*c == [gray]'\n'[/gray]) {
x = save_x;
y += (used_font[b]->[/b]height + used_font[b]->[/b]height/2) * size;
} [b][blue]else[/blue][/b] {
text_printC(x, y, *c, size, color);
x += size * text_widthC(*c);
}
}
}
Citer : Posté le 06/10/2013 15:58 | #
C'est sur quoi je travaille .Ce sera la fxCG20LIb mais je peut changer le mon peut-être si il y a d'autres bonnes propositions.
Ajouté le 06/10/2013 à 16:04 :
Et voici pour l'instant à quoi cela ressemble pour l'instant je reprend les fonctions postées sur PC. Mais je rajouterai surement des fonctions plus personnelles.
/** fxCG20Lib - Color graphic library [b][blue]for[/blue][/b] fx-CG20 - fx-CG10 **/
/** fxCG20Libis a free software **/
/** **/
/** @author Lancelot **/
/** **/
/** @file fxCG20Lib.c **/
/** Code file of fxCG20Lib **/
/** **/
/** @date 10-06-2013 **/
/*************************************************************/
[brown]#include [gray]"fxCG20Lib.h"[/gray][/brown]
[brown]#include <display_syscalls.h>[/brown]
/******************************/
/** Dependencies management **/
/******************************/
[brown]#ifdef CGL_ALL[/brown]
[brown]#define _KEY[/brown]
[brown]#define POINT[/brown]
[brown]#define LINE[/brown]
[brown]#define RANDOM[/brown]
[brown]#define ABS[/brown]
[brown]#define CIRCLE[/brown]
[brown]#endif[/brown]
/***********************/
/**** Functions ****/
/***********************/
[brown]#ifdef _KEY[/brown]
[purple]int[/purple] key_down(int basic_keycode);
/***************/
/** Key codes **/
/***************/[/green][/b]
[brown]#define K_F1 79[/brown]
[brown]#define K_F2 69[/brown]
[brown]#define K_F3 59[/brown]
[brown]#define K_F4 49[/brown]
[brown]#define K_F5 39[/brown]
[brown]#define K_F6 29[/brown]
[brown]#define K_SHIFT 78[/brown]
[brown]#define K_OPTN 68[/brown]
[brown]#define K_VARS 58[/brown]
[brown]#define K_MENU 48[/brown]
[brown]#define K_LEFT 38[/brown]
[brown]#define K_UP 28[/brown]
[brown]#define K_ALPHA 77[/brown]
[brown]#define K_SQR 67[/brown]
[brown]#define K_EXPO 57[/brown]
[brown]#define K_EXIT 47[/brown]
[brown]#define K_DOWN 37[/brown]
[brown]#define K_RIGHT 27[/brown]
[brown]#define K_THETA 76[/brown]
[brown]#define K_LOG 66[/brown]
[brown]#define K_LN 56[/brown]
[brown]#define K_SIN 46[/brown]
[brown]#define K_COS 36[/brown]
[brown]#define K_TAN 26[/brown]
[brown]#define K_FRAC 75[/brown]
[brown]#define K_FD 65[/brown]
[brown]#define K_LPAR 55[/brown]
[brown]#define K_RPAR 45[/brown]
[brown]#define K_COMMA 35[/brown]
[brown]#define K_STORE 25[/brown]
[brown]#define K_7 74[/brown]
[brown]#define K_8 64[/brown]
[brown]#define K_9 54[/brown]
[brown]#define K_DEL 34[/brown]
[brown]#define K_4 73[/brown]
[brown]#define K_5 63[/brown]
[brown]#define K_6 53[/brown]
[brown]#define K_MULT 43[/brown]
[brown]#define K_DIV 33[/brown]
[brown]#define K_1 72[/brown]
[brown]#define K_2 62[/brown]
[brown]#define K_3 52[/brown]
[brown]#define K_PLUS 42[/brown]
[brown]#define K_MINUS 32[/brown]
[brown]#define K_0 71[/brown]
[brown]#define K_DOT 61[/brown]
[brown]#define K_EXP 51[/brown]
[brown]#define K_NEG 41[/brown]
[brown]#define K_EXE 31[/brown]
[brown]#define K_AC 10[/brown]
[purple]int[/purple] keydown(int basic_keycode)
{
const unsigned short* keyboard_register = (unsigned short*)0xA44B0000;
[purple]int[/purple] row, col, word, bit;
row = basic_keycode%10;
col = basic_keycode/10-1;
word = row>>1;
bit = col + 8*(row&1);
[b][blue]return[/blue][/b] (0 != (keyboard_register[word] & 1<<bit));
}
[brown]#endif [green]//_KEY[/brown][/green]
[brown]#ifdef LINE[/brown]
void line(int x1, [purple]int[/purple] y1, [purple]int[/purple] x2, [purple]int[/purple] y2, short color)
{
[purple]int[/purple] i, x, y, dx, dy, sx, sy, cumul;
x = x1;
y = y1;
dx = x2 - x1;
dy = y2 - y1;
sx = sgn(dx);
sy = sgn(dy);
dx = abs(dx);
dy = abs(dy);
Bdisp_SetPoint_VRAM( x, y,(int) color );
[b][blue]if[/blue][/b](dx > dy)
{
cumul = dx / 2;
[b][blue]for[/blue][/b](i=[maroon]1[/maroon] ; i<dx ; i++)
{
x += sx;
cumul += dy;
[b][blue]if[/blue][/b](cumul > dx)
{
cumul -= dx;
y += sy;
}
Bdisp_SetPoint_VRAM( x, y,(int) color );
}
}
[b][blue]else[/blue][/b]
{
cumul = dy / 2;
[b][blue]for[/blue][/b](i=[maroon]1[/maroon] ; i<dy ; i++)
{
y += sy;
cumul += dx;
[b][blue]if[/blue][/b](cumul > dy)
{
cumul -= dy;
x += sx;
}
Bdisp_SetPoint_VRAM(x, y,(int) color);
}
}
}
[brown]#endif [green]//LINE[/brown][/green]
[brown]#ifdef POINT[/brown]
void point(int x, [purple]int[/purple] y, [purple]int[/purple] color)
{
char* VRAM = (char*)0xA8000000;
VRAM += [maroon]2[/maroon]*(y*LCD_WIDTH_PX + x);
*(VRAM++) = (color&0x0000FF00)>>8;
*(VRAM++) = (color&0x000000FF);
[b][blue]return[/blue][/b];
}
[brown]#endif [green]//POINT[/brown][/green]
[brown]#ifdef RANDOM[/brown]
[purple]unsigned int[/purple] random(int seed, [purple]int[/purple] value) [green]// Function from Simon Lothar[/green]
{
static [purple]unsigned int[/purple] lastrandom = [maroon]0[/maroon]x12345678;
[b][blue]if[/blue][/b](seed) lastrandom = seed;
lastrandom = (0x41C64E6D * lastrandom) + 0x3039;
[b][blue]return[/blue][/b] ((lastrandom >> 16) % value);
}
[brown]#endif [green]// RANDOM[/brown][/green]
[brown]#ifdef ABS[/brown]
[purple]int[/purple] abs (int nombre)
{
[b][blue]if[/blue][/b](nombre < 0)return -nombre;
[b][blue]return[/blue][/b] nombre;
}
[brown]#endif [green]// ABS[/brown][/green]
[brown]#ifdef CIRCLE[/brown]
void drawCircle(int x0, [purple]int[/purple] y0, [purple]int[/purple] rayon, [purple]int[/purple] couleur)
{
[purple]int[/purple] er = [maroon]1[/maroon] - rayon;
[purple]int[/purple] erY = [maroon]1[/maroon];
[purple]int[/purple] erX = -2 * rayon;
[purple]int[/purple] x = rayon, y = [maroon]0[/maroon];
point(x0, y0 + rayon, couleur);
point(x0, y0 - rayon, couleur);
point(x0 + rayon, y0, couleur);
point(x0 - rayon, y0, couleur);
[b][blue]while[/blue][/b](y < x)
{
[b][blue]if[/blue][/b](er > 0)
{
x--;
erX += [maroon]2[/maroon];
er += erX;
}
y++;
erY += [maroon]2[/maroon];
er += erY;
point(x0 + x, y0 + y, couleur);
point(x0 - x, y0 + y, couleur);
point(x0 + x, y0 - y, couleur);
point(x0 - x, y0 - y, couleur);
point(x0 + y, y0 + x, couleur);
point(x0 - y, y0 + x, couleur);
point(x0 + y, y0 - x, couleur);
point(x0 - y, y0 - x, couleur);
}
}
[brown]#endif [green]// CIRCLE[/brown][/green]
/** fxCG20Lib - Color graphic library for fx-CG20 - fx-CG10 **/
/** fxCG20Libis a free software **/
/** **/
/** @author Lancelot **/
/** **/
/** @file fxCG20Lib.h **/
/** Include header for fxCG20Lib **/
/** **/
/** @date 10-06-2013 **/
/*************************************************************/
#ifndef fXCG20LIB
#define fXCG20LIB
/****************************************************/
/** uncomment #define of functions you want to use **/
/****************************************************/
// #define CGL_ALL //Auto define all functions
// #define _KEY
// #define LINE
// #define POINT
// #define RANDOM
// #define ABS
// #define CIRCLE
#endif // fXCG20LIB
M'hésiter pas à me signaler les erreurs commises et de possibles améliorations. Mais après il faudrai tester le fonctionnement.
De l'aide sera toujours la bien venue.
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 06/10/2013 16:34 | #
Une question, la fonction pour générer un nombre aléatoirement fonctionne-t-il pour les graphs monochromes? (graph 75 SH4 en particulier)
Citer : Posté le 06/10/2013 16:35 | #
par contre, la fonction point devrait s'appeler pixel (un point peut avoir une taille definie (comme un carré), tandis qu'un pixel fait ... un pixel)
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 06/10/2013 16:39 | #
@ Dodormeur : Corrigé
Voici la version avec toutes les fonctions de ce topic jusqu'à aujourd'hui.
/** fxCG20Lib - Color graphic library for fx-CG20 - fx-CG10 **/
/** fxCG20Libis a free software **/
/** **/
/** @author Lancelot **/
/** **/
/** @file fxCG20Lib.c **/
/** Code file of fxCG20Lib **/
/** **/
/** @date 10-06-2013 **/
/*************************************************************/[/green]
[brown]#include [gray]"fxCG20Lib.h"[/gray][/brown]
[brown]#include <display_syscalls.h>[/brown]
/******************************/
/** Dependencies management **/
/******************************/
[brown]#ifdef CGL_ALL[/brown]
[brown]#define KEY[/brown]
[brown]#define PIXEL[/brown]
[brown]#define LINE[/brown]
[brown]#define RANDOM[/brown]
[brown]#define ABS[/brown]
[brown]#define CIRCLE[/brown]
[brown]#define TEXT[/brown]
[brown]#define ALPHASPRITE[/brown]
[brown]#define SPRITE16[/brown]
[brown]#define SPRITE[/brown]
[brown]#define INT2STR[/brown]
[brown]#define FPS[/brown]
[brown]#endif[/brown]
/***********************/
/**** Functions ****/
/***********************/
[brown]#ifdef KEY[/brown]
[purple]int[/purple] key_down(int basic_keycode);
/***************/
/** Key codes **/
/***************/
[brown]#define K_F1 79[/brown]
[brown]#define K_F2 69[/brown]
[brown]#define K_F3 59[/brown]
[brown]#define K_F4 49[/brown]
[brown]#define K_F5 39[/brown]
[brown]#define K_F6 29[/brown]
[brown]#define K_SHIFT 78[/brown]
[brown]#define K_OPTN 68[/brown]
[brown]#define K_VARS 58[/brown]
[brown]#define K_MENU 48[/brown]
[brown]#define K_LEFT 38[/brown]
[brown]#define K_UP 28[/brown]
[brown]#define K_ALPHA 77[/brown]
[brown]#define K_SQR 67[/brown]
[brown]#define K_EXPO 57[/brown]
[brown]#define K_EXIT 47[/brown]
[brown]#define K_DOWN 37[/brown]
[brown]#define K_RIGHT 27[/brown]
[brown]#define K_THETA 76[/brown]
[brown]#define K_LOG 66[/brown]
[brown]#define K_LN 56[/brown]
[brown]#define K_SIN 46[/brown]
[brown]#define K_COS 36[/brown]
[brown]#define K_TAN 26[/brown]
[brown]#define K_FRAC 75[/brown]
[brown]#define K_FD 65[/brown]
[brown]#define K_LPAR 55[/brown]
[brown]#define K_RPAR 45[/brown]
[brown]#define K_COMMA 35[/brown]
[brown]#define K_STORE 25[/brown]
[brown]#define K_7 74[/brown]
[brown]#define K_8 64[/brown]
[brown]#define K_9 54[/brown]
[brown]#define K_DEL 34[/brown]
[brown]#define K_4 73[/brown]
[brown]#define K_5 63[/brown]
[brown]#define K_6 53[/brown]
[brown]#define K_MULT 43[/brown]
[brown]#define K_DIV 33[/brown]
[brown]#define K_1 72[/brown]
[brown]#define K_2 62[/brown]
[brown]#define K_3 52[/brown]
[brown]#define K_PLUS 42[/brown]
[brown]#define K_MINUS 32[/brown]
[brown]#define K_0 71[/brown]
[brown]#define K_DOT 61[/brown]
[brown]#define K_EXP 51[/brown]
[brown]#define K_NEG 41[/brown]
[brown]#define K_EXE 31[/brown]
[brown]#define K_AC 10[/brown]
[purple]int[/purple] keydown(int basic_keycode)
{
const unsigned short* keyboard_register = (unsigned short*)0xA44B0000;
[purple]int[/purple] row, col, word, bit;
row = basic_keycode%10;
col = basic_keycode/10-1;
word = row>>1;
bit = col + 8*(row&1);
[b][blue]return[/blue][/b] (0 != (keyboard_register[word] & 1<<bit));
}
[brown]#endif [green]//KEY[/brown][/green]
[brown]#ifdef LINE[/brown]
void line(int x1, [purple]int[/purple] y1, [purple]int[/purple] x2, [purple]int[/purple] y2, short color)
{
[purple]int[/purple] i, x, y, dx, dy, sx, sy, cumul;
x = x1;
y = y1;
dx = x2 - x1;
dy = y2 - y1;
sx = sgn(dx);
sy = sgn(dy);
dx = abs(dx);
dy = abs(dy);
Bdisp_SetPoint_VRAM( x, y,(int) color );
[b][blue]if[/blue][/b](dx > dy)
{
cumul = dx / 2;
[b][blue]for[/blue][/b](i=[maroon]1[/maroon] ; i<dx ; i++)
{
x += sx;
cumul += dy;
[b][blue]if[/blue][/b](cumul > dx)
{
cumul -= dx;
y += sy;
}
Bdisp_SetPoint_VRAM( x, y,(int) color );
}
}
[b][blue]else[/blue][/b]
{
cumul = dy / 2;
[b][blue]for[/blue][/b](i=[maroon]1[/maroon] ; i<dy ; i++)
{
y += sy;
cumul += dx;
[b][blue]if[/blue][/b](cumul > dy)
{
cumul -= dy;
x += sx;
}
Bdisp_SetPoint_VRAM(x, y,(int) color);
}
}
}
[brown]#endif [green]//LINE[/brown][/green]
[brown]#ifdef PIXEL[/brown]
void point(int x, [purple]int[/purple] y, [purple]int[/purple] color)
{
char* VRAM = (char*)0xA8000000;
VRAM += [maroon]2[/maroon]*(y*LCD_WIDTH_PX + x);
*(VRAM++) = (color&0x0000FF00)>>8;
*(VRAM++) = (color&0x000000FF);
[b][blue]return[/blue][/b];
}
[brown]#endif [green]//PIXEL[/brown][/green]
[brown]#ifdef RANDOM[/brown]
[purple]unsigned int[/purple] random(int seed, [purple]int[/purple] value) [green]// Function from Simon Lothar[/green]
{
static [purple]unsigned int[/purple] lastrandom = [maroon]0[/maroon]x12345678;
[b][blue]if[/blue][/b](seed) lastrandom = seed;
lastrandom = (0x41C64E6D * lastrandom) + 0x3039;
[b][blue]return[/blue][/b] ((lastrandom >> 16) % value);
}
[brown]#endif [green]// RANDOM[/brown][/green]
[brown]#ifdef ABS[/brown]
[purple]int[/purple] abs (int nombre)
{
[b][blue]if[/blue][/b](nombre < 0)return -nombre;
[b][blue]return[/blue][/b] nombre;
}
[brown]#endif [green]// ABS[/brown][/green]
[brown]#ifdef CIRCLE[/brown]
void drawCircle(int x0, [purple]int[/purple] y0, [purple]int[/purple] rayon, [purple]int[/purple] couleur)
{
[purple]int[/purple] er = [maroon]1[/maroon] - rayon;
[purple]int[/purple] erY = [maroon]1[/maroon];
[purple]int[/purple] erX = -2 * rayon;
[purple]int[/purple] x = rayon, y = [maroon]0[/maroon];
point(x0, y0 + rayon, couleur);
point(x0, y0 - rayon, couleur);
point(x0 + rayon, y0, couleur);
point(x0 - rayon, y0, couleur);
[b][blue]while[/blue][/b](y < x)
{
[b][blue]if[/blue][/b](er > 0)
{
x--;
erX += [maroon]2[/maroon];
er += erX;
}
y++;
erY += [maroon]2[/maroon];
er += erY;
point(x0 + x, y0 + y, couleur);
point(x0 - x, y0 + y, couleur);
point(x0 + x, y0 - y, couleur);
point(x0 - x, y0 - y, couleur);
point(x0 + y, y0 + x, couleur);
point(x0 - y, y0 + x, couleur);
point(x0 + y, y0 - x, couleur);
point(x0 - y, y0 - x, couleur);
}
}
[brown]#endif [green]// CIRCLE[/brown][/green]
[brown]#ifdef TEXT[/brown]
typedef [purple]struct[/purple] {
char* data;
[purple]int[/purple] width, height, flags;
} Font;
[green]// Flags :[/green]
[brown]#define MONOSPACE 0x00000001[/brown]
[brown]#define ANTIALIASING 0x00000002[/brown]
const static [purple]char[/purple] default_data[] = {
0,[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon], [green]// [gray]' '[/gray][/green]
128,[maroon]128[/maroon],[maroon]128[/maroon],[maroon]0[/maroon],[maroon]128[/maroon], [green]// [gray]'!'[/gray][/green]
160,[maroon]160[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon], [green]// [gray]'"'[/gray][/green]
80,[maroon]248[/maroon],[maroon]80[/maroon],[maroon]248[/maroon],[maroon]80[/maroon], [green]// [gray]'[brown]#'[/gray][/brown][/green]
64,[maroon]224[/maroon],[maroon]64[/maroon],[maroon]224[/maroon],[maroon]64[/maroon], [green]// [gray]'$'[/gray][/green]
200,[maroon]208[/maroon],[maroon]32[/maroon],[maroon]88[/maroon],[maroon]152[/maroon], [green]// [gray]'%'[/gray][/green]
0,[maroon]96[/maroon],[maroon]64[/maroon],[maroon]144[/maroon],[maroon]96[/maroon], [green]// [gray]'&'[/gray][/green]
128,[maroon]128[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon], [green]// [gray]'''[/gray][/green]
64,[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]64[/maroon], [green]// [gray]'('[/gray][/green]
128,[maroon]64[/maroon],[maroon]64[/maroon],[maroon]64[/maroon],[maroon]128[/maroon], [green]// [gray]')'[/gray][/green]
64,[maroon]224[/maroon],[maroon]64[/maroon],[maroon]160[/maroon],[maroon]0[/maroon], [green]// [gray]'*'[/gray][/green]
32,[maroon]32[/maroon],[maroon]248[/maroon],[maroon]32[/maroon],[maroon]32[/maroon], [green]// [gray]'+'[/gray][/green]
0,[maroon]0[/maroon],[maroon]0[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]','[/gray][/green]
0,[maroon]0[/maroon],[maroon]248[/maroon],[maroon]0[/maroon],[maroon]0[/maroon], [green]// [gray]'-'[/gray][/green]
0,[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]128[/maroon], [green]// [gray]'.'[/gray][/green]
8,[maroon]16[/maroon],[maroon]32[/maroon],[maroon]64[/maroon],[maroon]128[/maroon], [green]// [gray]'/'[/gray][/green]
248,[maroon]136[/maroon],[maroon]136[/maroon],[maroon]136[/maroon],[maroon]248[/maroon], [green]// [gray]'0'[/gray][/green]
192,[maroon]64[/maroon],[maroon]64[/maroon],[maroon]64[/maroon],[maroon]64[/maroon], [green]// [gray]'1'[/gray][/green]
240,[maroon]16[/maroon],[maroon]240[/maroon],[maroon]128[/maroon],[maroon]240[/maroon], [green]// [gray]'2'[/gray][/green]
240,[maroon]16[/maroon],[maroon]112[/maroon],[maroon]16[/maroon],[maroon]240[/maroon], [green]// [gray]'3'[/gray][/green]
128,[maroon]136[/maroon],[maroon]136[/maroon],[maroon]248[/maroon],[maroon]8[/maroon], [green]// [gray]'4'[/gray][/green]
248,[maroon]128[/maroon],[maroon]248[/maroon],[maroon]8[/maroon],[maroon]248[/maroon], [green]// [gray]'5'[/gray][/green]
248,[maroon]128[/maroon],[maroon]248[/maroon],[maroon]136[/maroon],[maroon]248[/maroon], [green]// [gray]'6'[/gray][/green]
248,[maroon]8[/maroon],[maroon]8[/maroon],[maroon]8[/maroon],[maroon]8[/maroon], [green]// [gray]'7'[/gray][/green]
248,[maroon]136[/maroon],[maroon]248[/maroon],[maroon]136[/maroon],[maroon]248[/maroon], [green]// [gray]'8'[/gray][/green]
248,[maroon]136[/maroon],[maroon]248[/maroon],[maroon]8[/maroon],[maroon]248[/maroon], [green]// [gray]'9'[/gray][/green]
0,[maroon]0[/maroon],[maroon]128[/maroon],[maroon]0[/maroon],[maroon]128[/maroon], [green]// [gray]':'[/gray][/green]
0,[maroon]128[/maroon],[maroon]0[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]';'[/gray][/green]
32,[maroon]64[/maroon],[maroon]128[/maroon],[maroon]64[/maroon],[maroon]32[/maroon], [green]// [gray]'<'[/gray][/green]
0,[maroon]248[/maroon],[maroon]0[/maroon],[maroon]248[/maroon],[maroon]0[/maroon], [green]// [gray]'='[/gray][/green]
128,[maroon]64[/maroon],[maroon]32[/maroon],[maroon]64[/maroon],[maroon]128[/maroon], [green]// [gray]'>'[/gray][/green]
224,[maroon]16[/maroon],[maroon]96[/maroon],[maroon]0[/maroon],[maroon]64[/maroon], [green]// [gray]'?'[/gray][/green]
248,[maroon]136[/maroon],[maroon]184[/maroon],[maroon]168[/maroon],[maroon]184[/maroon], [green]// [gray]'@'[/gray][/green]
248,[maroon]136[/maroon],[maroon]248[/maroon],[maroon]136[/maroon],[maroon]136[/maroon], [green]// [gray]'A'[/gray][/green]
240,[maroon]136[/maroon],[maroon]248[/maroon],[maroon]136[/maroon],[maroon]240[/maroon], [green]// [gray]'B'[/gray][/green]
248,[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]248[/maroon], [green]// [gray]'C'[/gray][/green]
240,[maroon]136[/maroon],[maroon]136[/maroon],[maroon]136[/maroon],[maroon]240[/maroon], [green]// [gray]'D'[/gray][/green]
248,[maroon]128[/maroon],[maroon]240[/maroon],[maroon]128[/maroon],[maroon]248[/maroon], [green]// [gray]'E'[/gray][/green]
248,[maroon]128[/maroon],[maroon]240[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]'F'[/gray][/green]
120,[maroon]128[/maroon],[maroon]184[/maroon],[maroon]136[/maroon],[maroon]120[/maroon], [green]// [gray]'G'[/gray][/green]
136,[maroon]136[/maroon],[maroon]248[/maroon],[maroon]136[/maroon],[maroon]136[/maroon], [green]// [gray]'H'[/gray][/green]
128,[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]'I'[/gray][/green]
16,[maroon]16[/maroon],[maroon]16[/maroon],[maroon]144[/maroon],[maroon]96[/maroon], [green]// [gray]'J'[/gray][/green]
136,[maroon]144[/maroon],[maroon]224[/maroon],[maroon]144[/maroon],[maroon]136[/maroon], [green]// [gray]'K'[/gray][/green]
128,[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]248[/maroon], [green]// [gray]'L'[/gray][/green]
136,[maroon]216[/maroon],[maroon]168[/maroon],[maroon]136[/maroon],[maroon]136[/maroon], [green]// [gray]'M'[/gray][/green]
248,[maroon]136[/maroon],[maroon]136[/maroon],[maroon]136[/maroon],[maroon]136[/maroon], [green]// [gray]'N'[/gray][/green]
248,[maroon]136[/maroon],[maroon]136[/maroon],[maroon]136[/maroon],[maroon]248[/maroon], [green]// [gray]'O'[/gray][/green]
248,[maroon]136[/maroon],[maroon]248[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]'P'[/gray][/green]
112,[maroon]136[/maroon],[maroon]136[/maroon],[maroon]152[/maroon],[maroon]120[/maroon], [green]// [gray]'Q'[/gray][/green]
248,[maroon]136[/maroon],[maroon]248[/maroon],[maroon]144[/maroon],[maroon]136[/maroon], [green]// [gray]'R'[/gray][/green]
248,[maroon]128[/maroon],[maroon]248[/maroon],[maroon]8[/maroon],[maroon]248[/maroon], [green]// [gray]'S'[/gray][/green]
248,[maroon]32[/maroon],[maroon]32[/maroon],[maroon]32[/maroon],[maroon]32[/maroon], [green]// [gray]'T'[/gray][/green]
136,[maroon]136[/maroon],[maroon]136[/maroon],[maroon]136[/maroon],[maroon]248[/maroon], [green]// [gray]'U'[/gray][/green]
136,[maroon]136[/maroon],[maroon]80[/maroon],[maroon]80[/maroon],[maroon]32[/maroon], [green]// [gray]'V'[/gray][/green]
168,[maroon]168[/maroon],[maroon]168[/maroon],[maroon]168[/maroon],[maroon]248[/maroon], [green]// [gray]'W'[/gray][/green]
136,[maroon]80[/maroon],[maroon]32[/maroon],[maroon]80[/maroon],[maroon]136[/maroon], [green]// [gray]'X'[/gray][/green]
136,[maroon]80[/maroon],[maroon]32[/maroon],[maroon]32[/maroon],[maroon]32[/maroon], [green]// [gray]'Y'[/gray][/green]
248,[maroon]8[/maroon],[maroon]112[/maroon],[maroon]128[/maroon],[maroon]248[/maroon], [green]// [gray]'Z'[/gray][/green]
192,[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]192[/maroon], [green]// [gray]'['[/gray][/green]
128,[maroon]64[/maroon],[maroon]32[/maroon],[maroon]16[/maroon],[maroon]8[/maroon], [green]// [gray]'\'[/gray][/green]
192,[maroon]64[/maroon],[maroon]64[/maroon],[maroon]64[/maroon],[maroon]192[/maroon], [green]// [gray]']'[/gray][/green]
64,[maroon]160[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon], [green]// [gray]'^'[/gray][/green]
0,[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]248[/maroon], [green]// [gray]'_'[/gray][/green]
128,[maroon]64[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon], [green]// [gray]'`'[/gray][/green]
0,[maroon]112[/maroon],[maroon]144[/maroon],[maroon]144[/maroon],[maroon]112[/maroon], [green]// [gray]'a'[/gray][/green]
128,[maroon]224[/maroon],[maroon]144[/maroon],[maroon]144[/maroon],[maroon]224[/maroon], [green]// [gray]'b'[/gray][/green]
0,[maroon]96[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]96[/maroon], [green]// [gray]'c'[/gray][/green]
16,[maroon]112[/maroon],[maroon]144[/maroon],[maroon]144[/maroon],[maroon]112[/maroon], [green]// [gray]'d'[/gray][/green]
96,[maroon]144[/maroon],[maroon]240[/maroon],[maroon]128[/maroon],[maroon]112[/maroon], [green]// [gray]'e'[/gray][/green]
48,[maroon]64[/maroon],[maroon]224[/maroon],[maroon]64[/maroon],[maroon]64[/maroon], [green]// [gray]'f'[/gray][/green]
112,[maroon]144[/maroon],[maroon]112[/maroon],[maroon]16[/maroon],[maroon]224[/maroon], [green]// [gray]'g'[/gray][/green]
128,[maroon]128[/maroon],[maroon]224[/maroon],[maroon]144[/maroon],[maroon]144[/maroon], [green]// [gray]'h'[/gray][/green]
128,[maroon]0[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]'i'[/gray][/green]
64,[maroon]0[/maroon],[maroon]64[/maroon],[maroon]64[/maroon],[maroon]128[/maroon], [green]// [gray]'j'[/gray][/green]
128,[maroon]128[/maroon],[maroon]160[/maroon],[maroon]192[/maroon],[maroon]160[/maroon], [green]// [gray]'k'[/gray][/green]
128,[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]'l'[/gray][/green]
0,[maroon]0[/maroon],[maroon]240[/maroon],[maroon]168[/maroon],[maroon]168[/maroon], [green]// [gray]'m'[/gray][/green]
0,[maroon]0[/maroon],[maroon]224[/maroon],[maroon]144[/maroon],[maroon]144[/maroon], [green]// [gray]'n'[/gray][/green]
0,[maroon]96[/maroon],[maroon]144[/maroon],[maroon]144[/maroon],[maroon]96[/maroon], [green]// [gray]'o'[/gray][/green]
0,[maroon]240[/maroon],[maroon]144[/maroon],[maroon]240[/maroon],[maroon]128[/maroon], [green]// [gray]'p'[/gray][/green]
0,[maroon]240[/maroon],[maroon]144[/maroon],[maroon]240[/maroon],[maroon]16[/maroon], [green]// [gray]'q'[/gray][/green]
0,[maroon]176[/maroon],[maroon]192[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]'r'[/gray][/green]
0,[maroon]112[/maroon],[maroon]64[/maroon],[maroon]32[/maroon],[maroon]224[/maroon], [green]// [gray]'s'[/gray][/green]
0,[maroon]128[/maroon],[maroon]224[/maroon],[maroon]128[/maroon],[maroon]96[/maroon], [green]// [gray]'t'[/gray][/green]
0,[maroon]0[/maroon],[maroon]144[/maroon],[maroon]144[/maroon],[maroon]96[/maroon], [green]// [gray]'u'[/gray][/green]
0,[maroon]0[/maroon],[maroon]136[/maroon],[maroon]80[/maroon],[maroon]32[/maroon], [green]// [gray]'v'[/gray][/green]
0,[maroon]0[/maroon],[maroon]168[/maroon],[maroon]168[/maroon],[maroon]80[/maroon], [green]// [gray]'w'[/gray][/green]
0,[maroon]0[/maroon],[maroon]144[/maroon],[maroon]96[/maroon],[maroon]144[/maroon], [green]// [gray]'x'[/gray][/green]
0,[maroon]160[/maroon],[maroon]224[/maroon],[maroon]32[/maroon],[maroon]192[/maroon], [green]// [gray]'y'[/gray][/green]
0,[maroon]240[/maroon],[maroon]32[/maroon],[maroon]64[/maroon],[maroon]240[/maroon], [green]// [gray]'z'[/gray][/green]
96,[maroon]64[/maroon],[maroon]192[/maroon],[maroon]64[/maroon],[maroon]96[/maroon], [green]// [gray]'{'[/gray][/green]
128,[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon],[maroon]128[/maroon], [green]// [gray]'|'[/gray][/green]
192,[maroon]64[/maroon],[maroon]96[/maroon],[maroon]64[/maroon],[maroon]192[/maroon], [green]// [gray]'}'[/gray][/green]
0,[maroon]0[/maroon],[maroon]80[/maroon],[maroon]160[/maroon],[maroon]0[/maroon] [green]// [gray]'~'[/gray][/green]
};
static Font default_font = {default_data, [maroon]5[/maroon], [maroon]5[/maroon], [maroon]0[/maroon]};
/*
color on 32bits : 16 bits [b][blue]for[/blue][/b] alpha transparency + 16 bits [b][blue]for[/blue][/b] color.
alpha=[maroon]0[/maroon] mean opaque, alpha=[maroon]32[/maroon] mean totaly transparent.
example : 0x0010FFFF mean [gray]"white, [maroon]50[/maroon]% opacity"[/gray]
*/[/green][/b]
[green]//Local variables[/green]
[brown]#define LCD_WIDTH_PX 384[/brown]
[brown]#define LCD_HEIGHT_PX 216[/brown]
[brown]#define VRAM 0xA8000000[/brown]
Font* used_font = &default_font;
[green]//private functions[/green]
static void text_drawPoint(int x, [purple]int[/purple] y, [purple]int[/purple] size, [purple]int[/purple] color, [purple]int[/purple] alpha)
{
[purple]int[/purple] i, j;
short* vram = VRAM;
[b][blue]if[/blue][/b](x+size>=LCD_WIDTH_PX || x<0 || y+size>=LCD_HEIGHT_PX || y<0) [b][blue]return[/blue][/b];
vram += y*LCD_WIDTH_PX + x;
[b][blue]if[/blue][/b](alpha == [maroon]32[/maroon]) {
[b][blue]for[/blue][/b](i=size ; i ; i--, vram+=LCD_WIDTH_PX-size) {
[b][blue]for[/blue][/b](j=size ; j ; j--) {
*(vram++) = color;
}
}
} [b][blue]else[/blue][/b] {
[b][blue]for[/blue][/b](i=size ; i ; i--, vram+=LCD_WIDTH_PX-size) {
[b][blue]for[/blue][/b](j=size ; j ; j--) {
*(vram++) = ((((color & 0xf81f) * alpha + (*vram & 0xf81f) * (32-alpha)) >> 5) & 0xf81f) |
((((color & 0x07e0) * alpha + (*vram & 0x07e0) * (32-alpha)) >> 5) & 0x07e0);
}
}
}
}
static [purple]int[/purple] text_readPix(char* data, [purple]int[/purple] x, [purple]int[/purple] y, [purple]int[/purple] w, [purple]int[/purple] h)
{
[purple]int[/purple] byte_width = ((w-1)>>3)+1;
[b][blue]if[/blue][/b](x<0 || x>=w || y<0 || y>=h) [b][blue]return[/blue][/b] 0;
[b][blue]return[/blue][/b] 0 != (data[y*byte_width+(x>>3)] & (128>>(x&7)));
}
static void text_antialias(int x, [purple]int[/purple] y, [purple]int[/purple] size, [purple]int[/purple] color, [purple]int[/purple] alpha, [purple]int[/purple] corner)
{
[purple]int[/purple] i, j, m=size>>1;
switch(corner) {
case 0: [green]//top left[/green]
[b][blue]for[/blue][/b](i=[maroon]0[/maroon] ; i<size-m ; i++) {
[b][blue]for[/blue][/b](j=[maroon]0[/maroon] ; j<size-i-m-1 ; j++)
text_drawPoint(x+j, y+i, [maroon]1[/maroon], color, alpha);
text_drawPoint(x+j, y+i, [maroon]1[/maroon], color, alpha>>1);
}
[b][blue]break[/blue][/b];
case 1: [green]//top right[/green]
[b][blue]for[/blue][/b](i=[maroon]0[/maroon] ; i<size-m ; i++) {
text_drawPoint(x+i+m, y+i, [maroon]1[/maroon], color, alpha>>1);
[b][blue]for[/blue][/b](j=i+m+1 ; j<size ; j++)
text_drawPoint(x+j, y+i, [maroon]1[/maroon], color, alpha);
}
[b][blue]break[/blue][/b];
case 2: [green]//bottom left[/green]
[b][blue]for[/blue][/b](i=m ; i<size ; i++) {
[b][blue]for[/blue][/b](j=[maroon]0[/maroon] ; j<i-m ; j++)
text_drawPoint(x+j, y+i, [maroon]1[/maroon], color, alpha);
text_drawPoint(x+j, y+i, [maroon]1[/maroon], color, alpha>>1);
}
[b][blue]break[/blue][/b];
case 3: [green]//bottom right[/green]
[b][blue]for[/blue][/b](i=m-1 ; i<size ; i++) {
text_drawPoint(x+size-i+m-1, y+i, [maroon]1[/maroon], color, alpha>>1);
[b][blue]for[/blue][/b](j=size-i+m ; j<size ; j++)
text_drawPoint(x+j, y+i, [maroon]1[/maroon], color, alpha);
}
[b][blue]break[/blue][/b];
}
}
[green]//public functions[/green]
void text_setFont(Font* font)
{
used_font = font;
}
Font* text_getActualFont()
{
[b][blue]return[/blue][/b] used_font;
}
void text_printC(int x, [purple]int[/purple] y, [purple]char[/purple] c, [purple]int[/purple] size, [purple]int[/purple] color)
{
[purple]int[/purple] i, j, byte_width, alpha;
char* data;
[b][blue]if[/blue][/b](c<32 || c>127 || size<1) [b][blue]return[/blue][/b];
byte_width = ((used_font[b]->[/b]width-1)>>3)+1;
data = used_font[b]->[/b]data + byte_width * used_font[b]->[/b]height * (c-32);
alpha = [maroon]32[/maroon] - ((color>>16) % 32);
color &= [maroon]0[/maroon]xFFFF;
[b][blue]for[/blue][/b](i=[maroon]0[/maroon] ; i<used_font[b]->[/b]height ; i++) {
[b][blue]for[/blue][/b](j=[maroon]0[/maroon] ; j<used_font[b]->[/b]width ; j++) {
[b][blue]if[/blue][/b](data[i*byte_width+(j>>3)] & (128>>(j&7)))
text_drawPoint(x+j*size, y+i*size, size, color, alpha);
[b][blue]else[/blue][/b] if(used_font[b]->[/b]flags & ANTIALIASING) { [green]// Antialiasing[/green]
[b][blue]if[/blue][/b](text_readPix(data, j, i-1, used_font[b]->[/b]width, used_font[b]->[/b]height)) {
[b][blue]if[/blue][/b](text_readPix(data, j-1, i, used_font[b]->[/b]width, used_font[b]->[/b]height)) text_antialias(x+j*size, y+i*size, size, color, alpha, [maroon]0[/maroon]);
[b][blue]if[/blue][/b](text_readPix(data, j+1, i, used_font[b]->[/b]width, used_font[b]->[/b]height)) text_antialias(x+j*size, y+i*size, size, color, alpha, [maroon]1[/maroon]);
}
[b][blue]if[/blue][/b](text_readPix(data, j, i+1, used_font[b]->[/b]width, used_font[b]->[/b]height)) {
[b][blue]if[/blue][/b](text_readPix(data, j-1, i, used_font[b]->[/b]width, used_font[b]->[/b]height)) text_antialias(x+j*size, y+i*size, size, color, alpha, [maroon]2[/maroon]);
[b][blue]if[/blue][/b](text_readPix(data, j+1, i, used_font[b]->[/b]width, used_font[b]->[/b]height)) text_antialias(x+j*size, y+i*size, size, color, alpha, [maroon]3[/maroon]);
}
}
}
}
}
void text_print(int x, [purple]int[/purple] y, char* c, [purple]int[/purple] size, [purple]int[/purple] color)
{
[purple]int[/purple] save_x = x;
[b][blue]for[/blue][/b]( ; *c ; c++) {
[b][blue]if[/blue][/b](*c == [gray]'\n'[/gray]) {
x = save_x;
y += (used_font[b]->[/b]height + used_font[b]->[/b]height/2) * size;
} [b][blue]else[/blue][/b] {
text_printC(x, y, *c, size, color);
x += size * text_widthC(*c);
}
}
}
[purple]int[/purple] text_widthC(char c)
{
[b][blue]if[/blue][/b](used_font[b]->[/b]flags & MONOSPACE || c==[gray]' '[/gray]) [b][blue]return[/blue][/b] used_font[b]->[/b]width+1;
[purple]unsigned char[/purple] *data, col=[maroon]0[/maroon];
[purple]int[/purple] i, j, byte_width, width;
byte_width = ((used_font[b]->[/b]width-1)>>3)+1;
width = [maroon]8[/maroon] * byte_width;
data = used_font[b]->[/b]data + byte_width * used_font[b]->[/b]height * (c-32);
[b][blue]for[/blue][/b](j=byte_width-1 ; j>=[maroon]0[/maroon] && !col ; j--) {
col = [maroon]0[/maroon];
[b][blue]for[/blue][/b](i=[maroon]0[/maroon] ; i<used_font[b]->[/b]height ; i++) {
col |= data[i*byte_width + j];
}
[b][blue]if[/blue][/b](col) {
[b][blue]while[/blue][/b](!(col&1)) {
col>>=[maroon]1[/maroon];
width--;
}
} [b][blue]else[/blue][/b] width -= [maroon]8[/maroon];
}
[b][blue]return[/blue][/b] width + 1;
}
[purple]int[/purple] text_width(char* c)
{
[purple]int[/purple] width = [maroon]0[/maroon];
[b][blue]for[/blue][/b]( ; *c ; c++) width += text_widthC(*c);
[b][blue]return[/blue][/b] width;
}
[brown]#endif [green]//TEXT[/brown][/green]
[brown]#ifdef ALPHASPRITE[/brown]
void alphaSprite(int x, [purple]int[/purple] y, [purple]int[/purple] width, [purple]int[/purple] height, short* bitmap, short alpha)
{
short* VRAM = (short*)0xA8000000;
[purple]int[/purple] x_inc = width;
[b][blue]if[/blue][/b] (y < 0)
{
bitmap -= y * width;
height += y;
y = [maroon]0[/maroon];
}
[b][blue]if[/blue][/b] (height > 216 - y) height = [maroon]216[/maroon] - y;
[b][blue]if[/blue][/b] (x < 0)
{
bitmap -= x;
width += x;
x = [maroon]0[/maroon];
}
[b][blue]if[/blue][/b] (width > 128*3 - x) width = [maroon]128[/maroon]*3 - x;
x_inc -= width;
[purple]int[/purple] y_index;
[purple]int[/purple] x_index;
short * base = y * 128*3 + x + VRAM;
[b][blue]for[/blue][/b] (y_index = height; y_index > 0; y_index--, base += [maroon]128[/maroon]*3 - width, bitmap += x_inc)
{
[b][blue]for[/blue][/b] (x_index = width; x_index > 0; x_index--, base++ , bitmap++ )
{
[b][blue]if[/blue][/b] (*bitmap!=alpha && *bitmap!= [maroon]0[/maroon]xffff) *base = *bitmap;
}
}
}
[brown]#endif [green]//ALPHASPRITE[/brown][/green]
[brown]#ifdef SPRITE16[/brown]
void CopySpriteMasked(short* bitmap, [purple]int[/purple] x, [purple]int[/purple] y, [purple]int[/purple] width, [purple]int[/purple] height, short mask)
{
short* VRAM = (short*)0xA8000000;
[purple]int[/purple] y_index;
[purple]int[/purple] x_index;
short * base = y * 128*3 + x + VRAM;
[b][blue]for[/blue][/b] (y_index = height; y_index > 0; --y_index, base += [maroon]128[/maroon]*3 - width) {
[b][blue]for[/blue][/b] (x_index = width; x_index > 0; --x_index, ++base, ++bitmap) {
[b][blue]if[/blue][/b] (*bitmap != mask) *base = *bitmap;
}
}
}
[brown]#endif [green]// SPRITE16[/brown][/green]
[brown]#ifdef SPRITE[/brown]
void CopySpriteNbitMasked(const unsigned char* data, [purple]int[/purple] x, [purple]int[/purple] y, [purple]int[/purple] width, [purple]int[/purple] height, const short* palette, short maskColor, [purple]unsigned int[/purple] bitwidth)
{
short* VRAM = (short*)0xA8000000; [green]//ou color_t* VRAM = (color_t*) GetVRAMAddress();[/green]
[purple]int[/purple] offset = [maroon]0[/maroon];
[purple]int[/purple] availbits ;
[purple]int[/purple] j,i;
[purple]unsigned char[/purple] buf;
short thiss;
short color;
VRAM += (128*3*y + x);
[b][blue]for[/blue][/b](j=y; j<y+height; j++)
{
availbits = [maroon]0[/maroon];
[b][blue]for[/blue][/b](i=x; i<x+width; i++)
{
[b][blue]if[/blue][/b] (!availbits)
{
buf = data[offset++];
availbits = [maroon]8[/maroon];
}
thiss = ((short)buf>>(8-bitwidth));
color = palette[thiss];
[b][blue]if[/blue][/b](color != maskColor && i >= [maroon]0[/maroon] && i<384)
{
*VRAM = color;
}
VRAM++;
buf<=bitwidth;
availbits-=bitwidth;
}
VRAM += (128*3-width);
}
}
[brown]#endif [green]// SPRITE[/brown][/green]
[brown]#ifdef INT2STR[/brown]
char* int2str(char* c, [purple]int[/purple] n)
{
[b][blue]if[/blue][/b](n==[maroon]0[/maroon])
{
c[0] = [gray]'0'[/gray];
c[1] = [maroon]0[/maroon];
}
[b][blue]else[/blue][/b]
{
[purple]int[/purple] i, l=[maroon]0[/maroon];
[b][blue]for[/blue][/b](i=n ; i ; i/=[maroon]10[/maroon])
l++;
c[l] = [maroon]0[/maroon];
[b][blue]for[/blue][/b](i=n ; i ; i/=[maroon]10[/maroon])
c[--l] = i%10+[gray]'0'[/gray];
}
[b][blue]return[/blue][/b] c;
}
[brown]#endif [green]// INT2STR[/brown][/green]
[brown]#ifdef FPS[/brown]
void setFps(int fpsWish) [green]//1 pour 128, [maroon]2[/maroon] pour 64, [maroon]3[/maroon] pour 42, [maroon]128[/maroon]/fpsWish en fait[/green]
{
static [purple]unsigned int[/purple] fps = [maroon]0[/maroon], fps_count = [maroon]0[/maroon];
[b][blue]do[/blue][/b]
{
fps = RTC_GetTicks();
}
[b][blue]while[/blue][/b](fps < fps_count+fpsWish);
fps_count = RTC_GetTicks();
}
[brown]#endif [green]// FPS[/brown][/green]
/** fxCG20Lib - Color graphic Library to fx-CG20 - fx-CG10 **/
/** fxCG20Libis a free software **/
/** **/
/** @author Lancelot **/
/** **/
/** @file fxCG20Lib.h **/
/** Include header for fxCG20Lib **/
/** **/
/** @date 10-06-2013 **/
/*************************************************************/[/green]
[brown]#ifndef fXCG20LIB[/brown]
[brown]#define fXCG20LIB[/brown]
/****************************************************/
/** uncomment [brown]#define of functions you want to use **/[/brown]
/****************************************************/[/green][/b]
[green]// [brown]#define CGL_ALL //Auto define all functions[/brown][/green]
[green]// [brown]#define KEY[/brown][/green]
[green]// [brown]#define LINE[/brown][/green]
[green]// [brown]#define PIXEL[/brown][/green]
[green]// [brown]#define RANDOM[/brown][/green]
[green]// [brown]#define ABS[/brown][/green]
[green]// [brown]#define CIRCLE[/brown][/green]
[green]// [brown]#define TEXT[/brown][/green]
[green]// [brown]#define ALPHASPRITE[/brown][/green]
[green]// [brown]#define SPRITE16[/brown][/green]
[green]// [brown]#define SPRITE[/brown][/green]
[green]// [brown]#define INT2STR[/brown][/green]
[green]// [brown]#define FPS[/brown][/green]
[brown]#endif [green]// fXCG20LIB[/brown][/green]
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 06/10/2013 17:33 | #
Et toutes les prizms ont des SH4, donc pas de soucis de modeles... En revanche pour garantir une meilleure portatibilitée avec les éventuelles mais peu probables futures versions, il serait plus judicieux d'utiliser GetVramAddress que d'initialiser l'adresse à la main non ?
Il faudrait aussi (simple supposition) voir a uniformiser les noms des fonctions : tout ce qui peut être graphique commencerait par "draw" ou autre, surtout pour les différentes fonctions de spriting car ils si t assez varies pour l'instant...
Et peut être inclure le nom des auteurs des grosses fonctions, je pense notamment a pierrotLL ou autres...
Citer : Posté le 06/10/2013 21:45 | #
La fonction GetVRAMAdress (trouvé dans les sources de gravityDuck de pierrotll)
{
asm("mov.l syscall_adress, r2\n"
"mov.l getVRAM, r0\n"
"jmp @r2\n"
"nop\n"
"syscall_adress: .long 0x80020070\n"
"getVRAM: .long 0x01E6");
}
Ajouté le 06/10/2013 à 21:46 :
Oui Nemhardy, il vaut mieux utiliser GetVramAdress
Ajouté le 06/10/2013 à 21:56 :
Afficher des sprites avec de la transparence
void CopySpriteNbitMaskedAlpha(const unsigned char* data, int x, int y, int width, int height, const color_t* palette, color_t maskColor, unsigned int bitwidth,int alpha)
{
color_t* VRAM = (color_t*) GetVRAMAdress();
VRAM += (LCD_WIDTH_PX*y + x);
alpha %= 32;
int i,j;
int offset = 0;
unsigned char buf=0;
for(j=y; j<y+height; j++)
{
int availbits = 0;
for(i=x; i<x+width; i++)
{
if (!availbits)
{
buf = data[offset++];
availbits = 8;
}
color_t thiss = ((color_t)buf>>(8-bitwidth));
color_t color = palette[thiss];
if(color != maskColor&& i >=0 && i<384)
*VRAM = ((((color & 0xF81F) * alpha + (*VRAM & 0xF81F) * (32-alpha)) >> 5) & 0xF81F) |
((((color & 0x07E0) * alpha + (*VRAM & 0x07E0) * (32-alpha)) >> 5) & 0x07E0);
VRAM++;
buf<<=bitwidth;
availbits-=bitwidth;
}
VRAM += (LCD_WIDTH_PX-width);
}
}
pour la fonction abs() il y a plus court :
unsigned int abs(int i){
return (i<0?-i:i);
}
Citer : Posté le 07/10/2013 09:10 | #
Pour la fonction absolue, le nombre doit obligatoirement être un int ?
Vitesse des fonctions en Basic Casio | 7 days CPC | Casio Universal Wiki | Tutoriel Basic Casio
>>> Give me a click Brother <<< >>> Teste mon générateur de mots nouveaux <<<
>>> Random Youtube Video <<<
Citer : Posté le 07/10/2013 18:48 | #
@Totoyo: je ne sais pas
@Smashmaster: A quoi correspond la fonction GetVramAdress ? où nous en servons nous ?
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 07/10/2013 18:53 | #
ben... dans toutes les fonctions de dessin (c'est pour avoir l'adresse de la vram, le buffer de dessin)
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 07/10/2013 19:03 | #
En gros au lieux d'avoir
Tu auras
Par exemple
PS : la fonction existe aussi avec deux "d" (GetVRAMAddress())et est définie dans display.h ou truc du style il me semble : l'une d'elle est t-elle meilleure que l'autre ?
Citer : Posté le 07/10/2013 20:16 | #
@Totoyo: pas obligatoirement, le nombre peut aussi être un long ou un double (mais pas un char, pour moi la valeur absolue d'un char n'a aucun sens)
Citer : Posté le 07/10/2013 20:52 | #
Petite fonction perso que j'avais faite à mes débuts...
Je l'ai juste adaptée rapido à ce qui existe déjà au niveau de la lib, mais teste quand même au cas où, j'ai adapté ça en live sur n++ mais j'ai ni la calto ni l'émulateur sous la main donc... (surtout pour la version avec canal alpha)
{
[purple]int[/purple] x1=[maroon]0[/maroon], y1=y-rayon;
[b][blue]while[/blue][/b] (y1<(y+rayon))
{
x1=x-rayon;
y1++;
[b][blue]while[/blue][/b] (x1<(x+rayon))
{
[b][blue]if[/blue][/b](pow(x1-x, [maroon]2[/maroon]) + pow(y1-y, [maroon]2[/maroon]) < pow(rayon, [maroon]2[/maroon]))
{
CL_point(x1, y1, couleur);
}
x1++;
}
}
}
avec CL_point la fonction qui existe dans la 0.91
{
[purple]int[/purple] x1=[maroon]0[/maroon], y1=y-rayon;
[b][blue]while[/blue][/b] (y1<(y+rayon))
{
x1=x-rayon;
y1++;
[b][blue]while[/blue][/b] (x1<(x+rayon))
{
[b][blue]if[/blue][/b](pow(x1-x, [maroon]2[/maroon]) + pow(y1-y, [maroon]2[/maroon]) < pow(rayon, [maroon]2[/maroon]))
{
drawPointAlpha(x1, y1, [maroon]1[/maroon], couleur, alpha);
}
x1++;
}
}
}
Avec drawPointAlpha() la fonction de pixel avec un canal alpha, il me semble qu'elle n'est pas encore dans la lib, donc à toi de voir quel nom tu lui donnes, ou... enfin, tu vois
Si jamais :
{
[purple]int[/purple] i, j;
short* vram = (short*)GetVRAMAdress;
[b][blue]if[/blue][/b](x+size>=LCD_WIDTH_PX || x<0 || y+size>=LCD_HEIGHT_PX || y<0) [b][blue]return[/blue][/b];
vram += y*LCD_WIDTH_PX + x;
[b][blue]if[/blue][/b](alpha == [maroon]32[/maroon]) {
[b][blue]for[/blue][/b](i=size ; i ; i--, vram+=LCD_WIDTH_PX-size) {
[b][blue]for[/blue][/b](j=size ; j ; j--) {
*(vram++) = color;
}
}
} [b][blue]else[/blue][/b] {
[b][blue]for[/blue][/b](i=size ; i ; i--, vram+=LCD_WIDTH_PX-size) {
[b][blue]for[/blue][/b](j=size ; j ; j--) {
*(vram++) = ((((color & 0xf81f) * alpha + (*vram & 0xf81f) * (32-alpha)) >> 5) & 0xf81f) |
((((color & 0x07e0) * alpha + (*vram & 0x07e0) * (32-alpha)) >> 5) & 0x07e0);
}
}
}
}
Quand je vous disais que c'était pas, mais alors pas optimisé , mais ça peut toujours combler en attendant qu'on regarde mieux ça !
Citer : Posté le 07/10/2013 21:28 | #
@Nemhardy: je pense que l'algorithme d'Andres est plus optimisé pour tracer des cercles
Citer : Posté le 07/10/2013 21:58 | #
J'imagine
C'est à dire que tu traces touts les cercles concentriques pour obtenir un disque à la sortie si j'ai bien compris ?
De toute façon ces fonctions n'étaient pas destinées à rester bien longtemps, le temps que mieux soit fait !
Si vous voulez je regarderai à faire ça avec l'algo d'Andres
Citer : Posté le 07/10/2013 22:10 | #
Oui c'est ça.
{
On trace un cercle de rayon i avec l'algorithme d'Andres
}
Citer : Posté le 07/10/2013 22:45 | #
sur monochromeLib, c'est ca
{
int plot_x, plot_y, d;
if(radius < 0) return;
plot_x = 0;
plot_y = radius;
d = 1 - radius;
ML_horizontal_line(y, x-plot_y, x+plot_y, color);
while(plot_y > plot_x)
{
if(d < 0)
d += 2*plot_x+3;
else {
d += 2*(plot_x-plot_y)+5;
plot_y--;
ML_horizontal_line(y+plot_y+1, x-plot_x, x+plot_x, color);
ML_horizontal_line(y-plot_y-1, x-plot_x, x+plot_x, color);
}
plot_x++;
if(plot_y >= plot_x)
{
ML_horizontal_line(y+plot_x, x-plot_y, x+plot_y, color);
ML_horizontal_line(y-plot_x, x-plot_y, x+plot_y, color);
}
}
}
et je pense qu'il s'agit de la meilleure optimisation (en tout cas, c'est celle utilisée par pierrotLL, donc ca doit etre de qualité )
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 07/10/2013 23:23 | #
c'est celle utilisée par pierrotLL, donc ca doit etre de qualité
Le raisonnement se tient
Après il faudra fait des tests car la fonction de tracé de ligne que l'on a est peut être pas aussi efficace de celle de ML (il passe par de l'assembleur pour sa fonction de Ligne il me semble non? J ai pas les sources sous la main pour vérifier )
Peut être que sur ML/Graphe 75 et les autres, il sera plus efficace de faire telle chose, et que sur Priam il vaudra mieux faire autre chose... Enfin , c'est juste une petite piste de réflexion absolument pas fondée. Lets test and see !
Citer : Posté le 08/10/2013 06:59 | #
PLL utilise Breshenham, donc y'a pas plus optimisé
Après, c'est sur que rien que la fonction de pixel et de ligne en ASM accèlèrent énormément un programme
Citer : Posté le 08/10/2013 17:03 | #
mais non, monochrome lib n'utilise pas d'asm
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 08/10/2013 18:52 | #
Merci à tous de votre soutient.
Je ne trouve pas les fonctions suivantes quelqu'un pourrait me donner les sources?
-Bdisp_SetPoint_VRAM
-RTC_GetTicks
Et dans ce code, Est-ce vraiment important d'avoir 128*3 (Je peux le remplacer par 384 ?)
void CL_alphaSprite(int x, [purple]int[/purple] y, [purple]int[/purple] width, [purple]int[/purple] height, short* bitmap, short alpha)
{
short* VRAM = (short*)0xA8000000;
[purple]int[/purple] x_inc = width;
[b][blue]if[/blue][/b] (y < 0)
{
bitmap -= y * width;
height += y;
y = [maroon]0[/maroon];
}
[b][blue]if[/blue][/b] (height > 216 - y) height = [maroon]216[/maroon] - y;
[b][blue]if[/blue][/b] (x < 0)
{
bitmap -= x;
width += x;
x = [maroon]0[/maroon];
}
[b][blue]if[/blue][/b] (width > 128*3 - x) width = [maroon]128[/maroon]*3 - x;
x_inc -= width;
[purple]int[/purple] y_index;
[purple]int[/purple] x_index;
short * base = y * 128*3 + x + VRAM;
[b][blue]for[/blue][/b] (y_index = height; y_index > 0; y_index--, base += [maroon]128[/maroon]*3 - width, bitmap += x_inc)
{
[b][blue]for[/blue][/b] (x_index = width; x_index > 0; x_index--, base++ , bitmap++ )
{
[b][blue]if[/blue][/b] (*bitmap!=alpha && *bitmap!= [maroon]0[/maroon]xffff) *base = *bitmap;
}
}
}
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 08/10/2013 19:05 | #
ben... c'est les fonctions de base du prizmsdk
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !