Bochs/bochs/patches/patch.x11-internal-vgafont

190 lines
5.5 KiB
Plaintext

----------------------------------------------------------------------
Patch name: patch-x11-internal-vgafont
Author: Christophe Bothamy
Date: Thu Jan 16 18:11:16 CET 2003
Detailed description:
This patch removes the need for an external X11 vga font.
Patch was created with:
cvs diff -u
Apply patch to what version:
cvs checked out on Thu Jan 16 18:11:16 CET 2003
Instructions:
To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE".
----------------------------------------------------------------------
Index: gui/x.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/x.cc,v
retrieving revision 1.57
diff -u -r1.57 x.cc
--- gui/x.cc 30 Dec 2002 13:17:39 -0000 1.57
+++ gui/x.cc 16 Jan 2003 17:09:50 -0000
@@ -47,6 +47,8 @@
//#include "icon_bochs.h"
#include "icon_bochs.xpm"
+#include "font/vga.bitmap.h"
+
class bx_x_gui_c : public bx_gui_c {
public:
bx_x_gui_c (void);
@@ -79,7 +81,6 @@
static Window win;
static GC gc, gc_inv, gc_headerbar, gc_headerbar_inv;
-static XFontStruct *font_info;
static unsigned font_width, font_height;
static unsigned font_height_orig = 16;
static Bit8u blank_line[80];
@@ -109,6 +110,8 @@
static Bit32u convertStringToXKeysym (const char *string);
+static Pixmap vgafont[256];
+
struct {
Pixmap bmap;
unsigned xdim;
@@ -262,7 +265,7 @@
extern Bit8u graphics_snapshot[32 * 1024];
-static void load_font(void);
+static void create_vga_font(void);
static void xkeypress(KeySym keysym, int press_release);
// extern "C" void select_visual(void);
@@ -374,16 +377,13 @@
x = y = 0;
- load_font();
-
- font_width = font_info->max_bounds.width;
- font_height = (font_info->max_bounds.ascent +
- font_info->max_bounds.descent);
+ // Temporary values so we can create the window
+ font_width = 8;
+ font_height = 16;
dimension_x = columns * font_width;
dimension_y = rows * font_height + headerbar_y;
-
/* create opaque window */
win = XCreateSimpleWindow(bx_x_display, RootWindow(bx_x_display,bx_x_screen_num),
x, y,
@@ -526,9 +526,6 @@
gc_headerbar = XCreateGC(bx_x_display, win, valuemask, &values);
gc_headerbar_inv = XCreateGC(bx_x_display, win, valuemask, &values);
- /* specify font */
- XSetFont(bx_x_display, gc, font_info->fid);
-
XSetState(bx_x_display, gc, white_pixel, black_pixel, GXcopy,AllPlanes);
XSetState(bx_x_display, gc_inv, black_pixel, white_pixel, GXinvert,AllPlanes);
@@ -549,6 +546,10 @@
}
BX_DEBUG(("MapNotify found."));
+ // Create the VGA font
+ create_vga_font();
+
+
{
char *imagedata;
@@ -618,19 +619,20 @@
}
void
-load_font(void)
+create_vga_font(void)
{
- /* Load font and get font information structure. */
- if ((font_info = XLoadQueryFont(bx_x_display,"bochsvga")) == NULL) {
- if ((font_info = XLoadQueryFont(bx_x_display,"vga")) == NULL) {
- if ((font_info = XLoadQueryFont(bx_x_display,"-*-vga-*")) == NULL) {
- BX_PANIC(("Could not open vga font. See docs-html/install.html"));
- }
- }
+ // Fixed for now
+ font_width=8;
+ font_height=16;
+
+ for(int i=0; i<256; i++) {
+ vgafont[i]=XCreateBitmapFromData(bx_x_display, win, (const char*)bx_vgafont[i].data,
+ font_width, font_height);
+ if(vgafont[i] == None)
+ BX_PANIC(("Can't create vga font [%d]", i));
}
}
-
void
bx_x_gui_c::handle_events(void)
{
@@ -1057,7 +1059,7 @@
{
unsigned i, x, y, curs;
unsigned new_foreground, new_background;
- Bit8u string[1];
+ Bit8u c;
Bit8u cs_start, cs_end;
unsigned nchars;
@@ -1072,42 +1074,30 @@
// first draw over character at original block cursor location
if ( (prev_block_cursor_y*columns + prev_block_cursor_x) < nchars ) {
curs = (prev_block_cursor_y*columns + prev_block_cursor_x)*2;
- string[0] = new_text[curs];
- if (string[0] == 0) string[0] = ' '; // convert null to space
+ c = new_text[curs];
XSetForeground(bx_x_display, gc, col_vals[DEV_vga_get_actl_pal_idx(new_text[curs+1] & 0x0f)]);
XSetBackground(bx_x_display, gc, col_vals[DEV_vga_get_actl_pal_idx((new_text[curs+1] & 0xf0) >> 4)]);
- XDrawImageString(bx_x_display, win,
- gc,
- prev_block_cursor_x * font_width,
- prev_block_cursor_y * font_height + font_info->max_bounds.ascent + bx_headerbar_y,
- (char *) string,
- 1);
- }
+
+ XCopyPlane(bx_x_display, vgafont[c], win, gc, 0, 0, font_width, font_height,
+ prev_block_cursor_x * font_width, prev_block_cursor_y * font_height + bx_headerbar_y, 1);
+ }
for (i=0; i<nchars*2; i+=2) {
if ( (old_text[i]!=new_text[i]) ||
(old_text[i+1]!=new_text[i+1]) ) {
- string[0] = new_text[i];
- if (string[0] == 0) string[0] = ' '; // convert null to space
+ c = new_text[i];
new_foreground = new_text[i+1] & 0x0f;
new_background = (new_text[i+1] & 0xf0) >> 4;
XSetForeground(bx_x_display, gc, col_vals[DEV_vga_get_actl_pal_idx(new_foreground)]);
XSetBackground(bx_x_display, gc, col_vals[DEV_vga_get_actl_pal_idx(new_background)]);
-//XSetForeground(bx_x_display, gc, white_pixel);
-//XSetBackground(bx_x_display, gc, black_pixel);
-
x = (i/2) % columns;
y = (i/2) / columns;
- XDrawImageString(bx_x_display, win,
- gc,
- x * font_width,
- y * font_height + font_info->max_bounds.ascent + bx_headerbar_y,
- (char *) string,
- 1);
+ XCopyPlane(bx_x_display, vgafont[c], win, gc, 0, 0, font_width, font_height,
+ x * font_width, y * font_height + bx_headerbar_y, 1);
}
}