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

📄 convfnt.c

📁 神龙卡开发原代码
💻 C
字号:
/* * Copyright (c) 1999 Greg Haerr <greg@censoft.com> * * MS Windows Font Grabber for Micro-Windows * * Usage: convfnt32 [1|2|3|4|<fontname>] * * Note: a Microsoft License is required to use MS Fonts */#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <util.h>#define MAX_CHAR_HEIGHT	16	/* max character height*/typedef unsigned short	IMAGEBITS;	/* bitmap image unit size*//* IMAGEBITS macros*/#define	IMAGE_SIZE(width, height)  ((height) * (((width) + sizeof(IMAGEBITS) * 8 - 1) / (sizeof(IMAGEBITS) * 8)))#define IMAGE_WORDS(x)		(((x)+15)/16)#define	IMAGE_BITSPERIMAGE	(sizeof(IMAGEBITS) * 8)#define	IMAGE_FIRSTBIT		((IMAGEBITS) 0x8000)#define	IMAGE_NEXTBIT(m)	((IMAGEBITS) ((m) >> 1))#define	IMAGE_TESTBIT(m)	((m) & IMAGE_FIRSTBIT)	  /* use with shiftbit*/#define	IMAGE_SHIFTBIT(m)	((IMAGEBITS) ((m) << 1))  /* for testbit*//* global data*/HINSTANCE	ghInstance;char 		APPWINCLASS[] = "convfnt";int 		CHAR_WIDTH;int 		CHAR_HEIGHT;int		CHAR_ASCENT;char 		fontname[64];FILE *		fp;HFONT		hfont;int 		FIRST_CHAR = ' ';int 		LAST_CHAR = 256;int 		curoff = 0;int 		offsets[256];int 		widths[256];/* forward decls*/LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wp,LPARAM lp);HWND InitApp(void);int  InitClasses(void);void doit(HDC hdc);void convfnt(HDC hdc);void print_char(int ch,IMAGEBITS *b, int w, int h);void print_bits(IMAGEBITS *bits, int width, int height);HFONT WINAPI GetFont(HDC hDC, LPSTR fontName,int fontSize,int fontStyle);HFONT WINAPI GetFontEx(HDC hDC, LPSTR fontName,int fontSize,int fontStyle,		int charset);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,	int nShowCmd){	MSG		msg;	HDC		hdc;	int		i;	char *	q;	char	arg[80];	ghInstance = hInstance;	InitClasses();	InitApp();	i = atoi(lpCmdLine);	hdc = GetDC(NULL);	switch(i) {	case 0:		if(*lpCmdLine == 0)			lpCmdLine = "MS Sans Serif";		q = arg;		for(q=arg; *lpCmdLine; ++lpCmdLine) {			if(*lpCmdLine == '"' || *lpCmdLine == '\'')				continue;			*q++ = *lpCmdLine;		}		*q = 0;		hfont = GetFont(hdc, arg, 8, 0);		break;	case 1:		hfont = GetStockObject(DEFAULT_GUI_FONT);	/* winMSSansSerif11x13 */		break;	case 2:		hfont = GetStockObject(SYSTEM_FONT);		/* winSystem14x16 */		break;	case 3:		hfont = GetStockObject(OEM_FIXED_FONT);		/* winTerminal8x12 */		break;	case 4:		hfont = GetStockObject(ANSI_VAR_FONT);		/* winMSSansSerif11x13 */		break;	}	ReleaseDC(NULL, hdc);	while(GetMessage(&msg, NULL, 0, 0)) {		TranslateMessage(&msg);		DispatchMessage(&msg);	}	return 0;}intInitClasses(void){	WNDCLASS	wc;	wc.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;	wc.lpfnWndProc = (WNDPROC)WndProc;	wc.cbClsExtra = 0;	wc.cbWndExtra = 0;	wc.hInstance = ghInstance;	wc.hIcon = LoadIcon(ghInstance, MAKEINTRESOURCE( 1));	wc.hCursor = LoadCursor(NULL, IDC_ARROW);	wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);	wc.lpszMenuName = NULL;	wc.lpszClassName =  APPWINCLASS;	return RegisterClass( &wc);}HWNDInitApp(void){	HWND	hwnd;	hwnd = CreateWindowEx( 0L, APPWINCLASS,		"Font Grabber",		WS_OVERLAPPEDWINDOW,		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,		NULL,		NULL,		ghInstance,		NULL);	if( hwnd == NULL)		return( 0);	ShowWindow( hwnd, SW_SHOW);	return hwnd;}LRESULT CALLBACKWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){	PAINTSTRUCT		ps;	HDC				hdc;	LOGFONT			lf;	TEXTMETRIC		tm;	char			outfile[64];	char 			*p, *q;	switch( msg) {	case WM_CREATE:		break;	case WM_DESTROY:		PostQuitMessage(0);		break;	case WM_PAINT:		hdc = BeginPaint(hwnd, &ps);		SelectObject(hdc, hfont);		GetObject(hfont, sizeof(lf), &lf);		GetTextMetrics(hdc, &tm);		CHAR_WIDTH = tm.tmMaxCharWidth;		CHAR_HEIGHT = tm.tmHeight;		CHAR_ASCENT = tm.tmAscent;		FIRST_CHAR = tm.tmFirstChar;		LAST_CHAR = tm.tmLastChar + 1;		strcpy(fontname, lf.lfFaceName);		q = p = fontname;		while(*p) {			if(*p != ' ')				*q++ = *p;			++p;		}		*q = 0;		wsprintf(outfile, "win%s%dx%d.c", fontname, CHAR_WIDTH, CHAR_HEIGHT);		fp = fopen(outfile, "wt");		doit(hdc);		fclose(fp);		exit(1);		EndPaint(hwnd, &ps);		break;	case WM_LBUTTONDOWN:		break;	default:		return DefWindowProc( hwnd, msg, wp, lp);	}	return( 0);}voidconvfnt(HDC hdc){	SIZE	size;   	unsigned char	ch;	int		i;	int		x, y;	USHORT 	c;	IMAGEBITS	image[MAX_CHAR_HEIGHT];	static USHORT mask[] = { 		0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100,		0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001	};	for(i=FIRST_CHAR; i<LAST_CHAR; ++i) {		ch = i;		TextOut(hdc, 0, 0, &ch, 1);		GetTextExtentPoint32(hdc, &ch, 1, &size);		for(y=0; y<size.cy; ++y) {			image[y] = 0;			for(x=0; x<size.cx; ++x) {				c = GetPixel(hdc, x, y)? 0: 1;				image[y] = (image[y] & ~mask[x&15]) | (c << (15 - (x & 15)));			}		}		offsets[ch] = curoff;		widths[ch] = size.cx;		print_char(ch, image, size.cx, size.cy);		print_bits(image, size.cx, size.cy);		curoff += size.cy;		fprintf(fp, "\n");	}}voiddoit(HDC hdc){	int		i;	fprintf(fp, "/* Generated by convfnt.exe*/\n");	fprintf(fp, "#include \"device.h\"\n\n");	fprintf(fp, "/* Windows %s %dx%d Font */\n\n",		fontname, CHAR_WIDTH, CHAR_HEIGHT);	fprintf(fp, "static MWIMAGEBITS win%s%dx%d_bits[] = {\n\n",		fontname, CHAR_WIDTH, CHAR_HEIGHT);	convfnt(hdc);	fprintf(fp, "};\n\n");	fprintf(fp, "/* Character->glyph data. */\n");	fprintf(fp, "static unsigned short win%s%dx%d_offset[] = {\n",		fontname, CHAR_WIDTH, CHAR_HEIGHT);	for(i=FIRST_CHAR; i<LAST_CHAR; ++i)		fprintf(fp, "  %d,\t /* %c (0x%02x) */\n", offsets[i], i<' '? ' ':i , i);	fprintf(fp, "};\n\n");	fprintf(fp, "/* Character width data. */\n");	fprintf(fp, "static unsigned char win%s%dx%d_width[] = {\n",		fontname, CHAR_WIDTH, CHAR_HEIGHT);	for(i=FIRST_CHAR; i<LAST_CHAR; ++i)		fprintf(fp, "  %d,\t /* %c (0x%02x) */\n", widths[i], i<' '? ' ':i , i);	fprintf(fp, "};\n\n");	fprintf(fp, "/* Exported structure definition. */\n"		"MWCFONT font_win%s%dx%d = {\n",		fontname, CHAR_WIDTH, CHAR_HEIGHT);	fprintf(fp, "\t\"win%s%dx%d\",\n", fontname, CHAR_WIDTH, CHAR_HEIGHT);	fprintf(fp, "\t%d,\n", CHAR_WIDTH);	fprintf(fp, "\t%d,\n", CHAR_HEIGHT);	fprintf(fp, "\t%d,\n", CHAR_ASCENT);	fprintf(fp, "\t%d,\n\t%d,\n", FIRST_CHAR, LAST_CHAR-FIRST_CHAR);	fprintf(fp, "\twin%s%dx%d_bits,\n", fontname, CHAR_WIDTH, CHAR_HEIGHT);	fprintf(fp, "\twin%s%dx%d_offset,\n", fontname, CHAR_WIDTH, CHAR_HEIGHT);	fprintf(fp, "\twin%s%dx%d_width,\n", fontname, CHAR_WIDTH, CHAR_HEIGHT);	fprintf(fp, "};\n");}/* Character ! (0x21):   ht=16, width=8   +----------------+   |                |   |                |   | *              |   | *              |   | *              |   | *              |   | *              |   | *              |   |                |   | *              |   |                |   |                |   +----------------+ */voidprint_char(int ch,IMAGEBITS *bits, int width, int height){	int 		x;	int 		bitcount;	/* number of bits left in bitmap word */	IMAGEBITS	bitvalue;	/* bitmap word value */	fprintf(fp, "/* Character %c (0x%02x):\n", (ch < ' '? ' ': ch), ch);	fprintf(fp, "   ht=%d, width=%d\n", height, width);	fprintf(fp, "   +");	for(x=0; x<width; ++x)		fprintf(fp, "-");	fprintf(fp, "+\n");	x = 0;	bitcount = 0;	while (height > 0) {	    if (bitcount <= 0) {		    fprintf(fp, "   |");		    bitcount = IMAGE_BITSPERIMAGE;		    bitvalue = *bits++;	    }		if (IMAGE_TESTBIT(bitvalue))			    fprintf(fp, "*");		else fprintf(fp, " ");	    bitvalue = IMAGE_SHIFTBIT(bitvalue);	    --bitcount;	    if (x++ == width-1) {		    x = 0;		    --height;		    bitcount = 0;		    fprintf(fp, "|\n");	    }	}	fprintf(fp, "   +");	for(x=0; x<width; ++x)		fprintf(fp, "-");	fprintf(fp, "+ */\n");}#define	IMAGE_GETBIT4(m)	(((m) & 0xf000) >> 12)#define	IMAGE_SHIFTBIT4(m)	((IMAGEBITS) ((m) << 4))voidprint_bits(IMAGEBITS *bits, int width, int height){	int 		x;	int 		bitcount;	/* number of bits left in bitmap word */	IMAGEBITS	bitvalue;	/* bitmap word value */	x = 0;	bitcount = 0;	while (height > 0) {	    if (bitcount <= 0) {		    fprintf(fp, "0x");		    bitcount = IMAGE_BITSPERIMAGE;		    bitvalue = *bits++;	    }		fprintf(fp, "%x", IMAGE_GETBIT4(bitvalue));	    bitvalue = IMAGE_SHIFTBIT4(bitvalue);	    bitcount -= 4;		x += 4;	    if (x >= width) {			if(IMAGE_BITSPERIMAGE > width)				for(x=IMAGE_BITSPERIMAGE-width; x>3; ) {					fprintf(fp, "0");					x -= 4;				}		    x = 0;		    --height;		    bitcount = 0;		    fprintf(fp, ",\n");	    }	}}/* * WIN Draw Library * * GetFont style bits: *			01 bold *			02 italic * fontSize > 0		points (must pass hDC for non-screen font) * fontSize < 0		pixels (no HDC needed) */HFONT WINAPIGetFont(HDC hDC, LPSTR fontName,int fontSize,int fontStyle){	return GetFontEx(hDC, fontName, fontSize, fontStyle, ANSI_CHARSET);}HFONT WINAPIGetFontEx(HDC hDC, LPSTR fontName,int fontSize,int fontStyle,int charset){	LOGFONT	lf;	HDC		hdc;	memset( &lf, 0, sizeof(LOGFONT));	if( fontSize < 0 || hDC)		hdc = hDC;	else hdc = GetDC( GetDesktopWindow());	/* calculate font size from passed point size*/	if( fontSize < 0)		lf.lfHeight = -fontSize;	else lf.lfHeight = -MulDiv( fontSize,				GetDeviceCaps( hdc, LOGPIXELSY), 72);	if( fontName)		strncpy( lf.lfFaceName, fontName, LF_FACESIZE);	else lf.lfFaceName[ 0] = '\0';	lf.lfWeight = (fontStyle & 01)? FW_BOLD: FW_NORMAL;	if( fontStyle & 02)		lf.lfItalic = 1;	lf.lfCharSet = charset;	if( fontSize > 0 && !hDC)		ReleaseDC( GetDesktopWindow(), hdc);	return CreateFontIndirect( &lf);}

⌨️ 快捷键说明

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