/*
|
/*
|
* Demonstration program for freetype truetype font support
|
* Demonstration program for freetype truetype font support
|
* Martin Jolicoeur 2000 martinj@visuaide.com.
|
* Martin Jolicoeur 2000 martinj@visuaide.com.
|
*/
|
*/
|
#include <stdio.h>
|
#include <stdio.h>
|
#define MWINCLUDECOLORS
|
#define MWINCLUDECOLORS
|
#include "nano-X.h"
|
#include "nano-X.h"
|
|
|
#if HAVE_T1LIB_SUPPORT
|
#if HAVE_T1LIB_SUPPORT
|
#define FONTNAME "bchr"
|
#define FONTNAME "bchr"
|
#if 0
|
#if 0
|
#define FONTNAME "bchb"
|
#define FONTNAME "bchb"
|
#define FONTNAME "dcr10"
|
#define FONTNAME "dcr10"
|
#define FONTNAME "dcbx10"
|
#define FONTNAME "dcbx10"
|
#endif
|
#endif
|
#elif HAVE_FREETYPE_SUPPORT
|
#elif HAVE_FREETYPE_SUPPORT
|
#define FONTNAME "lt1-r-omega-serif"
|
#define FONTNAME "lt1-r-omega-serif"
|
#if 0
|
#if 0
|
#define FONTNAME "times"
|
#define FONTNAME "times"
|
#define FONTNAME "cour"
|
#define FONTNAME "cour"
|
#endif
|
#endif
|
#else
|
#else
|
#define FONTNAME GR_FONT_SYSTEM_VAR
|
#define FONTNAME GR_FONT_SYSTEM_VAR
|
#endif
|
#endif
|
|
|
#define MAXW 400
|
#define MAXW 400
|
#define MAXH 400
|
#define MAXH 400
|
|
|
GR_GC_ID gid;
|
GR_GC_ID gid;
|
GR_FONT_ID fontid, fontid2;
|
GR_FONT_ID fontid, fontid2;
|
GR_BOOL kerning = GR_FALSE;
|
GR_BOOL kerning = GR_FALSE;
|
GR_BOOL aa = GR_TRUE;
|
GR_BOOL aa = GR_TRUE;
|
GR_BOOL underline = GR_FALSE;
|
GR_BOOL underline = GR_FALSE;
|
int angle = 0;
|
int angle = 0;
|
int state = GR_TFBOTTOM;
|
int state = GR_TFBOTTOM;
|
char buffer[128];
|
char buffer[128];
|
int n;
|
int n;
|
void Render(GR_WINDOW_ID window);
|
void Render(GR_WINDOW_ID window);
|
|
|
int
|
int
|
main()
|
main()
|
{
|
{
|
FILE *file;
|
FILE *file;
|
GR_EVENT event;
|
GR_EVENT event;
|
GR_WINDOW_ID window;
|
GR_WINDOW_ID window;
|
|
|
if (GrOpen() < 0) {
|
if (GrOpen() < 0) {
|
fprintf(stderr, "cannot open graphics\n");
|
fprintf(stderr, "cannot open graphics\n");
|
exit(1);
|
exit(1);
|
}
|
}
|
|
|
window = GrNewWindow(GR_ROOT_WINDOW_ID, 50,50, MAXW,MAXH, 4, BLACK, WHITE);
|
window = GrNewWindow(GR_ROOT_WINDOW_ID, 50,50, MAXW,MAXH, 4, BLACK, WHITE);
|
GrMapWindow(window);
|
GrMapWindow(window);
|
|
|
gid = GrNewGC ();
|
gid = GrNewGC ();
|
GrSelectEvents(window, GR_EVENT_MASK_KEY_DOWN |
|
GrSelectEvents(window, GR_EVENT_MASK_KEY_DOWN |
|
GR_EVENT_MASK_CLOSE_REQ | GR_EVENT_MASK_EXPOSURE);
|
GR_EVENT_MASK_CLOSE_REQ | GR_EVENT_MASK_EXPOSURE);
|
|
|
if ((file = fopen("ftdemo.txt", "r")) == NULL) {
|
if ((file = fopen("ftdemo.txt", "r")) == NULL) {
|
printf("Can't open text file\n");
|
printf("Can't open text file\n");
|
return (-1);
|
return (-1);
|
}
|
}
|
|
|
n = 0;
|
n = 0;
|
|
|
if(fgets(buffer, 128, file) != NULL) {
|
if(fgets(buffer, 128, file) != NULL) {
|
for (n = 0; n < 128 && buffer[n]; n++) {
|
for (n = 0; n < 128 && buffer[n]; n++) {
|
if (buffer[n] == '\n')
|
if (buffer[n] == '\n')
|
break;
|
break;
|
}
|
}
|
}
|
}
|
fclose(file);
|
fclose(file);
|
|
|
fontid = GrCreateFont(FONTNAME, 20, NULL);
|
fontid = GrCreateFont(FONTNAME, 20, NULL);
|
fontid2 = GrCreateFont(FONTNAME, 36, NULL);
|
fontid2 = GrCreateFont(FONTNAME, 36, NULL);
|
|
|
Render(window);
|
Render(window);
|
|
|
while (1) {
|
while (1) {
|
GrGetNextEvent(&event);
|
GrGetNextEvent(&event);
|
|
|
switch (event.type) {
|
switch (event.type) {
|
case GR_EVENT_TYPE_KEY_DOWN:
|
case GR_EVENT_TYPE_KEY_DOWN:
|
switch(event.keystroke.ch) {
|
switch(event.keystroke.ch) {
|
case 171: /* + */
|
case 171: /* + */
|
case '+':
|
case '+':
|
case '=':
|
case '=':
|
angle += 100; /* Increase 10 degrees */
|
angle += 100; /* Increase 10 degrees */
|
angle %= 3600;
|
angle %= 3600;
|
break;
|
break;
|
case 173: /* - */
|
case 173: /* - */
|
case '-':
|
case '-':
|
case '_':
|
case '_':
|
angle -= 100; /* Decrease 10 degrees */
|
angle -= 100; /* Decrease 10 degrees */
|
angle %= 3600;
|
angle %= 3600;
|
break;
|
break;
|
case 'a':
|
case 'a':
|
aa = (aa == GR_FALSE)?GR_TRUE:GR_FALSE;
|
aa = (aa == GR_FALSE)?GR_TRUE:GR_FALSE;
|
break;
|
break;
|
case 'k':
|
case 'k':
|
kerning = (kerning == GR_FALSE)?GR_TRUE:GR_FALSE;
|
kerning = (kerning == GR_FALSE)?GR_TRUE:GR_FALSE;
|
break;
|
break;
|
case 'l':
|
case 'l':
|
state = (state == GR_TFBOTTOM)?GR_TFBASELINE: \
|
state = (state == GR_TFBOTTOM)?GR_TFBASELINE: \
|
(state == GR_TFBASELINE)?GR_TFTOP:GR_TFBOTTOM;
|
(state == GR_TFBASELINE)?GR_TFTOP:GR_TFBOTTOM;
|
break;
|
break;
|
case 'u':
|
case 'u':
|
underline = underline? GR_FALSE: GR_TRUE;
|
underline = underline? GR_FALSE: GR_TRUE;
|
break;
|
break;
|
default:
|
default:
|
continue;
|
continue;
|
/* Unknown keystroke */
|
/* Unknown keystroke */
|
}
|
}
|
Render(window);
|
Render(window);
|
break;
|
break;
|
case GR_EVENT_TYPE_EXPOSURE:
|
case GR_EVENT_TYPE_EXPOSURE:
|
Render(window);
|
Render(window);
|
break;
|
break;
|
case GR_EVENT_TYPE_CLOSE_REQ:
|
case GR_EVENT_TYPE_CLOSE_REQ:
|
GrClose();
|
GrClose();
|
exit(0);
|
exit(0);
|
}
|
}
|
}
|
}
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|
void Render(GR_WINDOW_ID window)
|
void Render(GR_WINDOW_ID window)
|
{
|
{
|
GrSetGCBackground(gid, WHITE);
|
GrSetGCBackground(gid, WHITE);
|
GrSetGCForeground (gid, WHITE);
|
GrSetGCForeground (gid, WHITE);
|
GrSetGCUseBackground(gid, GR_FALSE);
|
GrSetGCUseBackground(gid, GR_FALSE);
|
GrFillRect(window, gid, 0, 0, MAXW, MAXH);
|
GrFillRect(window, gid, 0, 0, MAXW, MAXH);
|
GrSetGCForeground (gid, BLACK);
|
GrSetGCForeground (gid, BLACK);
|
|
|
/* Draw menu */
|
/* Draw menu */
|
GrSetGCFont(gid, fontid);
|
GrSetGCFont(gid, fontid);
|
GrSetFontAttr(fontid, GR_TFKERNING | GR_TFANTIALIAS, 0);
|
GrSetFontAttr(fontid, GR_TFKERNING | GR_TFANTIALIAS, 0);
|
GrText(window, gid, 5, 20, "+ Rotate string clockwise", 25, GR_TFASCII);
|
GrText(window, gid, 5, 20, "+ Rotate string clockwise", 25, GR_TFASCII);
|
GrText(window, gid, 5, 40, "- Rotate string counter-clockwise", 34, GR_TFASCII);
|
GrText(window, gid, 5, 40, "- Rotate string counter-clockwise", 34, GR_TFASCII);
|
GrText(window, gid, 5, 60, "a Toggle anti-aliasing", 22, GR_TFASCII);
|
GrText(window, gid, 5, 60, "a Toggle anti-aliasing", 22, GR_TFASCII);
|
GrText(window, gid, 5, 80, "k Toggle kerning", 16, GR_TFASCII);
|
GrText(window, gid, 5, 80, "k Toggle kerning", 16, GR_TFASCII);
|
GrText(window, gid, 5, 100, "u Toggle underline", 18, GR_TFASCII);
|
GrText(window, gid, 5, 100, "u Toggle underline", 18, GR_TFASCII);
|
GrText(window, gid, 5, 120, "l Toggle alignment bottom/baseline/top", 39, GR_TFASCII);
|
GrText(window, gid, 5, 120, "l Toggle alignment bottom/baseline/top", 39, GR_TFASCII);
|
|
|
/* Draw test string */
|
/* Draw test string */
|
GrSetGCFont(gid, fontid2);
|
GrSetGCFont(gid, fontid2);
|
GrSetFontAttr(fontid2, (kerning?GR_TFKERNING:0) | (aa?GR_TFANTIALIAS:0) |
|
GrSetFontAttr(fontid2, (kerning?GR_TFKERNING:0) | (aa?GR_TFANTIALIAS:0) |
|
(underline?GR_TFUNDERLINE: 0), -1);
|
(underline?GR_TFUNDERLINE: 0), -1);
|
GrSetFontRotation(fontid2, angle);
|
GrSetFontRotation(fontid2, angle);
|
GrText(window, gid, MAXW/2, MAXH/2, buffer, n, state|GR_TFUTF8);
|
GrText(window, gid, MAXW/2, MAXH/2, buffer, n, state|GR_TFUTF8);
|
|
|
/* Draw arrow */
|
/* Draw arrow */
|
GrLine (window, gid, (MAXW/2)-10 , MAXH/2, (MAXW/2)+10, MAXH/2);
|
GrLine (window, gid, (MAXW/2)-10 , MAXH/2, (MAXW/2)+10, MAXH/2);
|
GrLine (window, gid, MAXW/2, (MAXH/2)-10, MAXW/2, (MAXH/2)+10);
|
GrLine (window, gid, MAXW/2, (MAXH/2)-10, MAXW/2, (MAXH/2)+10);
|
}
|
}
|
|
|