view gFont.c @ 88:ce9ef7dcf2f0

convert UTF-8
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 21 Apr 2011 17:50:23 +0900
parents 3780d1b2943e
children 8edae89a3877
line wrap: on
line source

/*
 * $Id$
 * 
 * フォント表示。といっても結局スプライトです。
 * gSprite.c と一緒にしてもよかったんだけど
 * 文字は文字でいろいろあるので分けてみる
 */
#include <stdio.h>
#include <stdlib.h>
#include "libps2.h"
#include "ps2util.h"
#include "gSprite.h"

#define DEFOBJ 120
#define SPRITE_COL 0x4f
#define SCREEN_HALF_W 320
#define SCREEN_HALF_H 240
#define CHAR_W_SIZE 17
#define CHAR_H_SIZE 34

static SpriteTable   sptable[DEFOBJ];
static ps2utilSprite sp[DEFOBJ*2]; // 表示スプライト用スタック
static unsigned int  sp_counter;
static Bool          flag_spriteInited = FALSE; // スプライトロードフラグ

static TEXTURE *font_tex;

static void
gFont_Init_Png(char *texname)
{
    if (!(font_tex = read_png_file(texname))) {
	fprintf(stderr,
		"cannot creat texture - gFont_Init_Png().\n");
	fflush(stderr);
	exit(EXIT_FAILURE);
    }

    if (ps2util_tex_Set(font_tex) == -1) {
	fprintf(stderr,
		"cannot set texture - gFont_Init_Png().\n");
	fflush(stderr);
	exit(EXIT_FAILURE);
    }
}

static void
gFont_Create()
{
    int i;

    for (i=0; i<DEFOBJ; i++) {
	if (ps2util_sprite_Create(&sp[i], font_tex) == -1) {
	    fprintf(stderr,
		    "cannot create sprite - gFont_Create()\n");
	    fflush(stderr);
	    exit(EXIT_FAILURE);
	}
	ps2util_sprite_Unuse_alpha(&sp[i]);
    }
    flag_spriteInited = TRUE;
}

static void
gFont_DefSprite(int number, int x, int y, int w, int h)
{
    sptable[number].tx = x;
    sptable[number].ty = y;
    sptable[number].tw = w;
    sptable[number].th = h;
}

void
gFont_Init()
{
    int i, j;
    int number = 0;

    gFont_Init_Png("img/font.png");
    gFont_Create(); // スプライト生成

    for (i=0; i<7; i++) {
	for (j=0; j<15; j++) {
	    gFont_DefSprite(number, j*17, i*34, 17, 34);
	    number++;
	}
    }
}


static void
gFont_PutSprite(int number, int x, int y)
{
    ps2utilSprite *p = &sp[sp_counter];

    ps2util_sprite_Set_basicAttribute(
	p,
	(ushort)x, (ushort)y,
	(ushort)sptable[number].tw*1.5, (ushort)sptable[number].th*1.5,
	(ushort)sptable[number].tx, (ushort)sptable[number].ty,
	(ushort)sptable[number].tw, (ushort)sptable[number].th,
	SPRITE_PRIO_FOREGROUND);

    ps2util_sprite_Request(p);
    sp_counter++;
}


static void
gFont_Clear()
{
    int i;

    for (i=0; i<DEFOBJ; i++) {
	sprite_disappear(&sp[i].attribute);
    }
    sp_counter = 0;
}

void
gFont_Draw_Reset()
{
    if (flag_spriteInited == TRUE) {
	gFont_Clear();
    }
}

static int
get_number_char(char a)
{
    return (int)a-32;
}

/*
 * str をスプライド表示
 */
void
gFont_SetString(char *str, int x, int y)
{
    int number;

    while (*str != '\0') {
	number = get_number_char(*str);
	gFont_PutSprite(number, x, y);
	str++;
	x += (int)CHAR_W_SIZE*1.5;
    }
}

/*
 * numを文字列に変換してSetStringに渡す
 */
void
gFont_SetStringInt(int num, int x, int y)
{
    char bufp[256];

    snprintf(bufp, 256, "%d", num);
    gFont_SetString(bufp, x, y);
}

void
gFont_SetFont_OP()
{
}