2023-08-10 22:14:08 +00:00
# include "v4k.h"
2023-08-04 19:39:36 +00:00
int main ( ) {
2023-09-27 06:49:59 +00:00
window_create ( 75.0 , WINDOW_MSAA8 ) ;
2023-08-04 19:39:36 +00:00
// style: our aliases
# define FONT_REGULAR FONT_FACE1
# define FONT_ITALIC FONT_FACE2
# define FONT_BOLD FONT_FACE3
# define FONT_JAPANESE FONT_FACE4
# define FONT_MONOSPACE FONT_FACE5
2024-02-08 14:34:39 +00:00
# define FONT_WHITE FONT_COLOR1
2023-08-04 19:39:36 +00:00
# define FONT_GRAY FONT_COLOR2
# define FONT_ORANGE FONT_COLOR3
# define FONT_LIME FONT_COLOR4
# define FONT_GREEN FONT_COLOR5
# define FONT_CYAN FONT_COLOR6
# define FONT_LARGEST FONT_H1
# define FONT_LARGE FONT_H2
# define FONT_MEDIUM FONT_H3
# define FONT_NORMAL FONT_H4
# define FONT_SMALL FONT_H5
# define FONT_TINY FONT_H6
2024-02-11 00:14:00 +00:00
// style: atlas size, unicode ranges and font faces (up to 10 faces)
2023-09-27 06:49:59 +00:00
font_face ( FONT_REGULAR , " B612 " " -Regular.ttf " , 48.f , FONT_EU | FONT_AR | FONT_RU | FONT_2048 ) ;
font_face ( FONT_ITALIC , " B612 " " -Italic.ttf " , 48.f , FONT_EU | FONT_AR | FONT_RU | FONT_2048 ) ;
font_face ( FONT_BOLD , " B612 " " -Bold.ttf " , 48.f , FONT_EU | FONT_AR | FONT_RU | FONT_2048 ) ;
2023-08-04 19:39:36 +00:00
font_face ( FONT_JAPANESE , " mplus-1p-medium.ttf " , 48.f , FONT_JP | FONT_2048 ) ; // CJK|FONT_2048|FONT_OVERSAMPLE_Y);
2023-09-27 06:49:59 +00:00
font_face ( FONT_MONOSPACE , " B612Mono " " -Regular.ttf " , 24.f , FONT_EU | FONT_512 ) ;
2023-08-04 19:39:36 +00:00
2024-02-11 00:14:00 +00:00
// style: colors (up to 6 colors)
2023-08-04 19:39:36 +00:00
font_color ( FONT_GRAY , RGB4 ( 100 , 100 , 100 , 255 ) ) ;
font_color ( FONT_ORANGE , RGB4 ( 255 , 192 , 0 , 255 ) ) ;
font_color ( FONT_LIME , RGB4 ( 192 , 255 , 0 , 255 ) ) ;
font_color ( FONT_GREEN , RGB4 ( 0 , 255 , 192 , 255 ) ) ;
font_color ( FONT_CYAN , RGB4 ( 0 , 192 , 255 , 255 ) ) ;
// prepare color highlighting for following code snippet
const char * source =
FONT_MONOSPACE FONT_LARGEST
" int main(int argc, char **argv) { \n "
" for( int i = 0; i < 10; ++i) \n "
" puts( \" hello world \" ); \n "
" return 0; \n "
" } \n " ;
const void * colors = font_colorize ( source , " void,int,char " , " if,else,for,do,while,return,switch,case,break,default, " ) ;
2023-10-23 13:25:03 +00:00
// read input file with strings to display
array ( char * ) lines = 0 ;
for each_substring ( vfs_read ( " pangrams.txt " ) , " \r \n " , it ) array_push ( lines , STRDUP ( it ) ) ;
2024-02-10 20:45:10 +00:00
// panning controls
2024-02-11 00:14:00 +00:00
vec2 cursor = { 0 } ;
2024-02-10 20:45:10 +00:00
2023-08-04 19:39:36 +00:00
// demo loop
while ( window_swap ( ) & & ! input ( KEY_ESC ) ) {
ddraw_grid ( 0 ) ;
2024-02-10 20:45:10 +00:00
// pan the viewport
if ( input ( MOUSE_L ) ) {
cursor . x + = input_diff ( MOUSE_X ) ;
cursor . y + = input_diff ( MOUSE_Y ) ;
}
2023-08-04 19:39:36 +00:00
// initial spacing
2024-02-10 20:45:10 +00:00
font_goto ( cursor . x , cursor . y + 50 ) ;
2023-08-04 19:39:36 +00:00
// print a code snippet with syntax highlighting
font_highlight ( source , colors ) ;
// print a few strings with markup codes
font_print (
FONT_REGULAR
FONT_LARGEST FONT_GRAY " The quick "
FONT_LARGE FONT_LIME " brown "
FONT_MEDIUM FONT_GRAY " fox "
FONT_NORMAL " jumps over "
FONT_SMALL " the lazy "
FONT_TINY " dog. \n " ) ;
font_print (
FONT_REGULAR FONT_LARGE FONT_CYAN
" Now is the time for all " FONT_ITALIC " good men " FONT_REGULAR " to come to the aid of " FONT_BOLD " the party. \n " ) ;
font_print (
FONT_ITALIC FONT_LARGE FONT_GREEN
" Ég get etið gler án þess að meiða mig! \n " ) ;
font_print (
FONT_BOLD FONT_LARGE FONT_ORANGE
" Эх, чужак! Общий съём цен шляп (юфть)—вдрызг!. \n " ) ;
font_print (
FONT_JAPANESE
" 私はガラスを食べられます。それは私を傷つけません。 \n " ) ;
font_print ( " This text " ) ;
font_print ( " should display concatenated, " ) ;
font_print ( " as there are no linefeeds. \n " ) ;
// i18n: pangrams.txt file, line browser
static int counter = 0 ;
counter + = input_down ( KEY_RIGHT ) - input_down ( KEY_LEFT ) ;
counter + = counter < 0 ? array_count ( lines ) : 0 ;
font_print ( va ( " << %s >> \n " , lines [ counter % array_count ( lines ) ] ) ) ;
// this does not work yet. you cant chain alignments yet...
//font_print(FONT_TOP "Top" FONT_MIDDLE "Middle" FONT_BASELINE "Baseline" FONT_BOTTOM "Bottom\n");
//font_print(FONT_LEFT "Left" FONT_CENTER "Center" FONT_RIGHT "Right\n");
// ... alignment must be the first tag in a string for now. this is a temporary hack.
2024-02-08 10:24:55 +00:00
font_goto ( 0 , window_height ( ) * 3 / 4. ) ;
2023-08-04 19:39:36 +00:00
font_print ( FONT_LEFT " left " ) ;
font_print ( FONT_CENTER " center " ) ;
font_print ( FONT_RIGHT " right " ) ;
2024-02-08 10:24:55 +00:00
font_print ( FONT_TOP FONT_CENTER " top " ) ;
font_print ( FONT_MIDDLE FONT_RIGHT " middle " ) ;
font_print ( FONT_BASELINE FONT_RIGHT " baseline " ) ;
font_print ( FONT_BOTTOM FONT_CENTER " bottom " ) ;
2023-12-10 15:01:36 +00:00
{
2024-02-10 20:45:10 +00:00
vec2 pos = vec2 ( cursor . x + 1290 , cursor . y + 120 ) ;
2023-12-10 15:01:36 +00:00
ddraw_push_2d ( ) ;
char * txt = " This is the first line. \n And now the second line. \n You can do a third great line, too! \n " ;
font_goto ( pos . x , pos . y ) ;
vec2 size = font_rect ( txt ) ;
2023-12-10 15:47:42 +00:00
font_metrics_t m = font_metrics ( txt ) ;
ddraw_aabb ( vec3 ( pos . x , pos . y , 0 ) , vec3 ( pos . x + size . x , pos . y + size . y - m . descent + m . linegap , 0 ) ) ;
2023-12-10 15:01:36 +00:00
font_print ( txt ) ;
ddraw_pop_2d ( ) ;
}
2024-02-08 12:23:27 +00:00
{
2024-02-10 20:45:10 +00:00
vec2 pos = vec2 ( cursor . x + 1490 , cursor . y + 820 ) ;
2024-02-08 12:23:27 +00:00
ddraw_push_2d ( ) ;
2024-02-08 14:17:00 +00:00
char * txt = FONT_JUSTIFY FONT_MIDDLE " This is the first line. \n And now the second line. \n You can do a third great line, too! \n Now this is a very long line aaaaaaaaaa! \n " ;
2024-02-08 12:23:27 +00:00
font_goto ( pos . x , pos . y ) ;
vec2 size = font_rect ( txt ) ;
font_metrics_t m = font_metrics ( txt ) ;
2024-02-10 20:28:48 +00:00
ddraw_aabb ( vec3 ( pos . x , pos . y , 0 ) , vec3 ( pos . x + size . x , pos . y + size . y - m . descent + m . linegap , 0 ) ) ;
font_clip ( txt , vec4 ( pos . x , pos . y , size . x , size . y ) ) ;
ddraw_pop_2d ( ) ;
}
static float max_width = 300.0f ;
{
2024-02-10 20:45:10 +00:00
vec2 pos = vec2 ( cursor . x + 2000 , cursor . y + 240 ) ;
2024-02-10 20:28:48 +00:00
ddraw_push_2d ( ) ;
char * txt = " This is the first line. \n \n And now the second line. \n \n You can do a third great line, too! \n \n Now this is a very long line aaaaaaaaaa! \n " ;
font_goto ( pos . x , pos . y ) ;
const char * wrapped_text = font_wrap ( txt , max_width ) ;
vec2 size = font_rect ( wrapped_text ) ;
font_metrics_t m = font_metrics ( wrapped_text ) ;
ddraw_aabb ( vec3 ( pos . x , pos . y , 0 ) , vec3 ( pos . x + size . x , pos . y + size . y - m . descent + m . linegap , 0 ) ) ;
font_clip ( wrapped_text , vec4 ( pos . x , pos . y , size . x , size . y ) ) ;
2024-02-10 16:05:45 +00:00
ddraw_pop_2d ( ) ;
}
{
2024-02-10 20:45:10 +00:00
vec2 pos = vec2 ( cursor . x + 1490 , cursor . y + 240 ) ;
2024-02-10 16:05:45 +00:00
ddraw_push_2d ( ) ;
char * txt = " This is the first line. \n And now the second line. \n You can do a third great line, too! \n Now this is a very long line aaaaaaaaaa! \n " ;
font_goto ( pos . x , pos . y ) ;
vec2 size = font_rect ( txt ) ;
size . y - = 20 ; // artifically shrink textbox to test clipping
font_metrics_t m = font_metrics ( txt ) ;
ddraw_aabb ( vec3 ( pos . x , pos . y , 0 ) , vec3 ( pos . x + size . x , pos . y + size . y - m . descent + m . linegap , 0 ) ) ;
font_clip ( txt , vec4 ( pos . x , pos . y , size . x , size . y ) ) ;
2024-02-08 12:23:27 +00:00
ddraw_pop_2d ( ) ;
}
{
2024-02-10 20:45:10 +00:00
vec2 pos = vec2 ( cursor . x + 1990 , cursor . y + 820 ) ;
2024-02-08 12:23:27 +00:00
ddraw_push_2d ( ) ;
2024-02-10 16:05:45 +00:00
char * txt = FONT_RIGHT FONT_BOTTOM
FONT_WHITE " This is the first line. \n "
FONT_LIME " And now the second line. \n "
FONT_WHITE " You can do a third "
FONT_ORANGE " great "
FONT_WHITE " line, too! \n " ;
2024-02-08 12:23:27 +00:00
font_goto ( pos . x , pos . y ) ;
vec2 size = font_rect ( txt ) ;
font_metrics_t m = font_metrics ( txt ) ;
ddraw_aabb ( vec3 ( pos . x , pos . y , 0 ) , vec3 ( pos . x + size . x , pos . y + size . y - m . descent + m . linegap + 100 , 0 ) ) ;
2024-02-10 16:05:45 +00:00
font_clip ( txt , vec4 ( pos . x , pos . y , size . x , size . y + 100 ) ) ;
2024-02-08 12:23:27 +00:00
ddraw_pop_2d ( ) ;
}
2023-12-10 15:01:36 +00:00
{
2024-02-10 20:45:10 +00:00
vec2 pos = vec2 ( cursor . x + 830 , cursor . y + 80 ) ;
2023-12-10 15:01:36 +00:00
ddraw_push_2d ( ) ;
2024-02-08 10:24:55 +00:00
char * txt = " Very iffy global text. " ;
2023-12-10 15:01:36 +00:00
font_goto ( pos . x , pos . y ) ;
vec2 size = font_rect ( txt ) ;
ddraw_aabb ( vec3 ( pos . x , pos . y , 0 ) , vec3 ( pos . x + size . x , pos . y + size . y , 0 ) ) ;
font_print ( txt ) ;
ddraw_pop_2d ( ) ;
}
{
2024-02-10 20:45:10 +00:00
vec2 pos = vec2 ( cursor . x + 830 , cursor . y + 160 ) ;
2023-12-10 15:01:36 +00:00
ddraw_push_2d ( ) ;
2024-02-08 10:24:55 +00:00
char * txt = FONT_H1 " Very iffy global text. " ;
font_goto ( pos . x , pos . y ) ;
vec2 size = font_rect ( txt ) ;
ddraw_aabb ( vec3 ( pos . x , pos . y , 0 ) , vec3 ( pos . x + size . x , pos . y + size . y , 0 ) ) ;
font_print ( txt ) ;
ddraw_pop_2d ( ) ;
}
for ( int i = 1 ; i < = 6 ; i + + ) {
2024-02-10 20:45:10 +00:00
vec2 pos = vec2 ( cursor . x + 830 , cursor . y + 550 + 55 * ( i + 1 ) ) ;
2024-02-08 10:24:55 +00:00
ddraw_push_2d ( ) ;
char * txt = va ( " %cTest line %d " , i , i ) ;
2023-12-10 15:01:36 +00:00
font_goto ( pos . x , pos . y ) ;
vec2 size = font_rect ( txt ) ;
ddraw_aabb ( vec3 ( pos . x , pos . y , 0 ) , vec3 ( pos . x + size . x , pos . y + size . y , 0 ) ) ;
font_print ( txt ) ;
ddraw_pop_2d ( ) ;
}
if ( ui_panel ( " Fonts " , 0 ) ) {
ui_font ( ) ;
ui_panel_end ( ) ;
}
2024-02-10 20:28:48 +00:00
if ( ui_panel ( " Textbox " , 0 ) ) {
ui_float ( " Max width " , & max_width ) ;
ui_panel_end ( ) ;
}
2023-08-04 19:39:36 +00:00
}
}