/*FILE HEADER**************************************************************
 *
 *  File name		: $Id$
 *  RCS Revision Number	: $Revision: 1.1 $
 *  Last Modified	: $Date: 94/10/28 09:23:32 $
 *  CSCI name		: Real-Time Graphics System - Applications Interface
 *  CSC name		: All functions
 *  Notes:
 *      This file contains code used to debug and test the SVME-770 RTGS.
 *      This code is provided as an example of how to call the RTGS functions
 *      from a host application.
 *  History		:
 *      Created 94/01/17 by Jeff Sanderson
 *
 *END FILE HEADER*********************************************************/

#include "dy4std.h"
#include "es.h"
#include "css.h"

#include "rtgs_ai.h"
#include "video.h"
#include "colours.h"

#include "test.h"

/*-----------------------------------------------------------------------*/

#include "fontbits.h"

/*-----------------------------------------------------------------------*/

void test_loadfont( void );

void setup_char( int16 *bitmap, uint32 *gcc_bitmap, chardef_t *chrdef, 
                 int size, char chr );

void load_32_x_40_font( void );
#define CHR_SZ ( 32 * 40 / 8 )

/*-----------------------------------------------------------------------*/

font_t    *gcc_font;
chardef_t *gcc_chardef;
uint32 *gcc_bits_space , *gcc_bits_exclamation , *gcc_bits_double_quote;
uint32 *gcc_bits_pound , *gcc_bits_dollar , *gcc_bits_percent ;
uint32 *gcc_bits_ampersand , *gcc_bits_single_quote , *gcc_bits_open_round ;
uint32 *gcc_bits_close_round , *gcc_bits_asterisk , *gcc_bits_plus;
uint32 *gcc_bits_comma , *gcc_bits_dash , *gcc_bits_period , *gcc_bits_slash;
uint32 *gcc_bits_0 , *gcc_bits_1 , *gcc_bits_2 , *gcc_bits_3;
uint32 *gcc_bits_4 , *gcc_bits_5 , *gcc_bits_6 , *gcc_bits_7;
uint32 *gcc_bits_8 , *gcc_bits_9 , *gcc_bits_colon , *gcc_bits_semi_colon;
uint32 *gcc_bits_less_than , *gcc_bits_equal , *gcc_bits_greater_than;
uint32 *gcc_bits_question , *gcc_bits_at_sign , *gcc_bits_A , *gcc_bits_B;
uint32 *gcc_bits_C , *gcc_bits_D , *gcc_bits_E , *gcc_bits_F , *gcc_bits_G;
uint32 *gcc_bits_H , *gcc_bits_I , *gcc_bits_J , *gcc_bits_K;
uint32 *gcc_bits_L , *gcc_bits_M , *gcc_bits_N , *gcc_bits_O;
uint32 *gcc_bits_P , *gcc_bits_Q , *gcc_bits_R , *gcc_bits_S;
uint32 *gcc_bits_T , *gcc_bits_U , *gcc_bits_V , *gcc_bits_W;
uint32 *gcc_bits_X , *gcc_bits_Y , *gcc_bits_Z , *gcc_bits_open_square;
uint32 *gcc_bits_back_slash , *gcc_bits_close_square , *gcc_bits_hat;
uint32 *gcc_bits_underscore , *gcc_bits_back_quote , *gcc_bits_a;
uint32 *gcc_bits_b , *gcc_bits_c , *gcc_bits_d , *gcc_bits_e , *gcc_bits_f;
uint32 *gcc_bits_g , *gcc_bits_h , *gcc_bits_i , *gcc_bits_j , *gcc_bits_k;
uint32 *gcc_bits_l , *gcc_bits_m , *gcc_bits_n , *gcc_bits_o;
uint32 *gcc_bits_p , *gcc_bits_q , *gcc_bits_r , *gcc_bits_s;
uint32 *gcc_bits_t , *gcc_bits_u , *gcc_bits_v , *gcc_bits_w;
uint32 *gcc_bits_x , *gcc_bits_y , *gcc_bits_z , *gcc_bits_open_curly;
uint32 *gcc_bits_vertical_bar , *gcc_bits_close_curly , *gcc_bits_tilde;

/*-----------------------------------------------------------------------*/

void test_loadfont( void )
{
    int      i, len;
    int      x, y, y1, y2, y3, y4;
    char     *str1;
    char     *str2;
    char     *str3;
    char     *str4;
    char     *s1 = " !#$%&'()*+,-./:;<=>?@[\]^_`{|}~";
    char     *s2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char     *s3 = "abcdefghijklmnopqrstuvwxyz";
    char     *s4 = "0123456789";
    point_t  *str_sz;

    init( "Load font test" );

    load_32_x_40_font();

    Set_text_font( -1 );

    len = strlen( s1 ) + 4;
    str1 = (char *)Gcc_malloc( len, 0);
    malloc_check( str1 );
    Copy_string_to_gcc( s1, str1, len );

    len = strlen( s2 ) + 4;
    str2 = (char *)Gcc_malloc( len, 0);
    malloc_check( str2 );
    Copy_string_to_gcc( s2, str2, len );

    len = strlen( s3 ) + 4;
    str3 = (char *)Gcc_malloc( len, 0);
    malloc_check( str3 );
    Copy_string_to_gcc( s3, str3, len );

    len = strlen( s4 ) + 4;
    str4 = (char *)Gcc_malloc( len, 0);
    malloc_check( str4 );
    Copy_string_to_gcc( s4, str4, len );

    str_sz = (point_t *)Gcc_malloc( sizeof( point_t ), 0);
    malloc_check( str_sz );

    x = 0x20;
    for( i = 0 ; i < 16 ; i++ )
    {
        Clear_screen( GRAY_2, 0, 0 );
        Set_text_spacing( i );
        
        Inquire_text_extent( str1, str_sz );
        Gcc_sync();
        y1 = str_sz->y;

        Inquire_text_extent( str2, str_sz );
        Gcc_sync();
        y2 = str_sz->y;

        Inquire_text_extent( str3, str_sz );
        Gcc_sync();
        y3 = str_sz->y;

        Inquire_text_extent( str4, str_sz );
        Gcc_sync();
        y4 = str_sz->y;

        y = 10;

	Set_transparency_mode( OPAQUE );
        Set_foreground_colour( WHITE );
        Set_background_colour( BLACK );
        Draw_text( x, y, str1 );
        y += y1 + 8;
        Draw_text( x, y, str2 );
        y += y2 + 8;
        Draw_text( x, y, str3 );
        y += y3 + 8;
        Draw_text( x, y, str4 );
        y += y4 + 8;

	Set_transparency_mode( TRANSPARENT );
        Set_foreground_colour( CYAN );
        Set_background_colour( BLACK );
        Draw_text( x, y, str1 );
        y += y1 + 8;
        Draw_text( x, y, str2 );
        y += y2 + 8;
        Draw_text( x, y, str3 );
        y += y3 + 8;
        Draw_text( x, y, str4 );
        y += y4 + 8;

	Key_wait();
    }
}

/*-----------------------------------------------------------------------*/

void setup_char( int16 *bitmap, uint32 *gcc_bitmap, chardef_t *chrdef, 
                 int size, char chr )
{
    gcc_bitmap = (uint32 *)Gcc_malloc( size + 4, 0 );
    malloc_check( gcc_bitmap );
    Copy_bitmap_to_gcc((char *)bitmap, (char *)gcc_bitmap, size );
    chrdef[ chr ].c = chr;
    chrdef[ chr ].bits = (uint32 *)GSP_ADDR( gcc_bitmap );
}

/*-----------------------------------------------------------------------*/

void load_32_x_40_font( void )
{

    gcc_chardef = (chardef_t *)Gcc_malloc( 0x100 * sizeof( chardef_t ), 0 );
    malloc_check( gcc_chardef );

    setup_char(bits_space,gcc_bits_space,gcc_chardef,CHR_SZ,' ');
    setup_char(bits_exclamation,gcc_bits_exclamation,gcc_chardef,CHR_SZ,'!');
    setup_char(bits_double_quote,gcc_bits_double_quote,gcc_chardef,CHR_SZ,'"');
    setup_char(bits_pound, gcc_bits_pound, gcc_chardef, CHR_SZ, '#' );
    setup_char(bits_dollar, gcc_bits_dollar, gcc_chardef, CHR_SZ, '$' );
    setup_char(bits_percent, gcc_bits_percent, gcc_chardef, CHR_SZ, '%' );
    setup_char(bits_ampersand, gcc_bits_ampersand, gcc_chardef, CHR_SZ, '&' );
    setup_char(bits_single_quote,gcc_bits_single_quote,gcc_chardef,CHR_SZ,'\'');
    setup_char(bits_open_round,gcc_bits_open_round,gcc_chardef,CHR_SZ,'(');
    setup_char(bits_close_round,gcc_bits_close_round,gcc_chardef,CHR_SZ,')');
    setup_char(bits_asterisk,gcc_bits_asterisk,gcc_chardef,CHR_SZ,'*');
    setup_char(bits_plus,gcc_bits_plus,gcc_chardef,CHR_SZ,'+');
    setup_char(bits_comma,gcc_bits_comma,gcc_chardef,CHR_SZ,',');
    setup_char(bits_dash,gcc_bits_dash,gcc_chardef,CHR_SZ,'-');
    setup_char(bits_period,gcc_bits_period,gcc_chardef,CHR_SZ,'.');
    setup_char(bits_slash,gcc_bits_slash,gcc_chardef,CHR_SZ,'/');
    setup_char(bits_0,gcc_bits_0,gcc_chardef,CHR_SZ,'0');
    setup_char(bits_1,gcc_bits_1,gcc_chardef,CHR_SZ,'1');
    setup_char(bits_2,gcc_bits_2,gcc_chardef,CHR_SZ,'2');
    setup_char(bits_3,gcc_bits_3,gcc_chardef,CHR_SZ,'3');
    setup_char(bits_4,gcc_bits_4,gcc_chardef,CHR_SZ,'4');
    setup_char(bits_5,gcc_bits_5,gcc_chardef,CHR_SZ,'5');
    setup_char(bits_6,gcc_bits_6,gcc_chardef,CHR_SZ,'6');
    setup_char(bits_7,gcc_bits_7,gcc_chardef,CHR_SZ,'7');
    setup_char(bits_8,gcc_bits_8,gcc_chardef,CHR_SZ,'8');
    setup_char(bits_9,gcc_bits_9,gcc_chardef,CHR_SZ,'9');
    setup_char(bits_colon,gcc_bits_colon,gcc_chardef,CHR_SZ,':');
    setup_char(bits_semi_colon,gcc_bits_semi_colon,gcc_chardef,CHR_SZ,';');
    setup_char(bits_less_than,gcc_bits_less_than,gcc_chardef,CHR_SZ,'<');
    setup_char(bits_equal,gcc_bits_equal,gcc_chardef,CHR_SZ,'=');
    setup_char(bits_greater_than,gcc_bits_greater_than,gcc_chardef,CHR_SZ,'>');
    setup_char(bits_question,gcc_bits_question,gcc_chardef,CHR_SZ,'?');
    setup_char(bits_at_sign,gcc_bits_at_sign,gcc_chardef,CHR_SZ,'@');
    setup_char(bits_A,gcc_bits_A,gcc_chardef,CHR_SZ,'A');
    setup_char(bits_B,gcc_bits_B,gcc_chardef,CHR_SZ,'B');
    setup_char(bits_C,gcc_bits_C,gcc_chardef,CHR_SZ,'C');
    setup_char(bits_D,gcc_bits_D,gcc_chardef,CHR_SZ,'D');
    setup_char(bits_E,gcc_bits_E,gcc_chardef,CHR_SZ,'E');
    setup_char(bits_F,gcc_bits_F,gcc_chardef,CHR_SZ,'F');
    setup_char(bits_G,gcc_bits_G,gcc_chardef,CHR_SZ,'G');
    setup_char(bits_H,gcc_bits_H,gcc_chardef,CHR_SZ,'H');
    setup_char(bits_I,gcc_bits_I,gcc_chardef,CHR_SZ,'I');
    setup_char(bits_J,gcc_bits_J,gcc_chardef,CHR_SZ,'J');
    setup_char(bits_K,gcc_bits_K,gcc_chardef,CHR_SZ,'K');
    setup_char(bits_L,gcc_bits_L,gcc_chardef,CHR_SZ,'L');
    setup_char(bits_M,gcc_bits_M,gcc_chardef,CHR_SZ,'M');
    setup_char(bits_N,gcc_bits_N,gcc_chardef,CHR_SZ,'N');
    setup_char(bits_O,gcc_bits_O,gcc_chardef,CHR_SZ,'O');
    setup_char(bits_P,gcc_bits_P,gcc_chardef,CHR_SZ,'P');
    setup_char(bits_Q,gcc_bits_Q,gcc_chardef,CHR_SZ,'Q');
    setup_char(bits_R,gcc_bits_R,gcc_chardef,CHR_SZ,'R');
    setup_char(bits_S,gcc_bits_S,gcc_chardef,CHR_SZ,'S');
    setup_char(bits_T,gcc_bits_T,gcc_chardef,CHR_SZ,'T');
    setup_char(bits_U,gcc_bits_U,gcc_chardef,CHR_SZ,'U');
    setup_char(bits_V,gcc_bits_V,gcc_chardef,CHR_SZ,'V');
    setup_char(bits_W,gcc_bits_W,gcc_chardef,CHR_SZ,'W');
    setup_char(bits_X,gcc_bits_X,gcc_chardef,CHR_SZ,'X');
    setup_char(bits_Y,gcc_bits_Y,gcc_chardef,CHR_SZ,'Y');
    setup_char(bits_Z,gcc_bits_Z,gcc_chardef,CHR_SZ,'Z');
    setup_char(bits_open_square,gcc_bits_open_square,gcc_chardef,CHR_SZ,'[');
    setup_char(bits_back_slash,gcc_bits_back_slash,gcc_chardef,CHR_SZ,'\\');
    setup_char(bits_close_square,gcc_bits_close_square,gcc_chardef,CHR_SZ,']');
    setup_char(bits_hat,gcc_bits_hat,gcc_chardef,CHR_SZ,'^');
    setup_char(bits_underscore,gcc_bits_underscore,gcc_chardef,CHR_SZ,'_');
    setup_char(bits_back_quote,gcc_bits_back_quote,gcc_chardef,CHR_SZ,'`');
    setup_char(bits_a,gcc_bits_a,gcc_chardef,CHR_SZ,'a');
    setup_char(bits_b,gcc_bits_b,gcc_chardef,CHR_SZ,'b');
    setup_char(bits_c,gcc_bits_c,gcc_chardef,CHR_SZ,'c');
    setup_char(bits_d,gcc_bits_d,gcc_chardef,CHR_SZ,'d');
    setup_char(bits_e,gcc_bits_e,gcc_chardef,CHR_SZ,'e');
    setup_char(bits_f,gcc_bits_f,gcc_chardef,CHR_SZ,'f');
    setup_char(bits_g,gcc_bits_g,gcc_chardef,CHR_SZ,'g');
    setup_char(bits_h,gcc_bits_h,gcc_chardef,CHR_SZ,'h');
    setup_char(bits_i,gcc_bits_i,gcc_chardef,CHR_SZ,'i');
    setup_char(bits_j,gcc_bits_j,gcc_chardef,CHR_SZ,'j');
    setup_char(bits_k,gcc_bits_k,gcc_chardef,CHR_SZ,'k');
    setup_char(bits_l,gcc_bits_l,gcc_chardef,CHR_SZ,'l');
    setup_char(bits_m,gcc_bits_m,gcc_chardef,CHR_SZ,'m');
    setup_char(bits_n,gcc_bits_n,gcc_chardef,CHR_SZ,'n');
    setup_char(bits_o,gcc_bits_o,gcc_chardef,CHR_SZ,'o');
    setup_char(bits_p,gcc_bits_p,gcc_chardef,CHR_SZ,'p');
    setup_char(bits_q,gcc_bits_q,gcc_chardef,CHR_SZ,'q');
    setup_char(bits_r,gcc_bits_r,gcc_chardef,CHR_SZ,'r');
    setup_char(bits_s,gcc_bits_s,gcc_chardef,CHR_SZ,'s');
    setup_char(bits_t,gcc_bits_t,gcc_chardef,CHR_SZ,'t');
    setup_char(bits_u,gcc_bits_u,gcc_chardef,CHR_SZ,'u');
    setup_char(bits_v,gcc_bits_v,gcc_chardef,CHR_SZ,'v');
    setup_char(bits_w,gcc_bits_w,gcc_chardef,CHR_SZ,'w');
    setup_char(bits_x,gcc_bits_x,gcc_chardef,CHR_SZ,'x');
    setup_char(bits_y,gcc_bits_y,gcc_chardef,CHR_SZ,'y');
    setup_char(bits_z,gcc_bits_z,gcc_chardef,CHR_SZ,'z');
    setup_char(bits_open_curly,gcc_bits_open_curly,gcc_chardef,CHR_SZ,'{');
    setup_char(bits_vertical_bar,gcc_bits_vertical_bar,gcc_chardef,CHR_SZ,'|');
    setup_char(bits_close_curly,gcc_bits_close_curly,gcc_chardef,CHR_SZ,'}');
    setup_char(bits_tilde,gcc_bits_tilde,gcc_chardef,CHR_SZ,'~');

    gcc_font = ( font_t *)Gcc_malloc( sizeof( font_t ), 0 );
    malloc_check( gcc_font );

    gcc_font->n = 0x80;
    gcc_font->size_y = 40;
    gcc_font->size_x = 32;
    gcc_font->chardef = (chardef_t *)GSP_ADDR( gcc_chardef );

    Printf("About to load font \n");
    Key_wait();
    Load_text_font( -1, gcc_font );

}

/*-----------------------------------------------------------------------*/

