⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
字号:
/* Framebuffer Graphics Libary for Linux, Copyright 1993 Harm Hanemaayer *//* text.c       Text writing and fonts */#include <stdlib.h>#include <stdio.h>#include <stdarg.h>#include <vga.h>#include "inlstring.h"		/* include inline string operations */#include "vgagl.h"#include "def.h"/* Text/font functions */static int font_width = 8;static int font_height = 8;static char *font_address;static int font_charactersize = 64;static int font_writemode = WRITEMODE_OVERWRITE;static int compressed_font_bg = 0;static int compressed_font_fg = 15;static void writecompressed(int x, int y, int n, unsigned char *s);void gl_colorfont(int fw, int fh, int fg, void *_dp){    uchar *dp = _dp;    int i;    i = fw * fh * 256;    switch (BYTESPERPIXEL) {    case 1:	while (i > 0) {	    if (*dp)		*dp = fg;	    dp++;	    i--;	}	break;    case 2:	while (i > 0) {	    if (*(ushort *) dp)		*(ushort *) dp = fg;	    dp += 2;	    i--;	}	break;    case 3:	while (i > 0) {	    if (*(ushort *) dp || *(dp + 2)) {		*(ushort *) dp = fg;		*(dp + 2) = fg >> 16;	    }	    dp += 3;	    i--;	}	break;    case 4:	while (i > 0) {	    if (*(int *) dp)		*(int *) dp = fg;	    dp += 4;	    i--;	}	break;    }}void gl_setfont(int fw, int fh, void *font){    font_width = fw;    font_height = fh;    font_charactersize = font_width * font_height * BYTESPERPIXEL;    font_address = font;}void gl_setwritemode(int m){    font_writemode = m;}void gl_writen(int x, int y, int n, char *s){/* clipping in putbox */    int i;    if (font_writemode & FONT_COMPRESSED) {	writecompressed(x, y, n, s);	return;    }    if (!(font_writemode & WRITEMODE_MASKED)) {        for (i=0; i<n; i++) {	    gl_putbox(x + i * font_width, y, font_width,		      font_height, font_address +		      (unsigned char) s[i] * font_charactersize);	}    } else {			/* masked write */        for (i=0; i<n; i++) {	    gl_putboxmask(x + i * font_width, y, font_width,			  font_height, font_address +			  (unsigned char) s[i] * font_charactersize);	}    }}void gl_write(int x, int y, char *s){    int n;    for (n=0; s[n]; n++);    gl_writen(x, y, n, s);}#ifndef SVGA_AOUTstatic int gl_nprintf(int sx, int sy, size_t bufs, const char *fmt, va_list args){    unsigned char *buf;    static int x = 0, y = 0, x_start = 0;    int n;    buf = alloca(bufs);    n = vsnprintf(buf, bufs, fmt, args);    if (n < 0)	return n; /* buffer did not suffice, return and retry */    if ((sx >= 0) && (sy >= 0)) {	x = x_start = sx;	y = sy;    }	    for (; *buf; buf++)	switch (*buf) {	case '\a':		/* badly implemented */	    fputc('\a', stdout);	    fflush(stdout);	    break;	case '\b':	    x -= font_width;	    if (x < x_start) {		x = WIDTH + (x_start % font_width);		while(x + font_width > WIDTH)		    x -= font_width;		if (y >= font_height)		    y -= font_height;	    }	    break;	case '\n':	  newline:	    y += font_height;	    if (y + font_height > HEIGHT)		y %= font_height;	case '\r':	    x = x_start;	    break;	case '\t':	    x += ((TEXT_TABSIZE - ((x - x_start) / font_width) % TEXT_TABSIZE) * font_width);	    goto chk_wrap;	    break;	case '\v':	    y += font_height;	    if (y + font_height > HEIGHT)		y %= font_height;	    break;	default:	    gl_writen(x, y, 1, buf);	    x += font_width;	  chk_wrap:	    if (x + font_width > WIDTH)		goto newline;	}    return n;}int gl_printf(int x, int y, const char *fmt, ...){    size_t bufs = BUFSIZ;    int result;    va_list args;    va_start(args, fmt);    /* Loop until buffer size suffices */    do {	result = gl_nprintf(x, y, bufs, fmt, args);	bufs <<= 1;    } while(result < 0);	    va_end(args);    return result;}#endifvoid gl_expandfont(int fw, int fh, int fg, void *_f1, void *_f2){/* Convert bit-per-pixel font to byte(s)-per-pixel font */    uchar *f1 = _f1;    uchar *f2 = _f2;    int i, x, y, b = 0;		/* keep gcc happy with b = 0 - MW */    for (i = 0; i < 256; i++) {	for (y = 0; y < fh; y++)	    for (x = 0; x < fw; x++) {		if (x % 8 == 0)		    b = *f1++;		if (b & (128 >> (x % 8)))	/* pixel */		    switch (BYTESPERPIXEL) {		    case 1:			*f2 = fg;			f2++;			break;		    case 2:			*(ushort *) f2 = fg;			f2 += 2;			break;		    case 3:			*(ushort *) f2 = fg;			*(f2 + 2) = fg >> 16;			f2 += 3;			break;		    case 4:			*(uint *) f2 = fg;			f2 += 4;		} else		/* no pixel */		    switch (BYTESPERPIXEL) {		    case 1:			*f2 = 0;			f2++;			break;		    case 2:			*(ushort *) f2 = 0;			f2 += 2;			break;		    case 3:			*(ushort *) f2 = 0;			*(f2 + 2) = 0;			f2 += 3;			break;		    case 4:			*(uint *) f2 = 0;			f2 += 4;		    }	    }    }}static void expandcharacter(int bg, int fg, int c, unsigned char *bitmap){    int x, y;    unsigned char *font;    int b = 0;			/* keep gcc happy with b = 0 - MW */    font = font_address + c * (font_height * ((font_width + 7) / 8));    for (y = 0; y < font_height; y++)	for (x = 0; x < font_width; x++) {	    if (x % 8 == 0)		b = *font++;	    if (b & (128 >> (x % 8)))	/* pixel */		switch (BYTESPERPIXEL) {		case 1:		    *bitmap = fg;		    bitmap++;		    break;		case 2:		    *(ushort *) bitmap = fg;		    bitmap += 2;		    break;		case 3:		    *(ushort *) bitmap = fg;		    *(bitmap + 2) = fg >> 16;		    bitmap += 3;		    break;		case 4:		    *(uint *) bitmap = fg;		    bitmap += 4;	    } else		/* background pixel */		switch (BYTESPERPIXEL) {		case 1:		    *bitmap = bg;		    bitmap++;		    break;		case 2:		    *(ushort *) bitmap = bg;		    bitmap += 2;		    break;		case 3:		    *(ushort *) bitmap = bg;		    *(bitmap + 2) = bg;		    bitmap += 3;		    break;		case 4:		    *(uint *) bitmap = bg;		    bitmap += 4;		}	}}/* Write using compressed font. */static void writecompressed(int x, int y, int n, unsigned char *s){    unsigned char *bitmap;    int i;    bitmap = alloca(font_width * font_height * BYTESPERPIXEL);    if (!(font_writemode & WRITEMODE_MASKED)) {        for (i=0; i<n; i++) {	    expandcharacter(compressed_font_bg,			    compressed_font_fg, s[i], bitmap);	    gl_putbox(x + i * font_width, y, font_width,		      font_height, bitmap);	}    } else {			/* masked write */        for (i=0; i<n; i++) {	    expandcharacter(0, compressed_font_fg, s[i], bitmap);	    gl_putboxmask(x + i * font_width, y, font_width,			  font_height, bitmap);	}    }}void gl_setfontcolors(int bg, int fg){    compressed_font_bg = bg;    compressed_font_fg = fg;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -