From c465e05a03209651078b95686158648fd7ed84c5 Mon Sep 17 00:00:00 2001 From: "Antonino A. Daplas" Date: Mon, 7 Nov 2005 01:00:35 -0800 Subject: [PATCH] fbcon/fbdev: Move softcursor out of fbdev to fbcon According to Jon Smirl, filling in the field fb_cursor with soft_cursor for drivers that do not support hardware cursors is redundant. The soft_cursor function is usable by all drivers because it is just a wrapper around fb_imageblit. And because soft_cursor is an fbcon-specific hook, the file is moved to the console directory. Thus, drivers that do not support hardware cursors can leave the fb_cursor field blank. For drivers that do, they can fill up this field with their own version. The end result is a smaller code size. And if the framebuffer console is not loaded, module/kernel size is also reduced because the soft_cursor module will also not be loaded. Signed-off-by: Antonino Daplas Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/video/console/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/video/console/Makefile') diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index 42c7b8dcd22..71b4b626e32 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -26,7 +26,7 @@ obj-$(CONFIG_PROM_CONSOLE) += promcon.o promcon_tbl.o obj-$(CONFIG_STI_CONSOLE) += sticon.o sticore.o font.o obj-$(CONFIG_VGA_CONSOLE) += vgacon.o obj-$(CONFIG_MDA_CONSOLE) += mdacon.o -obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o +obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o softcursor.o ifeq ($(CONFIG_FB_TILEBLITTING),y) obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += tileblit.o endif -- cgit v1.2.3-70-g09d2 From 998e6d51162707685336ff99c029c8911b270d32 Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Mon, 7 Nov 2005 01:00:52 -0800 Subject: [PATCH] fbcon: Add rl (Roman Large) font I converted the "rl" console font from the kbd utility to be a built-in font for the framebuffer console, and I was wondering if you would be OK with including it. I've generated a font_rl.c file and related minor modifications. I find it's the most visually appealing of the kbd fonts which is why I use it and selected it for conversion. I believe the font is GPL'd. Signed-off-by: Antonino Daplas Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/video/console/Kconfig | 7 + drivers/video/console/Makefile | 1 + drivers/video/console/font_rl.c | 4374 +++++++++++++++++++++++++++++++++++++++ drivers/video/console/fonts.c | 4 + include/linux/font.h | 2 + 5 files changed, 4388 insertions(+) create mode 100644 drivers/video/console/font_rl.c (limited to 'drivers/video/console/Makefile') diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 81d44995f9e..fadf7c5d216 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -205,5 +205,12 @@ config FONT_10x18 big letters. It fits between the sun 12x22 and the normal 8x16 font. If other fonts are too big or too small for you, say Y, otherwise say N. +config FONT_RL + bool "console Roman Large 8x16 font" if FONTS + depends on FRAMEBUFFER_CONSOLE + help + This is the visually-appealing "RL" console font that is + included with the kbd package. + endmenu diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index 71b4b626e32..5222628accc 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -15,6 +15,7 @@ font-objs-$(CONFIG_FONT_10x18) += font_10x18.o font-objs-$(CONFIG_FONT_PEARL_8x8) += font_pearl_8x8.o font-objs-$(CONFIG_FONT_ACORN_8x8) += font_acorn_8x8.o font-objs-$(CONFIG_FONT_MINI_4x6) += font_mini_4x6.o +font-objs-$(CONFIG_FONT_RL) += font_rl.o font-objs += $(font-objs-y) diff --git a/drivers/video/console/font_rl.c b/drivers/video/console/font_rl.c new file mode 100644 index 00000000000..dfecc27d8de --- /dev/null +++ b/drivers/video/console/font_rl.c @@ -0,0 +1,4374 @@ + +/* This font is simply the "rl.fnt" console font from the kbd utility. + * Converted by Zack T Smith, fbui@comcast.net. + * The original binary file is covered under the GNU Public License. + */ + +#include + +#define FONTDATAMAX 4096 + +static unsigned char patterns[4096] = { +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x3c, +0x42, +0x81, +0xe7, +0xa5, +0x99, +0x81, +0x81, +0x99, +0x42, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x3c, +0x7e, +0xff, +0x99, +0xdb, +0xe7, +0xff, +0xff, +0xe7, +0x7e, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x6c, +0xfe, +0xfe, +0xfe, +0xfe, +0xfe, +0x7c, +0x38, +0x10, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x10, +0x38, +0x7c, +0xfe, +0x7c, +0x38, +0x10, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x38, +0x38, +0x10, +0xd6, +0xfe, +0xd6, +0x10, +0x10, +0x38, +0x7c, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x10, +0x38, +0x7c, +0xfe, +0xfe, +0x54, +0x10, +0x10, +0x38, +0x7c, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x18, +0x3c, +0x3c, +0x18, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xe7, +0xc3, +0xc3, +0xe7, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x3c, +0x66, +0x42, +0x42, +0x66, +0x3c, +0x00, +0x00, +0x00, +0x00, +0x00, + +0xff, +0xff, +0xff, +0xff, +0xff, +0xc3, +0x99, +0xbd, +0xbd, +0x99, +0xc3, +0xff, +0xff, +0xff, +0xff, +0xff, + +0x00, +0x00, +0x0f, +0x07, +0x0d, +0x18, +0x78, +0xcc, +0xcc, +0xcc, +0xcc, +0x78, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x3c, +0x66, +0x66, +0x66, +0x3c, +0x18, +0x7e, +0x18, +0x18, +0x18, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x08, +0x0c, +0x0a, +0x0a, +0x0a, +0x08, +0x08, +0x08, +0x38, +0x78, +0x30, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x10, +0x18, +0x1c, +0x1e, +0x1e, +0x16, +0x12, +0x72, +0xf2, +0x62, +0x0e, +0x1e, +0x0c, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x10, +0x92, +0x54, +0x38, +0xfe, +0x38, +0x54, +0x92, +0x10, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x80, +0xc0, +0xe0, +0xb8, +0x8e, +0xb8, +0xe0, +0xc0, +0x80, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x02, +0x06, +0x0e, +0x3a, +0xe2, +0x3a, +0x0e, +0x06, +0x02, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x10, +0x38, +0x7c, +0xd6, +0x10, +0x10, +0x10, +0x10, +0xd6, +0x7c, +0x38, +0x10, +0x00, +0x00, + +0x00, +0x42, +0xe7, +0xe7, +0xe7, +0xe7, +0x42, +0x42, +0x42, +0x00, +0x66, +0x66, +0x66, +0x00, +0x00, +0x00, + +0x00, +0x7f, +0xca, +0xca, +0xca, +0xca, +0x7a, +0x0a, +0x0a, +0x0a, +0x0a, +0x0a, +0x1b, +0x00, +0x00, +0x00, + +0x00, +0x1e, +0x31, +0x78, +0xcc, +0xc6, +0xc3, +0x63, +0x33, +0x1e, +0x8c, +0x78, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xfe, +0xfe, +0xfe, +0xfe, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x10, +0x38, +0x7c, +0xd6, +0x10, +0x10, +0x10, +0x10, +0xd6, +0x7c, +0x38, +0x10, +0xfe, +0x00, + +0x00, +0x00, +0x10, +0x38, +0x7c, +0xd6, +0x10, +0x10, +0x10, +0x10, +0x10, +0x10, +0x10, +0x10, +0x00, +0x00, + +0x00, +0x00, +0x10, +0x10, +0x10, +0x10, +0x10, +0x10, +0x10, +0x10, +0xd6, +0x7c, +0x38, +0x10, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x08, +0x0c, +0x06, +0xff, +0x06, +0x0c, +0x08, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x10, +0x30, +0x60, +0xff, +0x60, +0x30, +0x10, +0x00, +0x00, +0x00, +0x00, + +0x22, +0x44, +0x88, +0xcc, +0xee, +0x44, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x24, +0x42, +0xff, +0x42, +0x24, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x10, +0x38, +0x38, +0x6c, +0x6c, +0xc6, +0xfe, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0xfe, +0xc6, +0x6c, +0x6c, +0x38, +0x38, +0x10, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x18, +0x3c, +0x3c, +0x3c, +0x3c, +0x18, +0x18, +0x18, +0x10, +0x00, +0x18, +0x18, +0x00, +0x00, +0x00, + +0x22, +0x77, +0x33, +0x11, +0x22, +0x44, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x12, +0x12, +0x12, +0x7f, +0x24, +0x24, +0x24, +0xfe, +0x48, +0x48, +0x48, +0x00, +0x00, +0x00, + +0x10, +0x10, +0x7c, +0xd2, +0xd0, +0xd0, +0xd0, +0x7c, +0x16, +0x16, +0x16, +0x96, +0x7c, +0x10, +0x10, +0x00, + +0x00, +0x42, +0xbe, +0x44, +0x0c, +0x08, +0x18, +0x10, +0x30, +0x20, +0x64, +0x4a, +0xc4, +0x00, +0x00, +0x00, + +0x00, +0x38, +0x6c, +0x6c, +0x6c, +0x38, +0x37, +0x72, +0xdc, +0xcc, +0xcc, +0xcc, +0x77, +0x00, +0x00, +0x00, + +0x10, +0x38, +0x18, +0x08, +0x10, +0x20, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x04, +0x08, +0x10, +0x10, +0x30, +0x30, +0x30, +0x30, +0x30, +0x10, +0x10, +0x08, +0x04, +0x00, +0x00, + +0x00, +0x20, +0x10, +0x08, +0x08, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x08, +0x08, +0x10, +0x20, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x44, +0x28, +0x38, +0xfe, +0x38, +0x28, +0x44, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x18, +0x18, +0x7e, +0x18, +0x18, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x10, +0x38, +0x18, +0x08, +0x10, +0x20, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x7e, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x10, +0x38, +0x10, +0x00, +0x00, +0x00, + +0x00, +0x06, +0x06, +0x0c, +0x0c, +0x18, +0x18, +0x30, +0x30, +0x60, +0x60, +0xc0, +0xc0, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x3c, +0x46, +0xc6, +0xc6, +0xc6, +0xc6, +0xc6, +0xc4, +0x78, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x08, +0x18, +0x78, +0x18, +0x18, +0x18, +0x18, +0x18, +0x7e, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x7c, +0x86, +0x06, +0x0c, +0x18, +0x20, +0x40, +0xc1, +0xfe, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x3c, +0x46, +0x04, +0x08, +0x1c, +0x06, +0x06, +0x06, +0x06, +0x0c, +0x70, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x04, +0x08, +0x10, +0x2c, +0x4c, +0x8c, +0x8c, +0xfe, +0x0c, +0x0c, +0x0c, +0x00, + +0x00, +0x00, +0x00, +0x02, +0x3c, +0x20, +0x20, +0x70, +0x0c, +0x06, +0x06, +0x06, +0x06, +0x0c, +0x70, +0x00, + +0x00, +0x00, +0x18, +0x20, +0x40, +0xc0, +0xdc, +0xc6, +0xc6, +0xc6, +0xc6, +0x44, +0x38, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x40, +0x7e, +0x82, +0x06, +0x04, +0x0c, +0x18, +0x18, +0x30, +0x30, +0x30, +0x30, +0x00, + +0x00, +0x00, +0x7c, +0xc6, +0xc6, +0x64, +0x38, +0x4c, +0xc6, +0xc6, +0xc6, +0xc6, +0x7c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x38, +0x44, +0xc6, +0xc6, +0x76, +0x06, +0x06, +0x06, +0x04, +0x08, +0x30, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x10, +0x38, +0x10, +0x00, +0x00, +0x00, +0x10, +0x38, +0x10, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x10, +0x38, +0x10, +0x00, +0x00, +0x00, +0x10, +0x38, +0x18, +0x08, +0x10, +0x20, + +0x00, +0x06, +0x0c, +0x18, +0x30, +0x60, +0xa0, +0xa0, +0x60, +0x30, +0x18, +0x0c, +0x06, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x7e, +0x00, +0x00, +0x7e, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x60, +0x30, +0x18, +0x0c, +0x06, +0x05, +0x05, +0x06, +0x0c, +0x18, +0x30, +0x60, +0x00, +0x00, +0x00, + +0x00, +0x7c, +0x86, +0xc6, +0x06, +0x04, +0x08, +0x10, +0x10, +0x18, +0x00, +0x18, +0x18, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x3c, +0x46, +0xc6, +0xce, +0xd6, +0xd6, +0xd6, +0xdc, +0xc0, +0xc4, +0x78, +0x00, +0x00, +0x00, + +0x00, +0x18, +0x18, +0x18, +0x3c, +0x2c, +0x2c, +0x2c, +0x7e, +0x46, +0x46, +0x46, +0xef, +0x00, +0x00, +0x00, + +0x00, +0xfc, +0x66, +0x66, +0x66, +0x66, +0x7c, +0x66, +0x66, +0x66, +0x66, +0x66, +0xfc, +0x00, +0x00, +0x00, + +0x00, +0x3a, +0x66, +0xc2, +0xc0, +0xc0, +0xc0, +0xc0, +0xc0, +0xc0, +0xc0, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0xfc, +0x66, +0x63, +0x63, +0x63, +0x63, +0x63, +0x63, +0x63, +0x63, +0x66, +0xfc, +0x00, +0x00, +0x00, + +0x00, +0xff, +0x61, +0x60, +0x60, +0x64, +0x7c, +0x64, +0x60, +0x60, +0x60, +0x61, +0xfe, +0x00, +0x00, +0x00, + +0x00, +0xff, +0x61, +0x61, +0x60, +0x64, +0x7c, +0x64, +0x60, +0x60, +0x60, +0x60, +0xf0, +0x00, +0x00, +0x00, + +0x00, +0x3a, +0x66, +0xc2, +0xc0, +0xc0, +0xc0, +0xcf, +0xc6, +0xc6, +0xc6, +0x66, +0x38, +0x00, +0x00, +0x00, + +0x00, +0xf7, +0x62, +0x62, +0x62, +0x62, +0x7e, +0x62, +0x62, +0x62, +0x62, +0x62, +0xf7, +0x00, +0x00, +0x00, + +0x00, +0x3c, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x1e, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x08, +0xf0, + +0x00, +0xf7, +0x64, +0x6c, +0x68, +0x68, +0x78, +0x6c, +0x6c, +0x6c, +0x66, +0x66, +0xf7, +0x00, +0x00, +0x00, + +0x00, +0xf8, +0x60, +0x60, +0x60, +0x60, +0x60, +0x60, +0x60, +0x60, +0x60, +0x61, +0xfe, +0x00, +0x00, +0x00, + +0x00, +0xc3, +0x66, +0x76, +0x7e, +0x56, +0x56, +0x46, +0x46, +0x46, +0x46, +0x46, +0xef, +0x00, +0x00, +0x00, + +0x00, +0xe7, +0x62, +0x62, +0x72, +0x52, +0x5a, +0x4a, +0x4e, +0x46, +0x46, +0x42, +0xe2, +0x00, +0x00, +0x00, + +0x00, +0x3c, +0x66, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0x66, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0xfc, +0x66, +0x66, +0x66, +0x66, +0x6c, +0x60, +0x60, +0x60, +0x60, +0x60, +0xf0, +0x00, +0x00, +0x00, + +0x00, +0x3c, +0x66, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0x66, +0x3c, +0x10, +0x39, +0x0e, + +0x00, +0xfc, +0x66, +0x66, +0x66, +0x66, +0x7c, +0x6c, +0x66, +0x66, +0x66, +0x66, +0xf3, +0x00, +0x00, +0x00, + +0x00, +0x7a, +0xc6, +0xc2, +0xc0, +0x70, +0x3c, +0x0e, +0x06, +0x06, +0x86, +0xc6, +0xbc, +0x00, +0x00, +0x00, + +0x00, +0xff, +0x99, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0xf7, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0xf7, +0x62, +0x62, +0x62, +0x76, +0x34, +0x34, +0x34, +0x3c, +0x18, +0x18, +0x18, +0x00, +0x00, +0x00, + +0x00, +0xf7, +0x62, +0x62, +0x62, +0x62, +0x6a, +0x6a, +0x6a, +0x6a, +0x7e, +0x7e, +0x34, +0x00, +0x00, +0x00, + +0x00, +0xf7, +0x62, +0x62, +0x34, +0x34, +0x18, +0x18, +0x2c, +0x2c, +0x46, +0x46, +0xef, +0x00, +0x00, +0x00, + +0x00, +0xf7, +0x62, +0x62, +0x62, +0x34, +0x34, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x7f, +0x46, +0x86, +0x0c, +0x0c, +0x18, +0x18, +0x30, +0x30, +0x61, +0x62, +0xfe, +0x00, +0x00, +0x00, + +0x00, +0x3c, +0x30, +0x30, +0x30, +0x30, +0x30, +0x30, +0x30, +0x30, +0x30, +0x30, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0xc0, +0xc0, +0x60, +0x60, +0x30, +0x30, +0x18, +0x18, +0x0c, +0x0c, +0x06, +0x06, +0x00, +0x00, +0x00, + +0x00, +0x3c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x10, +0x38, +0x4c, +0x86, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xff, +0x00, +0x00, + +0x00, +0x18, +0x20, +0x30, +0x38, +0x10, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x78, +0x8c, +0x0c, +0x3c, +0xcc, +0xcc, +0xcd, +0x76, +0x00, +0x00, +0x00, + +0x00, +0x20, +0xe0, +0x60, +0x60, +0x6c, +0x76, +0x66, +0x66, +0x66, +0x66, +0x76, +0x6c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x3c, +0x66, +0x60, +0x60, +0x60, +0x60, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x04, +0x1c, +0x0c, +0x0c, +0x6c, +0xdc, +0xcc, +0xcc, +0xcc, +0xcc, +0xdc, +0x66, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x3c, +0x66, +0x7e, +0x60, +0x60, +0x60, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x1e, +0x31, +0x33, +0x30, +0x30, +0x78, +0x30, +0x30, +0x30, +0x30, +0x30, +0x78, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x7b, +0xce, +0xcc, +0xcc, +0xcc, +0x78, +0x60, +0x7c, +0x86, +0xc6, +0x7c, + +0x00, +0x20, +0xe0, +0x60, +0x60, +0x6c, +0x76, +0x66, +0x66, +0x66, +0x66, +0x66, +0xf7, +0x00, +0x00, +0x00, + +0x00, +0x10, +0x38, +0x10, +0x00, +0x18, +0x38, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x08, +0x1c, +0x08, +0x00, +0x0c, +0x1c, +0x0c, +0x0c, +0x0c, +0x0c, +0x0c, +0x6c, +0x4c, +0x38, +0x00, + +0x00, +0x20, +0xe0, +0x60, +0x60, +0x67, +0x66, +0x6c, +0x78, +0x6c, +0x6c, +0x66, +0xe7, +0x00, +0x00, +0x00, + +0x00, +0x08, +0x38, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x6a, +0xfe, +0x6a, +0x6a, +0x6a, +0x62, +0x62, +0xf7, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x5c, +0xf6, +0x66, +0x66, +0x66, +0x66, +0x66, +0xf7, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x3c, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x5c, +0xe6, +0x66, +0x66, +0x66, +0x66, +0x66, +0x7c, +0x60, +0x60, +0xf0, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x76, +0xcc, +0xcc, +0xcc, +0xcc, +0xcc, +0xcc, +0x7c, +0x0c, +0x0c, +0x1e, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x5e, +0xf6, +0x60, +0x60, +0x60, +0x60, +0x60, +0xf0, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x7a, +0xc6, +0x72, +0x1c, +0x06, +0x86, +0xc6, +0xbc, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x10, +0x30, +0x7c, +0x30, +0x30, +0x30, +0x30, +0x30, +0x34, +0x18, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0xee, +0x66, +0x66, +0x66, +0x66, +0x66, +0x67, +0x3a, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0xf7, +0x62, +0x76, +0x34, +0x34, +0x3c, +0x18, +0x18, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0xf7, +0x62, +0x6a, +0x6a, +0x6a, +0x6a, +0x7e, +0x24, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0xf7, +0x62, +0x34, +0x18, +0x2c, +0x46, +0x46, +0xef, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0xf7, +0x62, +0x62, +0x34, +0x34, +0x18, +0x18, +0x18, +0x10, +0xb0, +0xe0, + +0x00, +0x00, +0x00, +0x00, +0x00, +0xfe, +0x8c, +0x18, +0x30, +0x30, +0x60, +0xc2, +0xfe, +0x00, +0x00, +0x00, + +0x00, +0x0e, +0x18, +0x10, +0x10, +0x08, +0x70, +0x70, +0x08, +0x10, +0x10, +0x18, +0x0e, +0x00, +0x00, +0x00, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x00, +0x00, + +0x00, +0x70, +0x18, +0x08, +0x08, +0x10, +0x0e, +0x0e, +0x10, +0x08, +0x08, +0x18, +0x70, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x76, +0xdc, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x10, +0x38, +0x6c, +0xc6, +0xc6, +0xc6, +0xfe, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x3a, +0x66, +0xc2, +0xc0, +0xc0, +0xc0, +0xc0, +0xc0, +0x62, +0x3c, +0x18, +0x0c, +0x24, +0x18, + +0x00, +0x00, +0x66, +0x00, +0x00, +0xee, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x3b, +0x00, +0x00, +0x00, + +0x00, +0x0c, +0x18, +0x20, +0x00, +0x3c, +0x66, +0x7e, +0x60, +0x60, +0x60, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x30, +0x58, +0x8c, +0x00, +0x78, +0x8c, +0x0c, +0x3c, +0xcc, +0xcc, +0xcd, +0x76, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x66, +0x00, +0x00, +0x78, +0x8c, +0x0c, +0x3c, +0xcc, +0xcc, +0xcd, +0x76, +0x00, +0x00, +0x00, + +0x00, +0x30, +0x18, +0x04, +0x00, +0x78, +0x8c, +0x0c, +0x3c, +0xcc, +0xcc, +0xcd, +0x76, +0x00, +0x00, +0x00, + +0x38, +0x44, +0x44, +0x38, +0x00, +0x78, +0x8c, +0x0c, +0x3c, +0xcc, +0xcc, +0xcd, +0x76, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x3c, +0x66, +0x60, +0x60, +0x60, +0x60, +0x62, +0x3c, +0x08, +0x24, +0x18, + +0x00, +0x18, +0x2c, +0x46, +0x00, +0x3c, +0x66, +0x7e, +0x60, +0x60, +0x60, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x66, +0x00, +0x00, +0x3c, +0x66, +0x7e, +0x60, +0x60, +0x60, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x30, +0x18, +0x04, +0x00, +0x3c, +0x66, +0x7e, +0x60, +0x60, +0x60, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x66, +0x00, +0x00, +0x38, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x18, +0x2c, +0x46, +0x00, +0x38, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x60, +0x30, +0x08, +0x00, +0x38, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x66, +0x18, +0x18, +0x18, +0x3c, +0x2c, +0x2c, +0x2c, +0x7e, +0x46, +0x46, +0x46, +0xef, +0x00, +0x00, +0x00, + +0x18, +0x24, +0x18, +0x18, +0x3c, +0x2c, +0x2c, +0x2c, +0x7e, +0x46, +0x46, +0x46, +0xef, +0x00, +0x00, +0x00, + +0x0c, +0x18, +0xff, +0x61, +0x60, +0x60, +0x64, +0x7c, +0x64, +0x60, +0x60, +0x61, +0xfe, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x76, +0x9b, +0x1b, +0x3f, +0xd8, +0xd8, +0xd9, +0x6e, +0x00, +0x00, +0x00, + +0x00, +0x1f, +0x1d, +0x1d, +0x3c, +0x2c, +0x2e, +0x2c, +0x7c, +0x4c, +0x4c, +0x4d, +0xef, +0x00, +0x00, +0x00, + +0x00, +0x18, +0x2c, +0x46, +0x00, +0x3c, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x66, +0x00, +0x00, +0x3c, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x30, +0x18, +0x04, +0x00, +0x3c, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x18, +0x2c, +0x46, +0x00, +0xee, +0x66, +0x66, +0x66, +0x66, +0x66, +0x67, +0x3a, +0x00, +0x00, +0x00, + +0x00, +0x30, +0x18, +0x04, +0x00, +0xee, +0x66, +0x66, +0x66, +0x66, +0x66, +0x67, +0x3a, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x66, +0x00, +0x00, +0xf7, +0x62, +0x62, +0x34, +0x34, +0x18, +0x18, +0x18, +0x10, +0xb0, +0xe0, + +0x66, +0x00, +0x3c, +0x66, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0x66, +0x3c, +0x00, +0x00, +0x00, + +0x66, +0x00, +0xf7, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x62, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x10, +0x10, +0x10, +0x7c, +0xc6, +0xc0, +0xc0, +0xc0, +0xc0, +0xc2, +0x7c, +0x10, +0x10, +0x00, + +0x00, +0x38, +0x64, +0x6c, +0x60, +0x60, +0xf0, +0x60, +0x60, +0x60, +0x60, +0x66, +0xfc, +0x00, +0x00, +0x00, + +0x00, +0x81, +0xc3, +0x66, +0x3c, +0x18, +0xff, +0x18, +0x18, +0xff, +0x18, +0x18, +0x18, +0x00, +0x00, +0x00, + +0x00, +0xfe, +0x63, +0x63, +0x63, +0x63, +0x6e, +0x60, +0x64, +0x6e, +0x64, +0x64, +0xf5, +0x06, +0x00, +0x00, + +0x00, +0x0e, +0x19, +0x1b, +0x18, +0x18, +0x3c, +0x18, +0x18, +0x18, +0x18, +0xd8, +0x98, +0x70, +0x00, +0x00, + +0x00, +0x0c, +0x18, +0x20, +0x00, +0x78, +0x8c, +0x0c, +0x3c, +0xcc, +0xcc, +0xcd, +0x76, +0x00, +0x00, +0x00, + +0x00, +0x06, +0x0c, +0x10, +0x00, +0x38, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x0c, +0x18, +0x20, +0x00, +0x3c, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x0c, +0x18, +0x20, +0x00, +0xee, +0x66, +0x66, +0x66, +0x66, +0x66, +0x67, +0x3a, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x32, +0x4c, +0x00, +0x5c, +0xf6, +0x66, +0x66, +0x66, +0x66, +0x66, +0xf7, +0x00, +0x00, +0x00, + +0x32, +0x4c, +0x00, +0xe7, +0x72, +0x52, +0x5a, +0x4a, +0x4e, +0x46, +0x46, +0x42, +0xe2, +0x00, +0x00, +0x00, + +0x00, +0x78, +0x8c, +0x0c, +0x3c, +0xcc, +0xcc, +0xcd, +0x76, +0x00, +0xfe, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x3c, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x3c, +0x00, +0x7e, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x30, +0x30, +0x00, +0x30, +0x10, +0x10, +0x20, +0x40, +0xc0, +0xc6, +0xc2, +0x7c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xfe, +0xc0, +0xc0, +0xc0, +0xc0, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xfe, +0x06, +0x06, +0x06, +0x06, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x20, +0xe0, +0x63, +0x66, +0xfc, +0x18, +0x30, +0x60, +0xce, +0x93, +0x06, +0x0c, +0x1f, +0x00, +0x00, + +0x00, +0x20, +0xe0, +0x63, +0x66, +0xfc, +0x18, +0x30, +0x64, +0xc8, +0x96, +0x3f, +0x06, +0x06, +0x00, +0x00, + +0x00, +0x18, +0x18, +0x00, +0x08, +0x18, +0x18, +0x18, +0x3c, +0x3c, +0x3c, +0x3c, +0x18, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x36, +0x6c, +0xd8, +0xd8, +0x6c, +0x36, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0xd8, +0x6c, +0x36, +0x36, +0x6c, +0xd8, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x82, +0x10, +0x82, +0x10, +0x82, +0x10, +0x82, +0x10, +0x82, +0x10, +0x82, +0x10, +0x82, +0x10, +0x82, +0x10, + +0x00, +0x95, +0x00, +0xa9, +0x00, +0x95, +0x00, +0xa9, +0x00, +0x95, +0x00, +0xa9, +0x00, +0x95, +0x00, +0xa9, + +0x92, +0x49, +0x92, +0x49, +0x92, +0x49, +0x92, +0x49, +0x92, +0x49, +0x92, +0x49, +0x92, +0x49, +0x92, +0x49, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xf8, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xf8, +0x18, +0x18, +0xf8, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0xe6, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xfe, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xf8, +0x18, +0x18, +0xf8, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0xe6, +0x06, +0x06, +0xe6, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xfe, +0x06, +0x06, +0xe6, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0xe6, +0x06, +0x06, +0xfe, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0xfe, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xf8, +0x18, +0x18, +0xf8, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xf8, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x1f, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xff, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xff, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x1f, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xff, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xff, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x1f, +0x18, +0x18, +0x1f, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x67, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x67, +0x60, +0x60, +0x7f, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x7f, +0x60, +0x60, +0x67, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0xe7, +0x00, +0x00, +0xff, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xff, +0x00, +0x00, +0xe7, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x67, +0x60, +0x60, +0x67, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xff, +0x00, +0x00, +0xff, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0xe7, +0x00, +0x00, +0xe7, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xff, +0x00, +0x00, +0xff, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0xff, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xff, +0x00, +0x00, +0xff, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xff, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x7f, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x1f, +0x18, +0x18, +0x1f, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x1f, +0x18, +0x18, +0x1f, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x7f, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0xff, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, +0x66, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xff, +0x00, +0x00, +0xff, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xf8, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x1f, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, + +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, +0xf0, + +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, +0x0f, + +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x77, +0xcc, +0xcc, +0xcc, +0xcc, +0xde, +0x73, +0x00, +0x00, +0x00, + +0x00, +0x7c, +0xc6, +0xc6, +0xc6, +0xc4, +0xc8, +0xc4, +0xc6, +0xc6, +0xc6, +0xc6, +0xdc, +0xc0, +0xc0, +0x00, + +0x00, +0xff, +0x61, +0x60, +0x60, +0x60, +0x60, +0x60, +0x60, +0x60, +0x60, +0x60, +0xf0, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x01, +0x7e, +0xa4, +0x24, +0x2c, +0x6c, +0x6c, +0x6c, +0x48, +0x00, +0x00, +0x00, + +0x00, +0xff, +0xc1, +0x60, +0x30, +0x18, +0x0c, +0x18, +0x30, +0x60, +0xc0, +0xc1, +0xfe, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x7f, +0xc8, +0xc8, +0xc8, +0xc8, +0xc8, +0xc8, +0x70, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x22, +0x66, +0x66, +0x66, +0x66, +0x66, +0x7c, +0x60, +0x60, +0x60, +0xc0, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x76, +0xdc, +0x18, +0x18, +0x18, +0x18, +0x18, +0x10, +0x00, +0x00, +0x00, + +0x00, +0x38, +0x10, +0x7c, +0xd6, +0xd6, +0xd6, +0xd6, +0xd6, +0xd6, +0x7c, +0x10, +0x38, +0x00, +0x00, +0x00, + +0x00, +0x38, +0x6c, +0xc6, +0xc6, +0xc6, +0xfe, +0xc6, +0xc6, +0xc6, +0xc6, +0x6c, +0x38, +0x00, +0x00, +0x00, + +0x00, +0x3c, +0x66, +0xc3, +0xc3, +0xc3, +0xc3, +0xc3, +0x66, +0x24, +0x24, +0xa5, +0xe7, +0x00, +0x00, +0x00, + +0x00, +0x1e, +0x31, +0x30, +0x18, +0x0c, +0x3e, +0x66, +0x66, +0x66, +0x66, +0x66, +0x3c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x6e, +0xff, +0x99, +0x99, +0x99, +0x99, +0xff, +0x76, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x02, +0x04, +0x7c, +0xca, +0x92, +0xa6, +0x7c, +0x40, +0x80, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x1c, +0x30, +0x60, +0x60, +0x60, +0x7c, +0x60, +0x60, +0x60, +0x60, +0x30, +0x1c, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x7c, +0xc6, +0xc6, +0xc6, +0xc6, +0xc6, +0xc6, +0xc6, +0xc6, +0xc6, +0xc6, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0xfe, +0x00, +0x00, +0x00, +0x7c, +0x00, +0x00, +0x00, +0xfe, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x18, +0x18, +0x7e, +0x18, +0x18, +0x00, +0x00, +0x7e, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x30, +0x18, +0x0c, +0x06, +0x0c, +0x18, +0x30, +0x00, +0x7e, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x0c, +0x18, +0x30, +0x60, +0x30, +0x18, +0x0c, +0x00, +0x7e, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x0e, +0x19, +0x1b, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, + +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0x18, +0xd8, +0x98, +0x70, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x18, +0x18, +0x00, +0x7e, +0x00, +0x18, +0x18, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x76, +0xdc, +0x00, +0x00, +0x76, +0xdc, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x38, +0x44, +0x44, +0x44, +0x38, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x18, +0x18, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x18, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x07, +0x06, +0x06, +0x0c, +0x0c, +0x08, +0x98, +0xd0, +0xf0, +0x60, +0x20, +0x00, +0x00, +0x00, + +0x00, +0xcc, +0x76, +0x66, +0x66, +0x66, +0x66, +0xf7, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x70, +0x98, +0x18, +0x30, +0x60, +0x88, +0xf8, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x7c, +0x64, +0x64, +0x64, +0x64, +0x64, +0x7c, +0x00, +0x00, +0x00, +0x00, + +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + +}; + + +const struct font_desc font_rl = { + RL_IDX, + "RomanLarge", + 8, + 16, + patterns, + -1 +}; diff --git a/drivers/video/console/fonts.c b/drivers/video/console/fonts.c index 4fd07d9eca0..9be83bed195 100644 --- a/drivers/video/console/fonts.c +++ b/drivers/video/console/fonts.c @@ -64,6 +64,10 @@ static const struct font_desc *fonts[] = { #undef NO_FONTS &font_mini_4x6, #endif +#ifdef CONFIG_FONT_RL +#undef NO_FONTS + &font_rl, +#endif }; #define num_fonts (sizeof(fonts)/sizeof(*fonts)) diff --git a/include/linux/font.h b/include/linux/font.h index 53b129f07f6..8aac48c37f3 100644 --- a/include/linux/font.h +++ b/include/linux/font.h @@ -31,6 +31,7 @@ struct font_desc { #define SUN12x22_IDX 7 #define ACORN8x8_IDX 8 #define MINI4x6_IDX 9 +#define RL_IDX 10 extern const struct font_desc font_vga_8x8, font_vga_8x16, @@ -41,6 +42,7 @@ extern const struct font_desc font_vga_8x8, font_sun_8x16, font_sun_12x22, font_acorn_8x8, + font_rl, font_mini_4x6; /* Find a font with a specific name */ -- cgit v1.2.3-70-g09d2 From 6cc50e1c5b57180fd37a31282000f43859b0fe73 Mon Sep 17 00:00:00 2001 From: "Antonino A. Daplas" Date: Tue, 8 Nov 2005 21:39:11 -0800 Subject: [PATCH] fbcon: Console Rotation - Add support to rotate font bitmap Add support to rotate the font bitmap. To save on processing time, the entire fontdata will be rotated on a console switch, then stored in a buffer private to fbcon. To further save on processing, the fontdata will only be rotated if the font has changed or if the angle of rotation has changed. Only a single copy of the rotated fontdata will be kept. Signed-off-by: Antonino Daplas Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/video/console/Makefile | 3 + drivers/video/console/fbcon.h | 4 ++ drivers/video/console/fbcon_rotate.c | 105 +++++++++++++++++++++++++++++++++++ drivers/video/console/fbcon_rotate.h | 102 ++++++++++++++++++++++++++++++++++ 4 files changed, 214 insertions(+) create mode 100644 drivers/video/console/fbcon_rotate.c create mode 100644 drivers/video/console/fbcon_rotate.h (limited to 'drivers/video/console/Makefile') diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index 5222628accc..4532bdfa94f 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -31,6 +31,9 @@ obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o softcursor.o ifeq ($(CONFIG_FB_TILEBLITTING),y) obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += tileblit.o endif +ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE_ROTATION),y) +obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon_rotate.o +endif obj-$(CONFIG_FB_STI) += sticore.o font.o diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h index 846a5a4e736..accfd7bd8e9 100644 --- a/drivers/video/console/fbcon.h +++ b/drivers/video/console/fbcon.h @@ -215,7 +215,11 @@ static inline int get_attribute(struct fb_info *info, u16 c) (void) (&_r == &_v); \ (i == FB_ROTATE_UR || i == FB_ROTATE_UD) ? _r : _v; }) +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_ROTATION +extern void fbcon_set_rotate(struct fbcon_ops *ops); +#else #define fbcon_set_rotate(x) do {} while(0) +#endif /* CONFIG_FRAMEBUFFER_CONSOLE_ROTATION */ #endif /* _VIDEO_FBCON_H */ diff --git a/drivers/video/console/fbcon_rotate.c b/drivers/video/console/fbcon_rotate.c new file mode 100644 index 00000000000..6a969318480 --- /dev/null +++ b/drivers/video/console/fbcon_rotate.c @@ -0,0 +1,105 @@ +/* + * linux/drivers/video/console/fbcon_rotate.c -- Software Rotation + * + * Copyright (C) 2005 Antonino Daplas + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "fbcon.h" +#include "fbcon_rotate.h" + +static int fbcon_rotate_font(struct fb_info *info, struct vc_data *vc, + struct display *p) +{ + struct fbcon_ops *ops = info->fbcon_par; + int len, err = 0; + int s_cellsize, d_cellsize, i; + const u8 *src; + u8 *dst; + + if (vc->vc_font.data == ops->fontdata && + p->con_rotate == ops->cur_rotate) + goto finished; + + src = ops->fontdata = vc->vc_font.data; + ops->cur_rotate = p->con_rotate; + len = (!p->userfont) ? 256 : FNTCHARCNT(src); + s_cellsize = ((vc->vc_font.width + 7)/8) * + vc->vc_font.height; + d_cellsize = s_cellsize; + + if (ops->rotate == FB_ROTATE_CW || + ops->rotate == FB_ROTATE_CCW) + d_cellsize = ((vc->vc_font.height + 7)/8) * + vc->vc_font.width; + + if (info->fbops->fb_sync) + info->fbops->fb_sync(info); + + if (ops->fd_size < d_cellsize * len) { + dst = kmalloc(d_cellsize * len, GFP_KERNEL); + + if (dst == NULL) { + err = -ENOMEM; + goto finished; + } + + ops->fd_size = d_cellsize * len; + kfree(ops->fontbuffer); + ops->fontbuffer = dst; + } + + dst = ops->fontbuffer; + memset(dst, 0, ops->fd_size); + + switch (ops->rotate) { + case FB_ROTATE_UD: + for (i = len; i--; ) { + rotate_ud(src, dst, vc->vc_font.width, + vc->vc_font.height); + + src += s_cellsize; + dst += d_cellsize; + } + break; + case FB_ROTATE_CW: + for (i = len; i--; ) { + rotate_cw(src, dst, vc->vc_font.width, + vc->vc_font.height); + src += s_cellsize; + dst += d_cellsize; + } + break; + case FB_ROTATE_CCW: + for (i = len; i--; ) { + rotate_ccw(src, dst, vc->vc_font.width, + vc->vc_font.height); + src += s_cellsize; + dst += d_cellsize; + } + break; + } + +finished: + return err; +} + +void fbcon_set_rotate(struct fbcon_ops *ops) +{ + ops->rotate_font = fbcon_rotate_font; +} +EXPORT_SYMBOL(fbcon_set_rotate); + +MODULE_AUTHOR("Antonino Daplas "); +MODULE_DESCRIPTION("Console Rotation Support"); +MODULE_LICENSE("GPL"); diff --git a/drivers/video/console/fbcon_rotate.h b/drivers/video/console/fbcon_rotate.h new file mode 100644 index 00000000000..6cc27d8e5d4 --- /dev/null +++ b/drivers/video/console/fbcon_rotate.h @@ -0,0 +1,102 @@ +/* + * linux/drivers/video/console/fbcon_rotate.h -- Software Display Rotation + * + * Copyright (C) 2005 Antonino Daplas + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + +#ifndef _FBCON_ROTATE_H +#define _FBCON_ROTATE_H + +#define FNTCHARCNT(fd) (((int *)(fd))[-3]) + +#define GETVYRES(s,i) ({ \ + (s == SCROLL_REDRAW || s == SCROLL_MOVE) ? \ + (i)->var.yres : (i)->var.yres_virtual; }) + +#define GETVXRES(s,i) ({ \ + (s == SCROLL_REDRAW || s == SCROLL_MOVE || !(i)->fix.xpanstep) ? \ + (i)->var.xres : (i)->var.xres_virtual; }) + +/* + * The bitmap is always big endian + */ +#if defined(__LITTLE_ENDIAN) +#define FBCON_BIT(b) (7 - (b)) +#else +#define FBCON_BIT(b) (b) +#endif + +static inline int pattern_test_bit(u32 x, u32 y, u32 pitch, const char *pat) +{ + u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8; + + pat +=index; + return (test_bit(FBCON_BIT(bit), (void *)pat)); +} + +static inline void pattern_set_bit(u32 x, u32 y, u32 pitch, char *pat) +{ + u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8; + + pat += index; + set_bit(FBCON_BIT(bit), (void *)pat); +} + +static inline void rotate_ud(const char *in, char *out, u32 width, u32 height) +{ + int i, j; + int shift = width % 8; + + width = (width + 7) & ~7; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + if (pattern_test_bit(j, i, width, in)) + pattern_set_bit(width - (1 + j + shift), + height - (1 + i), + width, out); + } + + } +} + +static inline void rotate_cw(const char *in, char *out, u32 width, u32 height) +{ + int i, j, h = height, w = width; + int shift = (8 - (height % 8)) & 7; + + width = (width + 7) & ~7; + height = (height + 7) & ~7; + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + if (pattern_test_bit(j, i, width, in)) + pattern_set_bit(height - 1 - i - shift, j, + height, out); + + } + } +} + +static inline void rotate_ccw(const char *in, char *out, u32 width, u32 height) +{ + int i, j, h = height, w = width; + int shift = width % 8; + + width = (width + 7) & ~7; + height = (height + 7) & ~7; + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + if (pattern_test_bit(j, i, width, in)) + pattern_set_bit(i, width - 1 - j - shift, + height, out); + } + } +} + +#endif -- cgit v1.2.3-70-g09d2 From dbcbfe1ea41e404d960a06fa2faf7da568909f33 Mon Sep 17 00:00:00 2001 From: "Antonino A. Daplas" Date: Tue, 8 Nov 2005 21:39:12 -0800 Subject: [PATCH] fbcon: Console Rotation - Add support for 90-degree console rotation Add support for 90-degree (clockwise) rotation of the console. To activate, boot with: fbcon=rotate:1 Signed-off-by: Antonino Daplas Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/video/console/Makefile | 2 +- drivers/video/console/fbcon.c | 13 ++ drivers/video/console/fbcon_cw.c | 412 +++++++++++++++++++++++++++++++++++ drivers/video/console/fbcon_rotate.c | 6 + drivers/video/console/fbcon_rotate.h | 1 + 5 files changed, 433 insertions(+), 1 deletion(-) create mode 100644 drivers/video/console/fbcon_cw.c (limited to 'drivers/video/console/Makefile') diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index 4532bdfa94f..984f8cd3cc6 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -32,7 +32,7 @@ ifeq ($(CONFIG_FB_TILEBLITTING),y) obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += tileblit.o endif ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE_ROTATION),y) -obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon_rotate.o +obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon_rotate.o fbcon_cw.o endif obj-$(CONFIG_FB_STI) += sticore.o font.o diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 26935e231a1..e829ba18e0a 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c @@ -207,12 +207,25 @@ static irqreturn_t fb_vbl_detect(int irq, void *dummy, struct pt_regs *fp) } #endif +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_ROTATION +static inline void fbcon_set_rotation(struct fb_info *info, struct display *p) +{ + struct fbcon_ops *ops = info->fbcon_par; + + if (!(info->flags & FBINFO_MISC_TILEBLITTING) && + p->con_rotate < 4) + ops->rotate = p->con_rotate; + else + ops->rotate = 0; +} +#else static inline void fbcon_set_rotation(struct fb_info *info, struct display *p) { struct fbcon_ops *ops = info->fbcon_par; ops->rotate = FB_ROTATE_UR; } +#endif /* CONFIG_FRAMEBUFFER_CONSOLE_ROTATION */ static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info) { diff --git a/drivers/video/console/fbcon_cw.c b/drivers/video/console/fbcon_cw.c new file mode 100644 index 00000000000..6c6f3b6dd17 --- /dev/null +++ b/drivers/video/console/fbcon_cw.c @@ -0,0 +1,412 @@ +/* + * linux/drivers/video/console/fbcon_ud.c -- Software Rotation - 90 degrees + * + * Copyright (C) 2005 Antonino Daplas + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "fbcon.h" +#include "fbcon_rotate.h" + +/* + * Rotation 90 degrees + */ + +static inline void cw_update_attr(u8 *dst, u8 *src, int attribute, + struct vc_data *vc) +{ + int i, j, offset = (vc->vc_font.height < 10) ? 1 : 2; + int width = (vc->vc_font.height + 7) >> 3; + u8 c, t = 0, msk = ~(0xff >> offset); + + for (i = 0; i < vc->vc_font.width; i++) { + for (j = 0; j < width; j++) { + c = *src; + if (attribute & FBCON_ATTRIBUTE_UNDERLINE && !j) + c |= msk; + if (attribute & FBCON_ATTRIBUTE_BOLD && i) + c |= *(src-width); + if (attribute & FBCON_ATTRIBUTE_REVERSE) + c = ~c; + src++; + *dst++ = c; + t = c; + } + } +} + + +static void cw_bmove(struct vc_data *vc, struct fb_info *info, int sy, + int sx, int dy, int dx, int height, int width) +{ + struct display *p = &fb_display[vc->vc_num]; + struct fb_copyarea area; + u32 vxres = GETVXRES(p->scrollmode, info); + + area.sx = vxres - ((sy + height) * vc->vc_font.height); + area.sy = sx * vc->vc_font.width; + area.dx = vxres - ((dy + height) * vc->vc_font.height); + area.dy = dx * vc->vc_font.width; + area.width = height * vc->vc_font.height; + area.height = width * vc->vc_font.width; + + info->fbops->fb_copyarea(info, &area); +} + +static void cw_clear(struct vc_data *vc, struct fb_info *info, int sy, + int sx, int height, int width) +{ + struct display *p = &fb_display[vc->vc_num]; + struct fb_fillrect region; + int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; + u32 vxres = GETVXRES(p->scrollmode, info); + + region.color = attr_bgcol_ec(bgshift,vc); + region.dx = vxres - ((sy + height) * vc->vc_font.height); + region.dy = sx * vc->vc_font.width; + region.height = width * vc->vc_font.width; + region.width = height * vc->vc_font.height; + region.rop = ROP_COPY; + + info->fbops->fb_fillrect(info, ®ion); +} + +static inline void cw_putcs_aligned(struct vc_data *vc, struct fb_info *info, + const u16 *s, u32 attr, u32 cnt, + u32 d_pitch, u32 s_pitch, u32 cellsize, + struct fb_image *image, u8 *buf, u8 *dst) +{ + struct fbcon_ops *ops = info->fbcon_par; + u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + u32 idx = (vc->vc_font.height + 7) >> 3; + u8 *src; + + while (cnt--) { + src = ops->fontbuffer + (scr_readw(s++) & charmask)*cellsize; + + if (attr) { + cw_update_attr(buf, src, attr, vc); + src = buf; + } + + if (likely(idx == 1)) + __fb_pad_aligned_buffer(dst, d_pitch, src, idx, + vc->vc_font.width); + else + fb_pad_aligned_buffer(dst, d_pitch, src, idx, + vc->vc_font.width); + + dst += d_pitch * vc->vc_font.width; + } + + info->fbops->fb_imageblit(info, image); +} + +static void cw_putcs(struct vc_data *vc, struct fb_info *info, + const unsigned short *s, int count, int yy, int xx, + int fg, int bg) +{ + struct fb_image image; + struct display *p = &fb_display[vc->vc_num]; + struct fbcon_ops *ops = info->fbcon_par; + u32 width = (vc->vc_font.height + 7)/8; + u32 cellsize = width * vc->vc_font.width; + u32 maxcnt = info->pixmap.size/cellsize; + u32 scan_align = info->pixmap.scan_align - 1; + u32 buf_align = info->pixmap.buf_align - 1; + u32 cnt, pitch, size; + u32 attribute = get_attribute(info, scr_readw(s)); + u8 *dst, *buf = NULL; + u32 vxres = GETVXRES(p->scrollmode, info); + + if (!ops->fontbuffer) + return; + + image.fg_color = fg; + image.bg_color = bg; + image.dx = vxres - ((yy + 1) * vc->vc_font.height); + image.dy = xx * vc->vc_font.width; + image.width = vc->vc_font.height; + image.depth = 1; + + if (attribute) { + buf = kmalloc(cellsize, GFP_KERNEL); + if (!buf) + return; + } + + while (count) { + if (count > maxcnt) + cnt = maxcnt; + else + cnt = count; + + image.height = vc->vc_font.width * cnt; + pitch = ((image.width + 7) >> 3) + scan_align; + pitch &= ~scan_align; + size = pitch * image.height + buf_align; + size &= ~buf_align; + dst = fb_get_buffer_offset(info, &info->pixmap, size); + image.data = dst; + cw_putcs_aligned(vc, info, s, attribute, cnt, pitch, + width, cellsize, &image, buf, dst); + image.dy += image.height; + count -= cnt; + s += cnt; + } + + /* buf is always NULL except when in monochrome mode, so in this case + it's a gain to check buf against NULL even though kfree() handles + NULL pointers just fine */ + if (unlikely(buf)) + kfree(buf); + +} + +static void cw_clear_margins(struct vc_data *vc, struct fb_info *info, + int bottom_only) +{ + unsigned int cw = vc->vc_font.width; + unsigned int ch = vc->vc_font.height; + unsigned int rw = info->var.yres - (vc->vc_cols*cw); + unsigned int bh = info->var.xres - (vc->vc_rows*ch); + unsigned int rs = info->var.yres - rw; + struct fb_fillrect region; + int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; + + region.color = attr_bgcol_ec(bgshift,vc); + region.rop = ROP_COPY; + + if (rw && !bottom_only) { + region.dx = 0; + region.dy = info->var.yoffset + rs; + region.height = rw; + region.width = info->var.xres_virtual; + info->fbops->fb_fillrect(info, ®ion); + } + + if (bh) { + region.dx = info->var.xoffset; + region.dy = info->var.yoffset; + region.height = info->var.yres; + region.width = bh; + info->fbops->fb_fillrect(info, ®ion); + } +} + +static void cw_cursor(struct vc_data *vc, struct fb_info *info, + struct display *p, int mode, int softback_lines, + int fg, int bg) +{ + struct fb_cursor cursor; + struct fbcon_ops *ops = (struct fbcon_ops *) info->fbcon_par; + unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + int w = (vc->vc_font.height + 7) >> 3, c; + int y = real_y(p, vc->vc_y); + int attribute, use_sw = (vc->vc_cursor_type & 0x10); + int err = 1, dx, dy; + char *src; + u32 vxres = GETVXRES(p->scrollmode, info); + + if (!ops->fontbuffer) + return; + + cursor.set = 0; + + if (softback_lines) { + if (y + softback_lines >= vc->vc_rows) { + mode = CM_ERASE; + ops->cursor_flash = 0; + return; + } else + y += softback_lines; + } + + c = scr_readw((u16 *) vc->vc_pos); + attribute = get_attribute(info, c); + src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width)); + + if (ops->cursor_state.image.data != src || + ops->cursor_reset) { + ops->cursor_state.image.data = src; + cursor.set |= FB_CUR_SETIMAGE; + } + + if (attribute) { + u8 *dst; + + dst = kmalloc(w * vc->vc_font.width, GFP_ATOMIC); + if (!dst) + return; + kfree(ops->cursor_data); + ops->cursor_data = dst; + cw_update_attr(dst, src, attribute, vc); + src = dst; + } + + if (ops->cursor_state.image.fg_color != fg || + ops->cursor_state.image.bg_color != bg || + ops->cursor_reset) { + ops->cursor_state.image.fg_color = fg; + ops->cursor_state.image.bg_color = bg; + cursor.set |= FB_CUR_SETCMAP; + } + + if (ops->cursor_state.image.height != vc->vc_font.width || + ops->cursor_state.image.width != vc->vc_font.height || + ops->cursor_reset) { + ops->cursor_state.image.height = vc->vc_font.width; + ops->cursor_state.image.width = vc->vc_font.height; + cursor.set |= FB_CUR_SETSIZE; + } + + dx = vxres - ((y * vc->vc_font.height) + vc->vc_font.height); + dy = vc->vc_x * vc->vc_font.width; + + if (ops->cursor_state.image.dx != dx || + ops->cursor_state.image.dy != dy || + ops->cursor_reset) { + ops->cursor_state.image.dx = dx; + ops->cursor_state.image.dy = dy; + cursor.set |= FB_CUR_SETPOS; + } + + if (ops->cursor_state.hot.x || ops->cursor_state.hot.y || + ops->cursor_reset) { + ops->cursor_state.hot.x = cursor.hot.y = 0; + cursor.set |= FB_CUR_SETHOT; + } + + if (cursor.set & FB_CUR_SETSIZE || + vc->vc_cursor_type != p->cursor_shape || + ops->cursor_state.mask == NULL || + ops->cursor_reset) { + char *tmp, *mask = kmalloc(w*vc->vc_font.width, GFP_ATOMIC); + int cur_height, size, i = 0; + int width = (vc->vc_font.width + 7)/8; + + if (!mask) + return; + + tmp = kmalloc(width * vc->vc_font.height, GFP_ATOMIC); + + if (!tmp) { + kfree(mask); + return; + } + + kfree(ops->cursor_state.mask); + ops->cursor_state.mask = mask; + + p->cursor_shape = vc->vc_cursor_type; + cursor.set |= FB_CUR_SETSHAPE; + + switch (p->cursor_shape & CUR_HWMASK) { + case CUR_NONE: + cur_height = 0; + break; + case CUR_UNDERLINE: + cur_height = (vc->vc_font.height < 10) ? 1 : 2; + break; + case CUR_LOWER_THIRD: + cur_height = vc->vc_font.height/3; + break; + case CUR_LOWER_HALF: + cur_height = vc->vc_font.height >> 1; + break; + case CUR_TWO_THIRDS: + cur_height = (vc->vc_font.height << 1)/3; + break; + case CUR_BLOCK: + default: + cur_height = vc->vc_font.height; + break; + } + + size = (vc->vc_font.height - cur_height) * width; + while (size--) + tmp[i++] = 0; + size = cur_height * width; + while (size--) + tmp[i++] = 0xff; + memset(mask, 0, w * vc->vc_font.width); + rotate_cw(tmp, mask, vc->vc_font.width, vc->vc_font.height); + kfree(tmp); + } + + switch (mode) { + case CM_ERASE: + ops->cursor_state.enable = 0; + break; + case CM_DRAW: + case CM_MOVE: + default: + ops->cursor_state.enable = (use_sw) ? 0 : 1; + break; + } + + cursor.image.data = src; + cursor.image.fg_color = ops->cursor_state.image.fg_color; + cursor.image.bg_color = ops->cursor_state.image.bg_color; + cursor.image.dx = ops->cursor_state.image.dx; + cursor.image.dy = ops->cursor_state.image.dy; + cursor.image.height = ops->cursor_state.image.height; + cursor.image.width = ops->cursor_state.image.width; + cursor.hot.x = ops->cursor_state.hot.x; + cursor.hot.y = ops->cursor_state.hot.y; + cursor.mask = ops->cursor_state.mask; + cursor.enable = ops->cursor_state.enable; + cursor.image.depth = 1; + cursor.rop = ROP_XOR; + + if (info->fbops->fb_cursor) + err = info->fbops->fb_cursor(info, &cursor); + + if (err) + soft_cursor(info, &cursor); + + ops->cursor_reset = 0; +} + +int cw_update_start(struct fb_info *info) +{ + struct fbcon_ops *ops = info->fbcon_par; + struct display *p = &fb_display[ops->currcon]; + u32 vxres = GETVXRES(p->scrollmode, info); + u32 xoffset; + int err; + + xoffset = vxres - (info->var.xres + ops->var.yoffset); + ops->var.yoffset = ops->var.xoffset; + ops->var.xoffset = xoffset; + err = fb_pan_display(info, &ops->var); + ops->var.xoffset = info->var.xoffset; + ops->var.yoffset = info->var.yoffset; + ops->var.vmode = info->var.vmode; + return err; +} + +void fbcon_rotate_cw(struct fbcon_ops *ops) +{ + ops->bmove = cw_bmove; + ops->clear = cw_clear; + ops->putcs = cw_putcs; + ops->clear_margins = cw_clear_margins; + ops->cursor = cw_cursor; + ops->update_start = cw_update_start; +} +EXPORT_SYMBOL(fbcon_rotate_cw); + +MODULE_AUTHOR("Antonino Daplas "); +MODULE_DESCRIPTION("Console Rotation (90 degrees) Support"); +MODULE_LICENSE("GPL"); diff --git a/drivers/video/console/fbcon_rotate.c b/drivers/video/console/fbcon_rotate.c index 6a969318480..9df009c8ab4 100644 --- a/drivers/video/console/fbcon_rotate.c +++ b/drivers/video/console/fbcon_rotate.c @@ -97,6 +97,12 @@ finished: void fbcon_set_rotate(struct fbcon_ops *ops) { ops->rotate_font = fbcon_rotate_font; + + switch(ops->rotate) { + case FB_ROTATE_CW: + fbcon_rotate_cw(ops); + break; + } } EXPORT_SYMBOL(fbcon_set_rotate); diff --git a/drivers/video/console/fbcon_rotate.h b/drivers/video/console/fbcon_rotate.h index 6cc27d8e5d4..709e6b49eab 100644 --- a/drivers/video/console/fbcon_rotate.h +++ b/drivers/video/console/fbcon_rotate.h @@ -99,4 +99,5 @@ static inline void rotate_ccw(const char *in, char *out, u32 width, u32 height) } } +extern void fbcon_rotate_cw(struct fbcon_ops *ops); #endif -- cgit v1.2.3-70-g09d2 From 33ee82978c4ecf7cbd56064391c9385264185de2 Mon Sep 17 00:00:00 2001 From: "Antonino A. Daplas" Date: Tue, 8 Nov 2005 21:39:13 -0800 Subject: [PATCH] fbcon: Console Rotation - Add support for 180-degree console rotation Add support for 180-degree (upside down) rotation of the console. To activate, boot with: fbcon=rotate:2 Signed-off-by: Antonino Daplas Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/video/console/Makefile | 2 +- drivers/video/console/fbcon_rotate.c | 3 + drivers/video/console/fbcon_rotate.h | 1 + drivers/video/console/fbcon_ud.c | 454 +++++++++++++++++++++++++++++++++++ 4 files changed, 459 insertions(+), 1 deletion(-) create mode 100644 drivers/video/console/fbcon_ud.c (limited to 'drivers/video/console/Makefile') diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index 984f8cd3cc6..830ff46e0d1 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -32,7 +32,7 @@ ifeq ($(CONFIG_FB_TILEBLITTING),y) obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += tileblit.o endif ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE_ROTATION),y) -obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon_rotate.o fbcon_cw.o +obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon_rotate.o fbcon_cw.o fbcon_ud.o endif obj-$(CONFIG_FB_STI) += sticore.o font.o diff --git a/drivers/video/console/fbcon_rotate.c b/drivers/video/console/fbcon_rotate.c index 9df009c8ab4..3d64ad190ff 100644 --- a/drivers/video/console/fbcon_rotate.c +++ b/drivers/video/console/fbcon_rotate.c @@ -102,6 +102,9 @@ void fbcon_set_rotate(struct fbcon_ops *ops) case FB_ROTATE_CW: fbcon_rotate_cw(ops); break; + case FB_ROTATE_UD: + fbcon_rotate_ud(ops); + break; } } EXPORT_SYMBOL(fbcon_set_rotate); diff --git a/drivers/video/console/fbcon_rotate.h b/drivers/video/console/fbcon_rotate.h index 709e6b49eab..f8ddcd6bd89 100644 --- a/drivers/video/console/fbcon_rotate.h +++ b/drivers/video/console/fbcon_rotate.h @@ -100,4 +100,5 @@ static inline void rotate_ccw(const char *in, char *out, u32 width, u32 height) } extern void fbcon_rotate_cw(struct fbcon_ops *ops); +extern void fbcon_rotate_ud(struct fbcon_ops *ops); #endif diff --git a/drivers/video/console/fbcon_ud.c b/drivers/video/console/fbcon_ud.c new file mode 100644 index 00000000000..2e1d9d4249c --- /dev/null +++ b/drivers/video/console/fbcon_ud.c @@ -0,0 +1,454 @@ +/* + * linux/drivers/video/console/fbcon_ud.c -- Software Rotation - 180 degrees + * + * Copyright (C) 2005 Antonino Daplas + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "fbcon.h" +#include "fbcon_rotate.h" + +/* + * Rotation 180 degrees + */ + +static inline void ud_update_attr(u8 *dst, u8 *src, int attribute, + struct vc_data *vc) +{ + int i, offset = (vc->vc_font.height < 10) ? 1 : 2; + int width = (vc->vc_font.width + 7) >> 3; + unsigned int cellsize = vc->vc_font.height * width; + u8 c; + + offset = offset * width; + + for (i = 0; i < cellsize; i++) { + c = src[i]; + if (attribute & FBCON_ATTRIBUTE_UNDERLINE && i < offset) + c = 0xff; + if (attribute & FBCON_ATTRIBUTE_BOLD) + c |= c << 1; + if (attribute & FBCON_ATTRIBUTE_REVERSE) + c = ~c; + dst[i] = c; + } +} + + +static void ud_bmove(struct vc_data *vc, struct fb_info *info, int sy, + int sx, int dy, int dx, int height, int width) +{ + struct display *p = &fb_display[vc->vc_num]; + struct fb_copyarea area; + u32 vyres = GETVYRES(p->scrollmode, info); + u32 vxres = GETVXRES(p->scrollmode, info); + + area.sy = vyres - ((sy + height) * vc->vc_font.height); + area.sx = vxres - ((sx + width) * vc->vc_font.width); + area.dy = vyres - ((dy + height) * vc->vc_font.height); + area.dx = vxres - ((dx + width) * vc->vc_font.width); + area.height = height * vc->vc_font.height; + area.width = width * vc->vc_font.width; + + info->fbops->fb_copyarea(info, &area); +} + +static void ud_clear(struct vc_data *vc, struct fb_info *info, int sy, + int sx, int height, int width) +{ + struct display *p = &fb_display[vc->vc_num]; + struct fb_fillrect region; + int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; + u32 vyres = GETVYRES(p->scrollmode, info); + u32 vxres = GETVXRES(p->scrollmode, info); + + region.color = attr_bgcol_ec(bgshift,vc); + region.dy = vyres - ((sy + height) * vc->vc_font.height); + region.dx = vxres - ((sx + width) * vc->vc_font.width); + region.width = width * vc->vc_font.width; + region.height = height * vc->vc_font.height; + region.rop = ROP_COPY; + + info->fbops->fb_fillrect(info, ®ion); +} + +static inline void ud_putcs_aligned(struct vc_data *vc, struct fb_info *info, + const u16 *s, u32 attr, u32 cnt, + u32 d_pitch, u32 s_pitch, u32 cellsize, + struct fb_image *image, u8 *buf, u8 *dst) +{ + struct fbcon_ops *ops = info->fbcon_par; + u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + u32 idx = vc->vc_font.width >> 3; + u8 *src; + + while (cnt--) { + src = ops->fontbuffer + (scr_readw(s--) & charmask)*cellsize; + + if (attr) { + ud_update_attr(buf, src, attr, vc); + src = buf; + } + + if (likely(idx == 1)) + __fb_pad_aligned_buffer(dst, d_pitch, src, idx, + image->height); + else + fb_pad_aligned_buffer(dst, d_pitch, src, idx, + image->height); + + dst += s_pitch; + } + + info->fbops->fb_imageblit(info, image); +} + +static inline void ud_putcs_unaligned(struct vc_data *vc, + struct fb_info *info, const u16 *s, + u32 attr, u32 cnt, u32 d_pitch, + u32 s_pitch, u32 cellsize, + struct fb_image *image, u8 *buf, + u8 *dst) +{ + struct fbcon_ops *ops = info->fbcon_par; + u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + u32 shift_low = 0, mod = vc->vc_font.width % 8; + u32 shift_high = 8; + u32 idx = vc->vc_font.width >> 3; + u8 *src; + + while (cnt--) { + src = ops->fontbuffer + (scr_readw(s--) & charmask)*cellsize; + + if (attr) { + ud_update_attr(buf, src, attr, vc); + src = buf; + } + + fb_pad_unaligned_buffer(dst, d_pitch, src, idx, + image->height, shift_high, + shift_low, mod); + shift_low += mod; + dst += (shift_low >= 8) ? s_pitch : s_pitch - 1; + shift_low &= 7; + shift_high = 8 - shift_low; + } + + info->fbops->fb_imageblit(info, image); + +} + +static void ud_putcs(struct vc_data *vc, struct fb_info *info, + const unsigned short *s, int count, int yy, int xx, + int fg, int bg) +{ + struct fb_image image; + struct display *p = &fb_display[vc->vc_num]; + struct fbcon_ops *ops = info->fbcon_par; + u32 width = (vc->vc_font.width + 7)/8; + u32 cellsize = width * vc->vc_font.height; + u32 maxcnt = info->pixmap.size/cellsize; + u32 scan_align = info->pixmap.scan_align - 1; + u32 buf_align = info->pixmap.buf_align - 1; + u32 mod = vc->vc_font.width % 8, cnt, pitch, size; + u32 attribute = get_attribute(info, scr_readw(s)); + u8 *dst, *buf = NULL; + u32 vyres = GETVYRES(p->scrollmode, info); + u32 vxres = GETVXRES(p->scrollmode, info); + + if (!ops->fontbuffer) + return; + + image.fg_color = fg; + image.bg_color = bg; + image.dy = vyres - ((yy * vc->vc_font.height) + vc->vc_font.height); + image.dx = vxres - ((xx + count) * vc->vc_font.width); + image.height = vc->vc_font.height; + image.depth = 1; + + if (attribute) { + buf = kmalloc(cellsize, GFP_KERNEL); + if (!buf) + return; + } + + s += count - 1; + + while (count) { + if (count > maxcnt) + cnt = maxcnt; + else + cnt = count; + + image.width = vc->vc_font.width * cnt; + pitch = ((image.width + 7) >> 3) + scan_align; + pitch &= ~scan_align; + size = pitch * image.height + buf_align; + size &= ~buf_align; + dst = fb_get_buffer_offset(info, &info->pixmap, size); + image.data = dst; + + if (!mod) + ud_putcs_aligned(vc, info, s, attribute, cnt, pitch, + width, cellsize, &image, buf, dst); + else + ud_putcs_unaligned(vc, info, s, attribute, cnt, pitch, + width, cellsize, &image, + buf, dst); + + image.dx += image.width; + count -= cnt; + s -= cnt; + xx += cnt; + } + + /* buf is always NULL except when in monochrome mode, so in this case + it's a gain to check buf against NULL even though kfree() handles + NULL pointers just fine */ + if (unlikely(buf)) + kfree(buf); + +} + +static void ud_clear_margins(struct vc_data *vc, struct fb_info *info, + int bottom_only) +{ + unsigned int cw = vc->vc_font.width; + unsigned int ch = vc->vc_font.height; + unsigned int rw = info->var.xres - (vc->vc_cols*cw); + unsigned int bh = info->var.yres - (vc->vc_rows*ch); + struct fb_fillrect region; + int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; + + region.color = attr_bgcol_ec(bgshift,vc); + region.rop = ROP_COPY; + + if (rw && !bottom_only) { + region.dy = 0; + region.dx = info->var.xoffset; + region.width = rw; + region.height = info->var.yres_virtual; + info->fbops->fb_fillrect(info, ®ion); + } + + if (bh) { + region.dy = info->var.yoffset; + region.dx = info->var.xoffset; + region.height = bh; + region.width = info->var.xres; + info->fbops->fb_fillrect(info, ®ion); + } +} + +static void ud_cursor(struct vc_data *vc, struct fb_info *info, + struct display *p, int mode, int softback_lines, + int fg, int bg) +{ + struct fb_cursor cursor; + struct fbcon_ops *ops = (struct fbcon_ops *) info->fbcon_par; + unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + int w = (vc->vc_font.width + 7) >> 3, c; + int y = real_y(p, vc->vc_y); + int attribute, use_sw = (vc->vc_cursor_type & 0x10); + int err = 1, dx, dy; + char *src; + u32 vyres = GETVYRES(p->scrollmode, info); + u32 vxres = GETVXRES(p->scrollmode, info); + + if (!ops->fontbuffer) + return; + + cursor.set = 0; + + if (softback_lines) { + if (y + softback_lines >= vc->vc_rows) { + mode = CM_ERASE; + ops->cursor_flash = 0; + return; + } else + y += softback_lines; + } + + c = scr_readw((u16 *) vc->vc_pos); + attribute = get_attribute(info, c); + src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.height)); + + if (ops->cursor_state.image.data != src || + ops->cursor_reset) { + ops->cursor_state.image.data = src; + cursor.set |= FB_CUR_SETIMAGE; + } + + if (attribute) { + u8 *dst; + + dst = kmalloc(w * vc->vc_font.height, GFP_ATOMIC); + if (!dst) + return; + kfree(ops->cursor_data); + ops->cursor_data = dst; + ud_update_attr(dst, src, attribute, vc); + src = dst; + } + + if (ops->cursor_state.image.fg_color != fg || + ops->cursor_state.image.bg_color != bg || + ops->cursor_reset) { + ops->cursor_state.image.fg_color = fg; + ops->cursor_state.image.bg_color = bg; + cursor.set |= FB_CUR_SETCMAP; + } + + if (ops->cursor_state.image.height != vc->vc_font.height || + ops->cursor_state.image.width != vc->vc_font.width || + ops->cursor_reset) { + ops->cursor_state.image.height = vc->vc_font.height; + ops->cursor_state.image.width = vc->vc_font.width; + cursor.set |= FB_CUR_SETSIZE; + } + + dy = vyres - ((y * vc->vc_font.height) + vc->vc_font.height); + dx = vxres - ((vc->vc_x * vc->vc_font.width) + vc->vc_font.width); + + if (ops->cursor_state.image.dx != dx || + ops->cursor_state.image.dy != dy || + ops->cursor_reset) { + ops->cursor_state.image.dx = dx; + ops->cursor_state.image.dy = dy; + cursor.set |= FB_CUR_SETPOS; + } + + if (ops->cursor_state.hot.x || ops->cursor_state.hot.y || + ops->cursor_reset) { + ops->cursor_state.hot.x = cursor.hot.y = 0; + cursor.set |= FB_CUR_SETHOT; + } + + if (cursor.set & FB_CUR_SETSIZE || + vc->vc_cursor_type != p->cursor_shape || + ops->cursor_state.mask == NULL || + ops->cursor_reset) { + char *mask = kmalloc(w*vc->vc_font.height, GFP_ATOMIC); + int cur_height, size, i = 0; + u8 msk = 0xff; + + if (!mask) + return; + + kfree(ops->cursor_state.mask); + ops->cursor_state.mask = mask; + + p->cursor_shape = vc->vc_cursor_type; + cursor.set |= FB_CUR_SETSHAPE; + + switch (p->cursor_shape & CUR_HWMASK) { + case CUR_NONE: + cur_height = 0; + break; + case CUR_UNDERLINE: + cur_height = (vc->vc_font.height < 10) ? 1 : 2; + break; + case CUR_LOWER_THIRD: + cur_height = vc->vc_font.height/3; + break; + case CUR_LOWER_HALF: + cur_height = vc->vc_font.height >> 1; + break; + case CUR_TWO_THIRDS: + cur_height = (vc->vc_font.height << 1)/3; + break; + case CUR_BLOCK: + default: + cur_height = vc->vc_font.height; + break; + } + + size = cur_height * w; + + while (size--) + mask[i++] = msk; + + size = (vc->vc_font.height - cur_height) * w; + + while (size--) + mask[i++] = ~msk; + } + + switch (mode) { + case CM_ERASE: + ops->cursor_state.enable = 0; + break; + case CM_DRAW: + case CM_MOVE: + default: + ops->cursor_state.enable = (use_sw) ? 0 : 1; + break; + } + + cursor.image.data = src; + cursor.image.fg_color = ops->cursor_state.image.fg_color; + cursor.image.bg_color = ops->cursor_state.image.bg_color; + cursor.image.dx = ops->cursor_state.image.dx; + cursor.image.dy = ops->cursor_state.image.dy; + cursor.image.height = ops->cursor_state.image.height; + cursor.image.width = ops->cursor_state.image.width; + cursor.hot.x = ops->cursor_state.hot.x; + cursor.hot.y = ops->cursor_state.hot.y; + cursor.mask = ops->cursor_state.mask; + cursor.enable = ops->cursor_state.enable; + cursor.image.depth = 1; + cursor.rop = ROP_XOR; + + if (info->fbops->fb_cursor) + err = info->fbops->fb_cursor(info, &cursor); + + if (err) + soft_cursor(info, &cursor); + + ops->cursor_reset = 0; +} + +int ud_update_start(struct fb_info *info) +{ + struct fbcon_ops *ops = info->fbcon_par; + struct display *p = &fb_display[ops->currcon]; + u32 xoffset, yoffset; + u32 vyres = GETVYRES(p->scrollmode, info); + u32 vxres = GETVXRES(p->scrollmode, info); + int err; + + xoffset = (vxres - info->var.xres) - ops->var.xoffset; + yoffset = (vyres - info->var.yres) - ops->var.yoffset; + ops->var.xoffset = xoffset; + ops->var.yoffset = yoffset; + err = fb_pan_display(info, &ops->var); + ops->var.xoffset = info->var.xoffset; + ops->var.yoffset = info->var.yoffset; + ops->var.vmode = info->var.vmode; + return err; +} + +void fbcon_rotate_ud(struct fbcon_ops *ops) +{ + ops->bmove = ud_bmove; + ops->clear = ud_clear; + ops->putcs = ud_putcs; + ops->clear_margins = ud_clear_margins; + ops->cursor = ud_cursor; + ops->update_start = ud_update_start; +} +EXPORT_SYMBOL(fbcon_rotate_ud); + +MODULE_AUTHOR("Antonino Daplas "); +MODULE_DESCRIPTION("Console Rotation (180 degrees) Support"); +MODULE_LICENSE("GPL"); -- cgit v1.2.3-70-g09d2 From ed8c0e99f27451a9b980adf0de318d60e6de811f Mon Sep 17 00:00:00 2001 From: "Antonino A. Daplas" Date: Tue, 8 Nov 2005 21:39:14 -0800 Subject: [PATCH] fbcon: Console Rotation - Add support for 270-degree rotation Add support for 270-degree (counterclockwise) rotation of the console. To activate, boot with: fbcon=rotate:3 Signed-off-by: Antonino Daplas Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/video/console/Makefile | 3 +- drivers/video/console/fbcon_ccw.c | 428 +++++++++++++++++++++++++++++++++++ drivers/video/console/fbcon_rotate.c | 3 + drivers/video/console/fbcon_rotate.h | 1 + 4 files changed, 434 insertions(+), 1 deletion(-) create mode 100644 drivers/video/console/fbcon_ccw.c (limited to 'drivers/video/console/Makefile') diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index 830ff46e0d1..fed600c9ca5 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -32,7 +32,8 @@ ifeq ($(CONFIG_FB_TILEBLITTING),y) obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += tileblit.o endif ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE_ROTATION),y) -obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon_rotate.o fbcon_cw.o fbcon_ud.o +obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon_rotate.o fbcon_cw.o fbcon_ud.o \ + fbcon_ccw.o endif obj-$(CONFIG_FB_STI) += sticore.o font.o diff --git a/drivers/video/console/fbcon_ccw.c b/drivers/video/console/fbcon_ccw.c new file mode 100644 index 00000000000..680aabab73c --- /dev/null +++ b/drivers/video/console/fbcon_ccw.c @@ -0,0 +1,428 @@ +/* + * linux/drivers/video/console/fbcon_ccw.c -- Software Rotation - 270 degrees + * + * Copyright (C) 2005 Antonino Daplas + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "fbcon.h" +#include "fbcon_rotate.h" + +/* + * Rotation 270 degrees + */ + +static inline void ccw_update_attr(u8 *dst, u8 *src, int attribute, + struct vc_data *vc) +{ + int i, j, offset = (vc->vc_font.height < 10) ? 1 : 2; + int width = (vc->vc_font.height + 7) >> 3; + int mod = vc->vc_font.height % 8; + u8 c, msk = ~(0xff << offset), msk1 = 0; + + if (mod) + msk <<= (8 - mod); + + if (offset > mod) + set_bit(FBCON_BIT(7), (void *)&msk1); + + for (i = 0; i < vc->vc_font.width; i++) { + for (j = 0; j < width; j++) { + c = *src; + + if (attribute & FBCON_ATTRIBUTE_UNDERLINE) { + if (j == width - 1) + c |= msk; + + if (msk1 && j == width - 2) + c |= msk1; + } + + if (attribute & FBCON_ATTRIBUTE_BOLD && i) + *(dst - width) |= c; + + if (attribute & FBCON_ATTRIBUTE_REVERSE) + c = ~c; + src++; + *dst++ = c; + } + } +} + + +static void ccw_bmove(struct vc_data *vc, struct fb_info *info, int sy, + int sx, int dy, int dx, int height, int width) +{ + struct display *p = &fb_display[vc->vc_num]; + struct fb_copyarea area; + u32 vyres = GETVYRES(p->scrollmode, info); + + area.sx = sy * vc->vc_font.height; + area.sy = vyres - ((sx + width) * vc->vc_font.width); + area.dx = dy * vc->vc_font.height; + area.dy = vyres - ((dx + width) * vc->vc_font.width); + area.width = height * vc->vc_font.height; + area.height = width * vc->vc_font.width; + + info->fbops->fb_copyarea(info, &area); +} + +static void ccw_clear(struct vc_data *vc, struct fb_info *info, int sy, + int sx, int height, int width) +{ + struct display *p = &fb_display[vc->vc_num]; + struct fb_fillrect region; + int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; + u32 vyres = GETVYRES(p->scrollmode, info); + + region.color = attr_bgcol_ec(bgshift,vc); + region.dx = sy * vc->vc_font.height; + region.dy = vyres - ((sx + width) * vc->vc_font.width); + region.height = width * vc->vc_font.width; + region.width = height * vc->vc_font.height; + region.rop = ROP_COPY; + + info->fbops->fb_fillrect(info, ®ion); +} + +static inline void ccw_putcs_aligned(struct vc_data *vc, struct fb_info *info, + const u16 *s, u32 attr, u32 cnt, + u32 d_pitch, u32 s_pitch, u32 cellsize, + struct fb_image *image, u8 *buf, u8 *dst) +{ + struct fbcon_ops *ops = info->fbcon_par; + u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + u32 idx = (vc->vc_font.height + 7) >> 3; + u8 *src; + + while (cnt--) { + src = ops->fontbuffer + (scr_readw(s--) & charmask)*cellsize; + + if (attr) { + ccw_update_attr(buf, src, attr, vc); + src = buf; + } + + if (likely(idx == 1)) + __fb_pad_aligned_buffer(dst, d_pitch, src, idx, + vc->vc_font.width); + else + fb_pad_aligned_buffer(dst, d_pitch, src, idx, + vc->vc_font.width); + + dst += d_pitch * vc->vc_font.width; + } + + info->fbops->fb_imageblit(info, image); +} + +static void ccw_putcs(struct vc_data *vc, struct fb_info *info, + const unsigned short *s, int count, int yy, int xx, + int fg, int bg) +{ + struct fb_image image; + struct display *p = &fb_display[vc->vc_num]; + struct fbcon_ops *ops = info->fbcon_par; + u32 width = (vc->vc_font.height + 7)/8; + u32 cellsize = width * vc->vc_font.width; + u32 maxcnt = info->pixmap.size/cellsize; + u32 scan_align = info->pixmap.scan_align - 1; + u32 buf_align = info->pixmap.buf_align - 1; + u32 cnt, pitch, size; + u32 attribute = get_attribute(info, scr_readw(s)); + u8 *dst, *buf = NULL; + u32 vyres = GETVYRES(p->scrollmode, info); + + if (!ops->fontbuffer) + return; + + image.fg_color = fg; + image.bg_color = bg; + image.dx = yy * vc->vc_font.height; + image.dy = vyres - ((xx + count) * vc->vc_font.width); + image.width = vc->vc_font.height; + image.depth = 1; + + if (attribute) { + buf = kmalloc(cellsize, GFP_KERNEL); + if (!buf) + return; + } + + s += count - 1; + + while (count) { + if (count > maxcnt) + cnt = maxcnt; + else + cnt = count; + + image.height = vc->vc_font.width * cnt; + pitch = ((image.width + 7) >> 3) + scan_align; + pitch &= ~scan_align; + size = pitch * image.height + buf_align; + size &= ~buf_align; + dst = fb_get_buffer_offset(info, &info->pixmap, size); + image.data = dst; + ccw_putcs_aligned(vc, info, s, attribute, cnt, pitch, + width, cellsize, &image, buf, dst); + image.dy += image.height; + count -= cnt; + s -= cnt; + } + + /* buf is always NULL except when in monochrome mode, so in this case + it's a gain to check buf against NULL even though kfree() handles + NULL pointers just fine */ + if (unlikely(buf)) + kfree(buf); + +} + +static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info, + int bottom_only) +{ + unsigned int cw = vc->vc_font.width; + unsigned int ch = vc->vc_font.height; + unsigned int rw = info->var.yres - (vc->vc_cols*cw); + unsigned int bh = info->var.xres - (vc->vc_rows*ch); + unsigned int bs = vc->vc_rows*ch; + struct fb_fillrect region; + int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; + + region.color = attr_bgcol_ec(bgshift,vc); + region.rop = ROP_COPY; + + if (rw && !bottom_only) { + region.dx = 0; + region.dy = info->var.yoffset; + region.height = rw; + region.width = info->var.xres_virtual; + info->fbops->fb_fillrect(info, ®ion); + } + + if (bh) { + region.dx = info->var.xoffset + bs; + region.dy = 0; + region.height = info->var.yres_virtual; + region.width = bh; + info->fbops->fb_fillrect(info, ®ion); + } +} + +static void ccw_cursor(struct vc_data *vc, struct fb_info *info, + struct display *p, int mode, int softback_lines, + int fg, int bg) +{ + struct fb_cursor cursor; + struct fbcon_ops *ops = (struct fbcon_ops *) info->fbcon_par; + unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + int w = (vc->vc_font.height + 7) >> 3, c; + int y = real_y(p, vc->vc_y); + int attribute, use_sw = (vc->vc_cursor_type & 0x10); + int err = 1, dx, dy; + char *src; + u32 vyres = GETVYRES(p->scrollmode, info); + + if (!ops->fontbuffer) + return; + + cursor.set = 0; + + if (softback_lines) { + if (y + softback_lines >= vc->vc_rows) { + mode = CM_ERASE; + ops->cursor_flash = 0; + return; + } else + y += softback_lines; + } + + c = scr_readw((u16 *) vc->vc_pos); + attribute = get_attribute(info, c); + src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width)); + + if (ops->cursor_state.image.data != src || + ops->cursor_reset) { + ops->cursor_state.image.data = src; + cursor.set |= FB_CUR_SETIMAGE; + } + + if (attribute) { + u8 *dst; + + dst = kmalloc(w * vc->vc_font.width, GFP_ATOMIC); + if (!dst) + return; + kfree(ops->cursor_data); + ops->cursor_data = dst; + ccw_update_attr(dst, src, attribute, vc); + src = dst; + } + + if (ops->cursor_state.image.fg_color != fg || + ops->cursor_state.image.bg_color != bg || + ops->cursor_reset) { + ops->cursor_state.image.fg_color = fg; + ops->cursor_state.image.bg_color = bg; + cursor.set |= FB_CUR_SETCMAP; + } + + if (ops->cursor_state.image.height != vc->vc_font.width || + ops->cursor_state.image.width != vc->vc_font.height || + ops->cursor_reset) { + ops->cursor_state.image.height = vc->vc_font.width; + ops->cursor_state.image.width = vc->vc_font.height; + cursor.set |= FB_CUR_SETSIZE; + } + + dx = y * vc->vc_font.height; + dy = vyres - ((vc->vc_x + 1) * vc->vc_font.width); + + if (ops->cursor_state.image.dx != dx || + ops->cursor_state.image.dy != dy || + ops->cursor_reset) { + ops->cursor_state.image.dx = dx; + ops->cursor_state.image.dy = dy; + cursor.set |= FB_CUR_SETPOS; + } + + if (ops->cursor_state.hot.x || ops->cursor_state.hot.y || + ops->cursor_reset) { + ops->cursor_state.hot.x = cursor.hot.y = 0; + cursor.set |= FB_CUR_SETHOT; + } + + if (cursor.set & FB_CUR_SETSIZE || + vc->vc_cursor_type != p->cursor_shape || + ops->cursor_state.mask == NULL || + ops->cursor_reset) { + char *tmp, *mask = kmalloc(w*vc->vc_font.width, GFP_ATOMIC); + int cur_height, size, i = 0; + int width = (vc->vc_font.width + 7)/8; + + if (!mask) + return; + + tmp = kmalloc(width * vc->vc_font.height, GFP_ATOMIC); + + if (!tmp) { + kfree(mask); + return; + } + + kfree(ops->cursor_state.mask); + ops->cursor_state.mask = mask; + + p->cursor_shape = vc->vc_cursor_type; + cursor.set |= FB_CUR_SETSHAPE; + + switch (p->cursor_shape & CUR_HWMASK) { + case CUR_NONE: + cur_height = 0; + break; + case CUR_UNDERLINE: + cur_height = (vc->vc_font.height < 10) ? 1 : 2; + break; + case CUR_LOWER_THIRD: + cur_height = vc->vc_font.height/3; + break; + case CUR_LOWER_HALF: + cur_height = vc->vc_font.height >> 1; + break; + case CUR_TWO_THIRDS: + cur_height = (vc->vc_font.height << 1)/3; + break; + case CUR_BLOCK: + default: + cur_height = vc->vc_font.height; + break; + } + + size = (vc->vc_font.height - cur_height) * width; + while (size--) + tmp[i++] = 0; + size = cur_height * width; + while (size--) + tmp[i++] = 0xff; + memset(mask, 0, w * vc->vc_font.width); + rotate_ccw(tmp, mask, vc->vc_font.width, vc->vc_font.height); + kfree(tmp); + } + + switch (mode) { + case CM_ERASE: + ops->cursor_state.enable = 0; + break; + case CM_DRAW: + case CM_MOVE: + default: + ops->cursor_state.enable = (use_sw) ? 0 : 1; + break; + } + + cursor.image.data = src; + cursor.image.fg_color = ops->cursor_state.image.fg_color; + cursor.image.bg_color = ops->cursor_state.image.bg_color; + cursor.image.dx = ops->cursor_state.image.dx; + cursor.image.dy = ops->cursor_state.image.dy; + cursor.image.height = ops->cursor_state.image.height; + cursor.image.width = ops->cursor_state.image.width; + cursor.hot.x = ops->cursor_state.hot.x; + cursor.hot.y = ops->cursor_state.hot.y; + cursor.mask = ops->cursor_state.mask; + cursor.enable = ops->cursor_state.enable; + cursor.image.depth = 1; + cursor.rop = ROP_XOR; + + if (info->fbops->fb_cursor) + err = info->fbops->fb_cursor(info, &cursor); + + if (err) + soft_cursor(info, &cursor); + + ops->cursor_reset = 0; +} + +int ccw_update_start(struct fb_info *info) +{ + struct fbcon_ops *ops = info->fbcon_par; + struct display *p = &fb_display[ops->currcon]; + u32 yoffset; + u32 vyres = GETVYRES(p->scrollmode, info); + int err; + + yoffset = (vyres - info->var.yres) - ops->var.xoffset; + ops->var.xoffset = ops->var.yoffset; + ops->var.yoffset = yoffset; + err = fb_pan_display(info, &ops->var); + ops->var.xoffset = info->var.xoffset; + ops->var.yoffset = info->var.yoffset; + ops->var.vmode = info->var.vmode; + return err; +} + +void fbcon_rotate_ccw(struct fbcon_ops *ops) +{ + ops->bmove = ccw_bmove; + ops->clear = ccw_clear; + ops->putcs = ccw_putcs; + ops->clear_margins = ccw_clear_margins; + ops->cursor = ccw_cursor; + ops->update_start = ccw_update_start; +} +EXPORT_SYMBOL(fbcon_rotate_ccw); + +MODULE_AUTHOR("Antonino Daplas "); +MODULE_DESCRIPTION("Console Rotation (270 degrees) Support"); +MODULE_LICENSE("GPL"); diff --git a/drivers/video/console/fbcon_rotate.c b/drivers/video/console/fbcon_rotate.c index 3d64ad190ff..ec0dd8fe241 100644 --- a/drivers/video/console/fbcon_rotate.c +++ b/drivers/video/console/fbcon_rotate.c @@ -105,6 +105,9 @@ void fbcon_set_rotate(struct fbcon_ops *ops) case FB_ROTATE_UD: fbcon_rotate_ud(ops); break; + case FB_ROTATE_CCW: + fbcon_rotate_ccw(ops); + break; } } EXPORT_SYMBOL(fbcon_set_rotate); diff --git a/drivers/video/console/fbcon_rotate.h b/drivers/video/console/fbcon_rotate.h index f8ddcd6bd89..90c672096c2 100644 --- a/drivers/video/console/fbcon_rotate.h +++ b/drivers/video/console/fbcon_rotate.h @@ -101,4 +101,5 @@ static inline void rotate_ccw(const char *in, char *out, u32 width, u32 height) extern void fbcon_rotate_cw(struct fbcon_ops *ops); extern void fbcon_rotate_ud(struct fbcon_ops *ops); +extern void fbcon_rotate_ccw(struct fbcon_ops *ops); #endif -- cgit v1.2.3-70-g09d2 From 0fde7f591860e48dd210144ff24c061da03bfa39 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 12 Nov 2005 10:14:02 -0800 Subject: Revert "[PATCH] fbcon: Add rl (Roman Large) font" This reverts 998e6d51162707685336ff99c029c8911b270d32 commit. --- drivers/video/console/Kconfig | 7 - drivers/video/console/Makefile | 1 - drivers/video/console/font_rl.c | 4374 --------------------------------------- drivers/video/console/fonts.c | 4 - include/linux/font.h | 2 - 5 files changed, 4388 deletions(-) delete mode 100644 drivers/video/console/font_rl.c (limited to 'drivers/video/console/Makefile') diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 94c5f1392cc..5f74df99340 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -215,12 +215,5 @@ config FONT_10x18 big letters. It fits between the sun 12x22 and the normal 8x16 font. If other fonts are too big or too small for you, say Y, otherwise say N. -config FONT_RL - bool "console Roman Large 8x16 font" if FONTS - depends on FRAMEBUFFER_CONSOLE - help - This is the visually-appealing "RL" console font that is - included with the kbd package. - endmenu diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index fed600c9ca5..9b26dda18a3 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -15,7 +15,6 @@ font-objs-$(CONFIG_FONT_10x18) += font_10x18.o font-objs-$(CONFIG_FONT_PEARL_8x8) += font_pearl_8x8.o font-objs-$(CONFIG_FONT_ACORN_8x8) += font_acorn_8x8.o font-objs-$(CONFIG_FONT_MINI_4x6) += font_mini_4x6.o -font-objs-$(CONFIG_FONT_RL) += font_rl.o font-objs += $(font-objs-y) diff --git a/drivers/video/console/font_rl.c b/drivers/video/console/font_rl.c deleted file mode 100644 index dfecc27d8de..00000000000 --- a/drivers/video/console/font_rl.c +++ /dev/null @@ -1,4374 +0,0 @@ - -/* This font is simply the "rl.fnt" console font from the kbd utility. - * Converted by Zack T Smith, fbui@comcast.net. - * The original binary file is covered under the GNU Public License. - */ - -#include - -#define FONTDATAMAX 4096 - -static unsigned char patterns[4096] = { -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3c, -0x42, -0x81, -0xe7, -0xa5, -0x99, -0x81, -0x81, -0x99, -0x42, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3c, -0x7e, -0xff, -0x99, -0xdb, -0xe7, -0xff, -0xff, -0xe7, -0x7e, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x6c, -0xfe, -0xfe, -0xfe, -0xfe, -0xfe, -0x7c, -0x38, -0x10, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x7c, -0xfe, -0x7c, -0x38, -0x10, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x38, -0x38, -0x10, -0xd6, -0xfe, -0xd6, -0x10, -0x10, -0x38, -0x7c, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x38, -0x7c, -0xfe, -0xfe, -0x54, -0x10, -0x10, -0x38, -0x7c, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x18, -0x3c, -0x3c, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xe7, -0xc3, -0xc3, -0xe7, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x42, -0x42, -0x66, -0x3c, -0x00, -0x00, -0x00, -0x00, -0x00, - -0xff, -0xff, -0xff, -0xff, -0xff, -0xc3, -0x99, -0xbd, -0xbd, -0x99, -0xc3, -0xff, -0xff, -0xff, -0xff, -0xff, - -0x00, -0x00, -0x0f, -0x07, -0x0d, -0x18, -0x78, -0xcc, -0xcc, -0xcc, -0xcc, -0x78, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x3c, -0x18, -0x7e, -0x18, -0x18, -0x18, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x08, -0x0c, -0x0a, -0x0a, -0x0a, -0x08, -0x08, -0x08, -0x38, -0x78, -0x30, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x10, -0x18, -0x1c, -0x1e, -0x1e, -0x16, -0x12, -0x72, -0xf2, -0x62, -0x0e, -0x1e, -0x0c, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x10, -0x92, -0x54, -0x38, -0xfe, -0x38, -0x54, -0x92, -0x10, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x80, -0xc0, -0xe0, -0xb8, -0x8e, -0xb8, -0xe0, -0xc0, -0x80, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x02, -0x06, -0x0e, -0x3a, -0xe2, -0x3a, -0x0e, -0x06, -0x02, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x38, -0x7c, -0xd6, -0x10, -0x10, -0x10, -0x10, -0xd6, -0x7c, -0x38, -0x10, -0x00, -0x00, - -0x00, -0x42, -0xe7, -0xe7, -0xe7, -0xe7, -0x42, -0x42, -0x42, -0x00, -0x66, -0x66, -0x66, -0x00, -0x00, -0x00, - -0x00, -0x7f, -0xca, -0xca, -0xca, -0xca, -0x7a, -0x0a, -0x0a, -0x0a, -0x0a, -0x0a, -0x1b, -0x00, -0x00, -0x00, - -0x00, -0x1e, -0x31, -0x78, -0xcc, -0xc6, -0xc3, -0x63, -0x33, -0x1e, -0x8c, -0x78, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0xfe, -0xfe, -0xfe, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x38, -0x7c, -0xd6, -0x10, -0x10, -0x10, -0x10, -0xd6, -0x7c, -0x38, -0x10, -0xfe, -0x00, - -0x00, -0x00, -0x10, -0x38, -0x7c, -0xd6, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0xd6, -0x7c, -0x38, -0x10, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x08, -0x0c, -0x06, -0xff, -0x06, -0x0c, -0x08, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x10, -0x30, -0x60, -0xff, -0x60, -0x30, -0x10, -0x00, -0x00, -0x00, -0x00, - -0x22, -0x44, -0x88, -0xcc, -0xee, -0x44, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x24, -0x42, -0xff, -0x42, -0x24, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x10, -0x38, -0x38, -0x6c, -0x6c, -0xc6, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0xfe, -0xc6, -0x6c, -0x6c, -0x38, -0x38, -0x10, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x3c, -0x3c, -0x3c, -0x3c, -0x18, -0x18, -0x18, -0x10, -0x00, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x22, -0x77, -0x33, -0x11, -0x22, -0x44, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x12, -0x12, -0x12, -0x7f, -0x24, -0x24, -0x24, -0xfe, -0x48, -0x48, -0x48, -0x00, -0x00, -0x00, - -0x10, -0x10, -0x7c, -0xd2, -0xd0, -0xd0, -0xd0, -0x7c, -0x16, -0x16, -0x16, -0x96, -0x7c, -0x10, -0x10, -0x00, - -0x00, -0x42, -0xbe, -0x44, -0x0c, -0x08, -0x18, -0x10, -0x30, -0x20, -0x64, -0x4a, -0xc4, -0x00, -0x00, -0x00, - -0x00, -0x38, -0x6c, -0x6c, -0x6c, -0x38, -0x37, -0x72, -0xdc, -0xcc, -0xcc, -0xcc, -0x77, -0x00, -0x00, -0x00, - -0x10, -0x38, -0x18, -0x08, -0x10, -0x20, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x04, -0x08, -0x10, -0x10, -0x30, -0x30, -0x30, -0x30, -0x30, -0x10, -0x10, -0x08, -0x04, -0x00, -0x00, - -0x00, -0x20, -0x10, -0x08, -0x08, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x08, -0x08, -0x10, -0x20, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x44, -0x28, -0x38, -0xfe, -0x38, -0x28, -0x44, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x18, -0x18, -0x7e, -0x18, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x18, -0x08, -0x10, -0x20, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x10, -0x00, -0x00, -0x00, - -0x00, -0x06, -0x06, -0x0c, -0x0c, -0x18, -0x18, -0x30, -0x30, -0x60, -0x60, -0xc0, -0xc0, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x3c, -0x46, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc4, -0x78, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x08, -0x18, -0x78, -0x18, -0x18, -0x18, -0x18, -0x18, -0x7e, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x7c, -0x86, -0x06, -0x0c, -0x18, -0x20, -0x40, -0xc1, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x3c, -0x46, -0x04, -0x08, -0x1c, -0x06, -0x06, -0x06, -0x06, -0x0c, -0x70, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x04, -0x08, -0x10, -0x2c, -0x4c, -0x8c, -0x8c, -0xfe, -0x0c, -0x0c, -0x0c, -0x00, - -0x00, -0x00, -0x00, -0x02, -0x3c, -0x20, -0x20, -0x70, -0x0c, -0x06, -0x06, -0x06, -0x06, -0x0c, -0x70, -0x00, - -0x00, -0x00, -0x18, -0x20, -0x40, -0xc0, -0xdc, -0xc6, -0xc6, -0xc6, -0xc6, -0x44, -0x38, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x40, -0x7e, -0x82, -0x06, -0x04, -0x0c, -0x18, -0x18, -0x30, -0x30, -0x30, -0x30, -0x00, - -0x00, -0x00, -0x7c, -0xc6, -0xc6, -0x64, -0x38, -0x4c, -0xc6, -0xc6, -0xc6, -0xc6, -0x7c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x38, -0x44, -0xc6, -0xc6, -0x76, -0x06, -0x06, -0x06, -0x04, -0x08, -0x30, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x10, -0x00, -0x00, -0x00, -0x10, -0x38, -0x10, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x10, -0x00, -0x00, -0x00, -0x10, -0x38, -0x18, -0x08, -0x10, -0x20, - -0x00, -0x06, -0x0c, -0x18, -0x30, -0x60, -0xa0, -0xa0, -0x60, -0x30, -0x18, -0x0c, -0x06, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7e, -0x00, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x60, -0x30, -0x18, -0x0c, -0x06, -0x05, -0x05, -0x06, -0x0c, -0x18, -0x30, -0x60, -0x00, -0x00, -0x00, - -0x00, -0x7c, -0x86, -0xc6, -0x06, -0x04, -0x08, -0x10, -0x10, -0x18, -0x00, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3c, -0x46, -0xc6, -0xce, -0xd6, -0xd6, -0xd6, -0xdc, -0xc0, -0xc4, -0x78, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x18, -0x18, -0x3c, -0x2c, -0x2c, -0x2c, -0x7e, -0x46, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x00, -0xfc, -0x66, -0x66, -0x66, -0x66, -0x7c, -0x66, -0x66, -0x66, -0x66, -0x66, -0xfc, -0x00, -0x00, -0x00, - -0x00, -0x3a, -0x66, -0xc2, -0xc0, -0xc0, -0xc0, -0xc0, -0xc0, -0xc0, -0xc0, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xfc, -0x66, -0x63, -0x63, -0x63, -0x63, -0x63, -0x63, -0x63, -0x63, -0x66, -0xfc, -0x00, -0x00, -0x00, - -0x00, -0xff, -0x61, -0x60, -0x60, -0x64, -0x7c, -0x64, -0x60, -0x60, -0x60, -0x61, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0xff, -0x61, -0x61, -0x60, -0x64, -0x7c, -0x64, -0x60, -0x60, -0x60, -0x60, -0xf0, -0x00, -0x00, -0x00, - -0x00, -0x3a, -0x66, -0xc2, -0xc0, -0xc0, -0xc0, -0xcf, -0xc6, -0xc6, -0xc6, -0x66, -0x38, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x62, -0x7e, -0x62, -0x62, -0x62, -0x62, -0x62, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x1e, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x08, -0xf0, - -0x00, -0xf7, -0x64, -0x6c, -0x68, -0x68, -0x78, -0x6c, -0x6c, -0x6c, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0xf8, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x61, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0xc3, -0x66, -0x76, -0x7e, -0x56, -0x56, -0x46, -0x46, -0x46, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x00, -0xe7, -0x62, -0x62, -0x72, -0x52, -0x5a, -0x4a, -0x4e, -0x46, -0x46, -0x42, -0xe2, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x66, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xfc, -0x66, -0x66, -0x66, -0x66, -0x6c, -0x60, -0x60, -0x60, -0x60, -0x60, -0xf0, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x66, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0x66, -0x3c, -0x10, -0x39, -0x0e, - -0x00, -0xfc, -0x66, -0x66, -0x66, -0x66, -0x7c, -0x6c, -0x66, -0x66, -0x66, -0x66, -0xf3, -0x00, -0x00, -0x00, - -0x00, -0x7a, -0xc6, -0xc2, -0xc0, -0x70, -0x3c, -0x0e, -0x06, -0x06, -0x86, -0xc6, -0xbc, -0x00, -0x00, -0x00, - -0x00, -0xff, -0x99, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x76, -0x34, -0x34, -0x34, -0x3c, -0x18, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x62, -0x6a, -0x6a, -0x6a, -0x6a, -0x7e, -0x7e, -0x34, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x34, -0x34, -0x18, -0x18, -0x2c, -0x2c, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x34, -0x34, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x7f, -0x46, -0x86, -0x0c, -0x0c, -0x18, -0x18, -0x30, -0x30, -0x61, -0x62, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xc0, -0xc0, -0x60, -0x60, -0x30, -0x30, -0x18, -0x18, -0x0c, -0x0c, -0x06, -0x06, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x10, -0x38, -0x4c, -0x86, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, - -0x00, -0x18, -0x20, -0x30, -0x38, -0x10, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x20, -0xe0, -0x60, -0x60, -0x6c, -0x76, -0x66, -0x66, -0x66, -0x66, -0x76, -0x6c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x60, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x04, -0x1c, -0x0c, -0x0c, -0x6c, -0xdc, -0xcc, -0xcc, -0xcc, -0xcc, -0xdc, -0x66, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x1e, -0x31, -0x33, -0x30, -0x30, -0x78, -0x30, -0x30, -0x30, -0x30, -0x30, -0x78, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7b, -0xce, -0xcc, -0xcc, -0xcc, -0x78, -0x60, -0x7c, -0x86, -0xc6, -0x7c, - -0x00, -0x20, -0xe0, -0x60, -0x60, -0x6c, -0x76, -0x66, -0x66, -0x66, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0x10, -0x38, -0x10, -0x00, -0x18, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x08, -0x1c, -0x08, -0x00, -0x0c, -0x1c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x6c, -0x4c, -0x38, -0x00, - -0x00, -0x20, -0xe0, -0x60, -0x60, -0x67, -0x66, -0x6c, -0x78, -0x6c, -0x6c, -0x66, -0xe7, -0x00, -0x00, -0x00, - -0x00, -0x08, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x6a, -0xfe, -0x6a, -0x6a, -0x6a, -0x62, -0x62, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x5c, -0xf6, -0x66, -0x66, -0x66, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x5c, -0xe6, -0x66, -0x66, -0x66, -0x66, -0x66, -0x7c, -0x60, -0x60, -0xf0, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0xcc, -0xcc, -0xcc, -0xcc, -0xcc, -0xcc, -0x7c, -0x0c, -0x0c, -0x1e, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x5e, -0xf6, -0x60, -0x60, -0x60, -0x60, -0x60, -0xf0, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7a, -0xc6, -0x72, -0x1c, -0x06, -0x86, -0xc6, -0xbc, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x10, -0x30, -0x7c, -0x30, -0x30, -0x30, -0x30, -0x30, -0x34, -0x18, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x3a, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xf7, -0x62, -0x76, -0x34, -0x34, -0x3c, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xf7, -0x62, -0x6a, -0x6a, -0x6a, -0x6a, -0x7e, -0x24, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xf7, -0x62, -0x34, -0x18, -0x2c, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xf7, -0x62, -0x62, -0x34, -0x34, -0x18, -0x18, -0x18, -0x10, -0xb0, -0xe0, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0x8c, -0x18, -0x30, -0x30, -0x60, -0xc2, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x0e, -0x18, -0x10, -0x10, -0x08, -0x70, -0x70, -0x08, -0x10, -0x10, -0x18, -0x0e, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x00, -0x00, - -0x00, -0x70, -0x18, -0x08, -0x08, -0x10, -0x0e, -0x0e, -0x10, -0x08, -0x08, -0x18, -0x70, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0xdc, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x6c, -0xc6, -0xc6, -0xc6, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3a, -0x66, -0xc2, -0xc0, -0xc0, -0xc0, -0xc0, -0xc0, -0x62, -0x3c, -0x18, -0x0c, -0x24, -0x18, - -0x00, -0x00, -0x66, -0x00, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3b, -0x00, -0x00, -0x00, - -0x00, -0x0c, -0x18, -0x20, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x58, -0x8c, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x18, -0x04, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x38, -0x44, -0x44, -0x38, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x60, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x08, -0x24, -0x18, - -0x00, -0x18, -0x2c, -0x46, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x18, -0x04, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x2c, -0x46, -0x00, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x60, -0x30, -0x08, -0x00, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x66, -0x18, -0x18, -0x18, -0x3c, -0x2c, -0x2c, -0x2c, -0x7e, -0x46, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x18, -0x24, -0x18, -0x18, -0x3c, -0x2c, -0x2c, -0x2c, -0x7e, -0x46, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x0c, -0x18, -0xff, -0x61, -0x60, -0x60, -0x64, -0x7c, -0x64, -0x60, -0x60, -0x61, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0x9b, -0x1b, -0x3f, -0xd8, -0xd8, -0xd9, -0x6e, -0x00, -0x00, -0x00, - -0x00, -0x1f, -0x1d, -0x1d, -0x3c, -0x2c, -0x2e, -0x2c, -0x7c, -0x4c, -0x4c, -0x4d, -0xef, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x2c, -0x46, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x18, -0x04, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x2c, -0x46, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x3a, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x18, -0x04, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x3a, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0xf7, -0x62, -0x62, -0x34, -0x34, -0x18, -0x18, -0x18, -0x10, -0xb0, -0xe0, - -0x66, -0x00, -0x3c, -0x66, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x66, -0x00, -0xf7, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x10, -0x10, -0x7c, -0xc6, -0xc0, -0xc0, -0xc0, -0xc0, -0xc2, -0x7c, -0x10, -0x10, -0x00, - -0x00, -0x38, -0x64, -0x6c, -0x60, -0x60, -0xf0, -0x60, -0x60, -0x60, -0x60, -0x66, -0xfc, -0x00, -0x00, -0x00, - -0x00, -0x81, -0xc3, -0x66, -0x3c, -0x18, -0xff, -0x18, -0x18, -0xff, -0x18, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x00, -0xfe, -0x63, -0x63, -0x63, -0x63, -0x6e, -0x60, -0x64, -0x6e, -0x64, -0x64, -0xf5, -0x06, -0x00, -0x00, - -0x00, -0x0e, -0x19, -0x1b, -0x18, -0x18, -0x3c, -0x18, -0x18, -0x18, -0x18, -0xd8, -0x98, -0x70, -0x00, -0x00, - -0x00, -0x0c, -0x18, -0x20, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x06, -0x0c, -0x10, -0x00, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x0c, -0x18, -0x20, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x0c, -0x18, -0x20, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x3a, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x32, -0x4c, -0x00, -0x5c, -0xf6, -0x66, -0x66, -0x66, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, - -0x32, -0x4c, -0x00, -0xe7, -0x72, -0x52, -0x5a, -0x4a, -0x4e, -0x46, -0x46, -0x42, -0xe2, -0x00, -0x00, -0x00, - -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x30, -0x00, -0x30, -0x10, -0x10, -0x20, -0x40, -0xc0, -0xc6, -0xc2, -0x7c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0xc0, -0xc0, -0xc0, -0xc0, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0x06, -0x06, -0x06, -0x06, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x20, -0xe0, -0x63, -0x66, -0xfc, -0x18, -0x30, -0x60, -0xce, -0x93, -0x06, -0x0c, -0x1f, -0x00, -0x00, - -0x00, -0x20, -0xe0, -0x63, -0x66, -0xfc, -0x18, -0x30, -0x64, -0xc8, -0x96, -0x3f, -0x06, -0x06, -0x00, -0x00, - -0x00, -0x18, -0x18, -0x00, -0x08, -0x18, -0x18, -0x18, -0x3c, -0x3c, -0x3c, -0x3c, -0x18, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x36, -0x6c, -0xd8, -0xd8, -0x6c, -0x36, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xd8, -0x6c, -0x36, -0x36, -0x6c, -0xd8, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, - -0x00, -0x95, -0x00, -0xa9, -0x00, -0x95, -0x00, -0xa9, -0x00, -0x95, -0x00, -0xa9, -0x00, -0x95, -0x00, -0xa9, - -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xf8, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xf8, -0x18, -0x18, -0xf8, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe6, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xf8, -0x18, -0x18, -0xf8, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe6, -0x06, -0x06, -0xe6, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0x06, -0x06, -0xe6, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe6, -0x06, -0x06, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xf8, -0x18, -0x18, -0xf8, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xf8, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x1f, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xff, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x60, -0x60, -0x7f, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x7f, -0x60, -0x60, -0x67, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe7, -0x00, -0x00, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, -0xe7, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x60, -0x60, -0x67, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe7, -0x00, -0x00, -0xe7, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xff, -0x00, -0x00, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, -0xff, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x7f, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x1f, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x1f, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x7f, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xff, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xff, -0x00, -0x00, -0xff, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xf8, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x1f, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, - -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, - -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, - -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x77, -0xcc, -0xcc, -0xcc, -0xcc, -0xde, -0x73, -0x00, -0x00, -0x00, - -0x00, -0x7c, -0xc6, -0xc6, -0xc6, -0xc4, -0xc8, -0xc4, -0xc6, -0xc6, -0xc6, -0xc6, -0xdc, -0xc0, -0xc0, -0x00, - -0x00, -0xff, -0x61, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0xf0, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x01, -0x7e, -0xa4, -0x24, -0x2c, -0x6c, -0x6c, -0x6c, -0x48, -0x00, -0x00, -0x00, - -0x00, -0xff, -0xc1, -0x60, -0x30, -0x18, -0x0c, -0x18, -0x30, -0x60, -0xc0, -0xc1, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7f, -0xc8, -0xc8, -0xc8, -0xc8, -0xc8, -0xc8, -0x70, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x22, -0x66, -0x66, -0x66, -0x66, -0x66, -0x7c, -0x60, -0x60, -0x60, -0xc0, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0xdc, -0x18, -0x18, -0x18, -0x18, -0x18, -0x10, -0x00, -0x00, -0x00, - -0x00, -0x38, -0x10, -0x7c, -0xd6, -0xd6, -0xd6, -0xd6, -0xd6, -0xd6, -0x7c, -0x10, -0x38, -0x00, -0x00, -0x00, - -0x00, -0x38, -0x6c, -0xc6, -0xc6, -0xc6, -0xfe, -0xc6, -0xc6, -0xc6, -0xc6, -0x6c, -0x38, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x66, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0x66, -0x24, -0x24, -0xa5, -0xe7, -0x00, -0x00, -0x00, - -0x00, -0x1e, -0x31, -0x30, -0x18, -0x0c, -0x3e, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x6e, -0xff, -0x99, -0x99, -0x99, -0x99, -0xff, -0x76, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x02, -0x04, -0x7c, -0xca, -0x92, -0xa6, -0x7c, -0x40, -0x80, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x1c, -0x30, -0x60, -0x60, -0x60, -0x7c, -0x60, -0x60, -0x60, -0x60, -0x30, -0x1c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x7c, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0xfe, -0x00, -0x00, -0x00, -0x7c, -0x00, -0x00, -0x00, -0xfe, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x18, -0x18, -0x7e, -0x18, -0x18, -0x00, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x30, -0x18, -0x0c, -0x06, -0x0c, -0x18, -0x30, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x0c, -0x18, -0x30, -0x60, -0x30, -0x18, -0x0c, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x0e, -0x19, -0x1b, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xd8, -0x98, -0x70, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x18, -0x18, -0x00, -0x7e, -0x00, -0x18, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0xdc, -0x00, -0x00, -0x76, -0xdc, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x38, -0x44, -0x44, -0x44, -0x38, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x18, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x07, -0x06, -0x06, -0x0c, -0x0c, -0x08, -0x98, -0xd0, -0xf0, -0x60, -0x20, -0x00, -0x00, -0x00, - -0x00, -0xcc, -0x76, -0x66, -0x66, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x70, -0x98, -0x18, -0x30, -0x60, -0x88, -0xf8, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7c, -0x64, -0x64, -0x64, -0x64, -0x64, -0x7c, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -}; - - -const struct font_desc font_rl = { - RL_IDX, - "RomanLarge", - 8, - 16, - patterns, - -1 -}; diff --git a/drivers/video/console/fonts.c b/drivers/video/console/fonts.c index 9be83bed195..4fd07d9eca0 100644 --- a/drivers/video/console/fonts.c +++ b/drivers/video/console/fonts.c @@ -64,10 +64,6 @@ static const struct font_desc *fonts[] = { #undef NO_FONTS &font_mini_4x6, #endif -#ifdef CONFIG_FONT_RL -#undef NO_FONTS - &font_rl, -#endif }; #define num_fonts (sizeof(fonts)/sizeof(*fonts)) diff --git a/include/linux/font.h b/include/linux/font.h index 8aac48c37f3..53b129f07f6 100644 --- a/include/linux/font.h +++ b/include/linux/font.h @@ -31,7 +31,6 @@ struct font_desc { #define SUN12x22_IDX 7 #define ACORN8x8_IDX 8 #define MINI4x6_IDX 9 -#define RL_IDX 10 extern const struct font_desc font_vga_8x8, font_vga_8x16, @@ -42,7 +41,6 @@ extern const struct font_desc font_vga_8x8, font_sun_8x16, font_sun_12x22, font_acorn_8x8, - font_rl, font_mini_4x6; /* Find a font with a specific name */ -- cgit v1.2.3-70-g09d2