diff options
author | Vincent Sanders <vince@kyllikki.org> | 2016-05-05 22:28:51 +0100 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2016-05-15 13:44:34 +0100 |
commit | d21447d096a320a08b3efb2b8768fad0dcdcfd64 (patch) | |
tree | 1a83814b7c9e94b2f13c473261f23dd3a17dee64 /atari/plot | |
parent | 2cbb337756d9af5bda4d594964d446439f602551 (diff) | |
download | netsurf-d21447d096a320a08b3efb2b8768fad0dcdcfd64.tar.gz netsurf-d21447d096a320a08b3efb2b8768fad0dcdcfd64.tar.bz2 |
move frontends into sub directory
Diffstat (limited to 'atari/plot')
-rw-r--r-- | atari/plot/eddi.h | 54 | ||||
-rw-r--r-- | atari/plot/eddi.s | 42 | ||||
-rw-r--r-- | atari/plot/font_freetype.c | 714 | ||||
-rw-r--r-- | atari/plot/font_freetype.h | 52 | ||||
-rw-r--r-- | atari/plot/font_internal.c | 2386 | ||||
-rw-r--r-- | atari/plot/font_internal.h | 37 | ||||
-rw-r--r-- | atari/plot/font_vdi.c | 310 | ||||
-rw-r--r-- | atari/plot/font_vdi.h | 26 | ||||
-rw-r--r-- | atari/plot/fontplot.c | 132 | ||||
-rw-r--r-- | atari/plot/fontplot.h | 86 | ||||
-rw-r--r-- | atari/plot/plot.c | 2247 | ||||
-rw-r--r-- | atari/plot/plot.h | 158 |
12 files changed, 0 insertions, 6244 deletions
diff --git a/atari/plot/eddi.h b/atari/plot/eddi.h deleted file mode 100644 index 7d6b90d4b..000000000 --- a/atari/plot/eddi.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _atari_eddi_h -#define _atari_eddi_h - -/*--- Defines ---*/ - -/* EdDI versions */ - -#define EDDI_10 (0x0100) -#define EDDI_11 (0x0110) - -/* Screen format */ - -enum { - VDI_FORMAT_UNKNOWN=-1, - VDI_FORMAT_INTER=0, /* Interleaved bitplanes */ - VDI_FORMAT_VDI=1, /* VDI independent */ - VDI_FORMAT_PACK=2 /* Packed pixels */ -}; - -/* CLUT types */ -enum { - VDI_CLUT_NONE=0, /* Monochrome mode */ - VDI_CLUT_HARDWARE, /* <256 colours mode */ - VDI_CLUT_SOFTWARE /* True colour mode */ -}; - - -/*--- Functions ---*/ - -unsigned long EdDI_version(void *function_pointer); - -#endif /* atari_eddi_s_h */ diff --git a/atari/plot/eddi.s b/atari/plot/eddi.s deleted file mode 100644 index f0ea18a1e..000000000 --- a/atari/plot/eddi.s +++ /dev/null @@ -1,42 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* - *Read EdDI version - * - *Patrice Mandin - */ - -.text - -.globl _EdDI_version - -/*--- Vector installer ---*/ - -_EdDI_version: -movel sp@(4),a0 /* Value of EdDI cookie */ - -/* Call EdDI function #0 */ -clrl d0 -jsr (a0) - -rts diff --git a/atari/plot/font_freetype.c b/atari/plot/font_freetype.c deleted file mode 100644 index a77aff855..000000000 --- a/atari/plot/font_freetype.c +++ /dev/null @@ -1,714 +0,0 @@ -/* - * Copyright 2005 James Bursa <bursa@users.sourceforge.net> - * 2008 Vincent Sanders <vince@simtec.co.uk> - * 2011 Ole Loots <ole@monochrom.net> - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef WITH_FREETYPE_FONT_DRIVER -#include <assert.h> -#include <ft2build.h> -#include FT_CACHE_H - -#include "utils/log.h" -#include "utils/nsoption.h" -#include "desktop/mouse.h" -#include "desktop/plot_style.h" - -#include "atari/gui.h" -#include "atari/bitmap.h" -#include "atari/plot/plot.h" -#include "atari/plot/fontplot.h" -#include "atari/plot/font_freetype.h" -#include "atari/findfile.h" -#include "atari/gemtk/gemtk.h" - -/* -------------------------------------------------------------------------- */ -/* Font Loading & Mapping scheme */ -/* -------------------------------------------------------------------------- */ -/* - -Truetype fonts are loaded in the following priority order: - -1. Option values. -2. default resouce names (8.3 compatible). -3. default font package installation path. - - -Resource font names & their meanings: --------------------------------------------- -s.ttf => Serif -sb.ttf => Serif Bold -ss.ttf => Sans Serif *Default Font -ssb.ttf => Sans Serif Bold -ssi.ttf => Sans Serif Italic -ssib.ttf => Sans Serif Italic Bold -mono.ttf => Monospaced -monob.ttf => Monospaced Bold -cursive.ttf => Cursive -fantasy.ttf => Fantasy -*/ - -#define FONT_RESOURCE_PATH "fonts/" -#define DEJAVU_PATH "/usr/share/fonts/truetype/ttf-dejavu/" -#define BITSTREAM_PATH "/usr/share/fonts/truetype/ttf-bitstream-vera/" - -#if !defined(USE_BITSTREAM_FONT_PACKAGE) && !defined(USE_DEJAVU_FONT_PACKAGE) -# define USE_BITSTREAM_FONT_PACKAGE -#endif - -#if defined(USE_DEJAVU_FONT_PACKAGE) -# define FONT_PKG_PATH DEJAVU_PATH -# define FONT_FILE_SANS "DejaVuSans.ttf" -# define FONT_FILE_SANS_BOLD "DejaVuSans-Bold.ttf" -# define FONT_FILE_SANS_OBLIQUE "DejaVuSans-Oblique.ttf" -# define FONT_FILE_SANS_BOLD_OBLIQUE "DejaVuSans-BoldOblique.ttf" -# define FONT_FILE_SERIF "DejaVuSerif.ttf" -# define FONT_FILE_SERIF_BOLD "DejaVuSerif-Bold.ttf" -# define FONT_FILE_MONO "DejaVuSansMono.ttf" -# define FONT_FILE_MONO_BOLD "DejaVuSerif-Bold.ttf" -# define FONT_FILE_OBLIQUE "DejaVuSansMono-Oblique.ttf" -# define FONT_FILE_FANTASY "DejaVuSerifCondensed-Bold.ttf" -#elif defined(USE_BITSTREAM_FONT_PACKAGE) -# define FONT_PKG_PATH BITSTREAM_PATH -# define FONT_FILE_SANS "Vera.ttf" -# define FONT_FILE_SANS_BOLD "VeraBd.ttf" -# define FONT_FILE_SANS_OBLIQUE "VeraIt.ttf" -# define FONT_FILE_SANS_BOLD_OBLIQUE "VeraBI.ttf" -# define FONT_FILE_SERIF "VeraSe.ttf" -# define FONT_FILE_SERIF_BOLD "VeraSeBd.ttf" -# define FONT_FILE_MONO "VeraMono.ttf" -# define FONT_FILE_MONO_BOLD "VeraMoBd.ttf" -# define FONT_FILE_OBLIQUE "VeraMoIt.ttf" -# define FONT_FILE_FANTASY "VeraMoBI.ttf" - -#endif - -#define CACHE_SIZE 2048 -#define CACHE_MIN_SIZE (100 * 1024) -#define BOLD_WEIGHT 700 - -extern unsigned long atari_plot_flags; -extern int atari_plot_vdi_handle; - -static FT_Library library; -static FTC_Manager ft_cmanager; -static FTC_CMapCache ft_cmap_cache ; -static FTC_ImageCache ft_image_cache; - -int ft_load_type; - -/* cache manager faceID data to create freetype faceid on demand */ -typedef struct ftc_faceid_s { - char *fontfile; /* path to font */ - int index; /* index of font */ - int cidx; /* character map index for unicode */ -} ftc_faceid_t; - -static int dtor( FONT_PLOTTER self ); -static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, - const char * str, size_t length, int * width ); -static int str_split( FONT_PLOTTER self, const plot_font_style_t *fstyle, - const char *string, size_t length,int x, - size_t *char_offset, int *actual_x ); -static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle, - const char *string, size_t length,int x, - size_t *char_offset, int *actual_x ); -static int text( FONT_PLOTTER self, int x, int y, const char *text, - size_t length, const plot_font_style_t *fstyle ); - -static void draw_glyph8(FONT_PLOTTER self, GRECT *clip, GRECT * loc, - uint8_t * pixdata, int pitch, uint32_t colour); -static void draw_glyph1(FONT_PLOTTER self, GRECT * clip, GRECT * loc, - uint8_t * pixdata, int pitch, uint32_t colour); - -static ftc_faceid_t *font_faces[FONT_FACE_COUNT]; -static MFDB tmp; -static int tmp_mfdb_size; -static bool init = false; -static struct bitmap * fontbmp; -static size_t fontbmp_stride; -static int fontbmp_allocated_height; -static int fontbmp_allocated_width; - - - -/* map cache manager handle to face id */ -static FT_Error ft_face_requester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *face ) -{ - FT_Error error; - ftc_faceid_t *ft_face = (ftc_faceid_t *)face_id; - int cidx; - - error = FT_New_Face(library, ft_face->fontfile, ft_face->index, face); - if (error) { - LOG("Could not find font (code %d)\n", error); - } else { - error = FT_Select_Charmap(*face, FT_ENCODING_UNICODE); - if (error) { - LOG("Could not select charmap (code %d)\n", error); - } else { - for (cidx = 0; cidx < (*face)->num_charmaps; cidx++) { - if ((*face)->charmap == (*face)->charmaps[cidx]) { - ft_face->cidx = cidx; - break; - } - } - } - } - LOG("Loaded face from %s\n", ft_face->fontfile); - return error; -} - -/* create new framebuffer face and cause it to be loaded to check its ok */ -static ftc_faceid_t * -ft_new_face(const char *option, const char *resname, const char *fontfile) -{ - ftc_faceid_t *newf; - FT_Error error; - FT_Face aface; - char buf[PATH_MAX]; - - newf = calloc(1, sizeof(ftc_faceid_t)); - if (option != NULL) { - newf->fontfile = strdup(option); - } else { - atari_find_resource(buf, resname, fontfile); - newf->fontfile = strdup(buf); - } - error = FTC_Manager_LookupFace(ft_cmanager, (FTC_FaceID)newf, &aface); - if (error) { - LOG("Could not find font face %s (code %d)\n", fontfile, error); - free(newf); - newf = font_faces[FONT_FACE_DEFAULT]; /* use default */ - } - return newf; -} - -static void ft_fill_scalar(const plot_font_style_t *fstyle, FTC_Scaler srec) -{ - int selected_face = FONT_FACE_DEFAULT; - - switch (fstyle->family) { - - case PLOT_FONT_FAMILY_SERIF: - if (fstyle->weight >= BOLD_WEIGHT) { - selected_face = FONT_FACE_SERIF_BOLD; - } else { - selected_face = FONT_FACE_SERIF; - } - break; - - case PLOT_FONT_FAMILY_MONOSPACE: - if (fstyle->weight >= BOLD_WEIGHT) { - selected_face = FONT_FACE_MONOSPACE_BOLD; - } else { - selected_face = FONT_FACE_MONOSPACE; - } - break; - - case PLOT_FONT_FAMILY_CURSIVE: - selected_face = FONT_FACE_CURSIVE; - break; - - case PLOT_FONT_FAMILY_FANTASY: - selected_face = FONT_FACE_FANTASY; - break; - - case PLOT_FONT_FAMILY_SANS_SERIF: - default: - if ((fstyle->flags & FONTF_ITALIC) || - (fstyle->flags & FONTF_OBLIQUE)) { - if (fstyle->weight >= BOLD_WEIGHT) { - selected_face = FONT_FACE_SANS_SERIF_ITALIC_BOLD; - } else { - selected_face = FONT_FACE_SANS_SERIF_ITALIC; - } - } else { - if (fstyle->weight >= BOLD_WEIGHT) { - selected_face = FONT_FACE_SANS_SERIF_BOLD; - } else { - selected_face = FONT_FACE_SANS_SERIF; - } - } - } - - srec->face_id = (FTC_FaceID)font_faces[selected_face]; - - srec->width = srec->height = (fstyle->size * 64) / FONT_SIZE_SCALE; - srec->pixel = 0; - - /* calculate x/y resolution, when browser_get_dpi() isn't available */ - /* 72 is an good value. */ - /* TODO: because browser_get_dpi() is to large, calculate that value */ - /* by VDI values. */ - srec->x_res = srec->y_res = 72; // browser_get_dpi(); -} - -static FT_Glyph ft_getglyph(const plot_font_style_t *fstyle, uint32_t ucs4) -{ - FT_UInt glyph_index; - FTC_ScalerRec srec; - FT_Glyph glyph; - FT_Error error; - ftc_faceid_t *ft_face; - - ft_fill_scalar(fstyle, &srec); - ft_face = (ftc_faceid_t *)srec.face_id; - glyph_index = FTC_CMapCache_Lookup(ft_cmap_cache, srec.face_id, ft_face->cidx, ucs4); - error = FTC_ImageCache_LookupScaler(ft_image_cache, - &srec, - FT_LOAD_RENDER | - FT_LOAD_FORCE_AUTOHINT | - ft_load_type, - glyph_index, - &glyph, - NULL); - return glyph; -} - - -/* initialise font handling */ -static bool ft_font_init(void) -{ - FT_Error error; - FT_ULong max_cache_size; - FT_UInt max_faces = 6; - int i; - - /* freetype library initialise */ - error = FT_Init_FreeType( &library ); - if (error) { - LOG("Freetype could not initialised (code %d)\n", error); - return false; - } - - /* set the Glyph cache size up */ - max_cache_size = CACHE_SIZE * 1024; - if (max_cache_size < CACHE_MIN_SIZE) { - max_cache_size = CACHE_MIN_SIZE; - } - - /* cache manager initialise */ - error = FTC_Manager_New(library, - max_faces, - 0, - max_cache_size, - ft_face_requester, - NULL, - &ft_cmanager); - if (error) { - LOG("Freetype could not initialise cache manager (code %d)\n", error); - FT_Done_FreeType(library); - return false; - } - - error = FTC_CMapCache_New(ft_cmanager, &ft_cmap_cache); - error = FTC_ImageCache_New(ft_cmanager, &ft_image_cache); - - /* Optain font faces */ - - - /* Default font, Sans Serif */ - font_faces[FONT_FACE_SANS_SERIF] = NULL; - font_faces[FONT_FACE_SANS_SERIF] = ft_new_face( - nsoption_charp(font_face_sans_serif), - FONT_RESOURCE_PATH "ss.ttf", - FONT_PKG_PATH FONT_FILE_SANS - ); - if (font_faces[FONT_FACE_SANS_SERIF] == NULL) { - LOG("Could not find default font (code %d)\n", error); - FTC_Manager_Done(ft_cmanager); - FT_Done_FreeType(library); - return false; - } - - /* Sans Serif Bold*/ - font_faces[FONT_FACE_SANS_SERIF_BOLD] = - ft_new_face(nsoption_charp(font_face_sans_serif_bold), - FONT_RESOURCE_PATH "ssb.ttf", - FONT_PKG_PATH FONT_FILE_SANS_BOLD); - - /* Sans Serif Italic */ - font_faces[FONT_FACE_SANS_SERIF_ITALIC] = - ft_new_face(nsoption_charp(font_face_sans_serif_italic), - FONT_RESOURCE_PATH "ssi.ttf", - FONT_PKG_PATH FONT_FILE_SANS_OBLIQUE); - - /* Sans Serif Italic Bold */ - font_faces[FONT_FACE_SANS_SERIF_ITALIC_BOLD] = - ft_new_face(nsoption_charp(font_face_sans_serif_italic_bold), - FONT_RESOURCE_PATH "ssib.ttf", - FONT_PKG_PATH FONT_FILE_SANS_BOLD_OBLIQUE); - - /* Monospaced */ - font_faces[FONT_FACE_MONOSPACE] = - ft_new_face(nsoption_charp(font_face_monospace), - FONT_RESOURCE_PATH "mono.ttf", - FONT_PKG_PATH FONT_FILE_MONO); - - /* Mospaced Bold */ - font_faces[FONT_FACE_MONOSPACE_BOLD] = - ft_new_face(nsoption_charp(font_face_monospace_bold), - FONT_RESOURCE_PATH "monob.ttf", - FONT_PKG_PATH FONT_FILE_MONO_BOLD); - - /* Serif */ - font_faces[FONT_FACE_SERIF] = - ft_new_face(nsoption_charp(font_face_serif), - FONT_RESOURCE_PATH "s.ttf", - FONT_PKG_PATH FONT_FILE_SERIF); - - /* Serif Bold */ - font_faces[FONT_FACE_SERIF_BOLD] = - ft_new_face(nsoption_charp(font_face_serif_bold), - FONT_RESOURCE_PATH "sb.ttf", - FONT_PKG_PATH FONT_FILE_SERIF_BOLD); - - /* Cursive */ - font_faces[FONT_FACE_CURSIVE] = - ft_new_face(nsoption_charp(font_face_cursive), - FONT_RESOURCE_PATH "cursive.ttf", - FONT_PKG_PATH FONT_FILE_OBLIQUE); - - /* Fantasy */ - font_faces[FONT_FACE_FANTASY] = - ft_new_face(nsoption_charp(font_face_fantasy), - FONT_RESOURCE_PATH "fantasy.ttf", - FONT_PKG_PATH FONT_FILE_FANTASY); - - for (i=1; i<FONT_FACE_COUNT; i++) { - if (font_faces[i] == NULL){ - font_faces[i] = font_faces[FONT_FACE_SANS_SERIF]; - } - } - - return true; -} - - -static bool ft_font_finalise(void) -{ - FTC_Manager_Done(ft_cmanager ); - FT_Done_FreeType(library); - return true; -} - -static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, - const char *string, size_t length, - int *width) -{ - uint32_t ucs4; - size_t nxtchr = 0; - FT_Glyph glyph; - - *width = 0; - while (nxtchr < length) { - ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr); - nxtchr = utf8_next(string, length, nxtchr); - - glyph = ft_getglyph(fstyle, ucs4); - if (glyph == NULL) - continue; - *width += glyph->advance.x >> 16; - } - return(1); -} - - -static int str_split( FONT_PLOTTER self, const plot_font_style_t *fstyle, - const char *string, size_t length, - int x, size_t *char_offset, int *actual_x) -{ - uint32_t ucs4; - size_t nxtchr = 0; - int last_space_x = 0; - int last_space_idx = 0; - FT_Glyph glyph; - - *actual_x = 0; - while (nxtchr < length) { - ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr); - glyph = ft_getglyph(fstyle, ucs4); - if (glyph == NULL) - continue; - if (ucs4 == 0x20) { - last_space_x = *actual_x; - last_space_idx = nxtchr; - } - *actual_x += glyph->advance.x >> 16; - if (*actual_x > x && last_space_idx != 0) { - /* string has exceeded available width and we've - * found a space; return previous space */ - *actual_x = last_space_x; - *char_offset = last_space_idx; - return true; - } - nxtchr = utf8_next(string, length, nxtchr); - } - *char_offset = nxtchr; - return (1); -} - - -static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle, - const char *string, size_t length, - int x, size_t *char_offset, int *actual_x) -{ - uint32_t ucs4; - size_t nxtchr = 0; - FT_Glyph glyph; - int prev_x = 0; - - *actual_x = 0; - while (nxtchr < length) { - ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr); - glyph = ft_getglyph(fstyle, ucs4); - if (glyph == NULL) - continue; - *actual_x += glyph->advance.x >> 16; - if (*actual_x > x) - break; - - prev_x = *actual_x; - nxtchr = utf8_next(string, length, nxtchr); - } - - /* choose nearest of previous and last x */ - if (abs(*actual_x - x) > abs(prev_x - x)) - *actual_x = prev_x; - *char_offset = nxtchr; - return ( 1 ); -} - - -static void draw_glyph8(FONT_PLOTTER self, GRECT * clip, GRECT * loc, uint8_t * pixdata, int pitch, uint32_t colour) -{ - uint32_t * linebuf; - uint32_t fontpix; - int xloop,yloop,xoff,yoff; - int x,y,w,h; - - x = loc->g_x; - y = loc->g_y; - w = loc->g_w; - h = loc->g_h; - - if( !rc_intersect( clip, loc ) ){ - return; - } - - xoff = loc->g_x - x; - yoff = loc->g_y - y; - - assert( loc->g_h <= h ); - assert( loc->g_w <= w ); - - h = loc->g_h; - w = loc->g_w; - - assert( h <= fontbmp_allocated_height ); - assert( w <= fontbmp_allocated_width ); - - fontbmp->height = h; - fontbmp->width = w; - for( yloop = 0; yloop < MIN(fontbmp_allocated_height, h); yloop++) { - linebuf = (uint32_t *)(fontbmp->pixdata + (fontbmp_stride * yloop)); - for(xloop = 0; xloop < MIN(fontbmp_allocated_width, w); xloop++){ - fontpix = (uint32_t)(pixdata[(( yoff + yloop ) * pitch) + xloop + xoff]); - linebuf[xloop] = (uint32_t)(colour | fontpix); - } - } - plot_blit_bitmap(fontbmp, loc->g_x, loc->g_y, 0, BITMAPF_MONOGLYPH); -} - -static void draw_glyph1(FONT_PLOTTER self, GRECT * clip, GRECT * loc, uint8_t * pixdata, int pitch, uint32_t colour) -{ - int xloop,yloop,xoff,yoff; - int x,y,w,h; - uint8_t bitm; - const uint8_t *fntd; - - x = loc->g_x; - y = loc->g_y; - w = loc->g_w; - h = loc->g_h; - - if( !rc_intersect( clip, loc ) ){ - return; - } - - xoff = loc->g_x - x; - yoff = loc->g_y - y; - - if (h > loc->g_h) - h = loc->g_h; - - if (w > loc->g_w) - w = loc->g_w; - - int stride = MFDB_STRIDE( w ); - if( tmp.fd_addr == NULL || tmp_mfdb_size < MFDB_SIZE( 1, stride, h) ){ - tmp_mfdb_size = init_mfdb( 1, w, h, MFDB_FLAG_STAND | MFDB_FLAG_ZEROMEM, &tmp ); - } else { - void * buf = tmp.fd_addr; - int size = init_mfdb( 1, w, h, MFDB_FLAG_STAND | MFDB_FLAG_NOALLOC, &tmp ); - tmp.fd_addr = buf; - memset( tmp.fd_addr, 0, size ); - } - short * buf; - for( yloop = 0; yloop < h; yloop++) { - fntd = pixdata + (pitch * (yloop+yoff))+(xoff>>3); - buf = tmp.fd_addr; - buf += (tmp.fd_wdwidth*yloop); - for ( xloop = 0, bitm = (1<<(7-(xoff%8))); xloop < w; xloop++, bitm=(bitm>>1) ) { - if( (*fntd & bitm) != 0 ){ - short whichbit = (1<<(15-(xloop%16))); - buf[xloop>>4] = ((buf[xloop>>4])|(whichbit)); - } - if( bitm == 1 ) { - fntd++; - bitm = 128; - } - } - } -#ifdef WITH_8BPP_SUPPORT - if( app.nplanes > 8 ){ -#endif - plot_blit_mfdb(loc, &tmp, OFFSET_CUSTOM_COLOR, PLOT_FLAG_TRANS ); -#ifdef WITH_8BPP_SUPPORT - } else { - plot_blit_mfdb(loc, &tmp, colour, PLOT_FLAG_TRANS ); - } -#endif - -} - -static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length, - const plot_font_style_t *fstyle ) -{ - uint32_t ucs4; - size_t nxtchr = 0; - FT_Glyph glyph; - FT_BitmapGlyph bglyph; - GRECT loc, clip; - uint32_t c = fstyle->foreground ; - struct rect clipping; - /* in -> BGR */ - /* out -> ARGB */ - if( !(self->flags & FONTPLOT_FLAG_MONOGLYPH) ){ - c = ABGR_TO_RGB(c); - } else { -#ifdef WITH_8BPP_SUPPORT - if( app.nplanes > 8 ){ -#endif - RGB1000 out; /* struct with RGB shorts */ - rgb_to_vdi1000( (unsigned char*)&c, &out); - vs_color(atari_plot_vdi_handle, OFFSET_CUSTOM_COLOR, - (short*)&out); -#ifdef WITH_8BPP_SUPPORT - } else { - c = RGB_TO_VDI(c); - } -#endif - } - - plot_get_clip(&clipping); - clip.g_x = clipping.x0; - clip.g_y = clipping.y0; - clip.g_w = (clipping.x1 - clipping.x0)+1; - clip.g_h = (clipping.y1 - clipping.y0)+1; - - fontbmp = atari_bitmap_realloc( clip.g_w, clip.g_h, - 4, clip.g_w << 2, - BITMAP_GROW, fontbmp ); - fontbmp_stride = atari_bitmap_get_rowstride(fontbmp); - fontbmp_allocated_height = clip.g_h; - fontbmp_allocated_width = clip.g_w; - - while (nxtchr < length) { - ucs4 = utf8_to_ucs4(text + nxtchr, length - nxtchr); - nxtchr = utf8_next(text, length, nxtchr); - - glyph = ft_getglyph(fstyle, ucs4); - if (glyph == NULL){ - continue; - } - - if (glyph->format == FT_GLYPH_FORMAT_BITMAP) { - bglyph = (FT_BitmapGlyph)glyph; - loc.g_x = x + bglyph->left; - loc.g_y = y - bglyph->top; - loc.g_w = bglyph->bitmap.width; - loc.g_h = bglyph->bitmap.rows; - - if( loc.g_w > 0) { - self->draw_glyph( self, - &clip, &loc, - bglyph->bitmap.buffer, - bglyph->bitmap.pitch, - c - ); - } - } - x += glyph->advance.x >> 16; - } - return( 0 ); -} - - -int ctor_font_plotter_freetype( FONT_PLOTTER self ) -{ - self->dtor = dtor; - self->str_width = str_width; - self->str_split = str_split; - self->pixel_pos = pixel_pos; - self->text = text; - - /* set the default render mode */ - if( (self->flags & FONTPLOT_FLAG_MONOGLYPH) != 0 ){ - ft_load_type = FT_LOAD_MONOCHROME; - self->draw_glyph = draw_glyph1; - } - else{ - ft_load_type = 0; - self->draw_glyph = draw_glyph8; - } - - LOG("%s: %s\n", (char *)__FILE__, __FUNCTION__); - if( !init ) { - ft_font_init(); - fontbmp = atari_bitmap_create(48, 48, 0); - fontbmp->opaque = false; - init = true; - } - - return( 1 ); -} - -static int dtor( FONT_PLOTTER self ) -{ - ft_font_finalise(); - if( fontbmp != NULL ) { - atari_bitmap_destroy( fontbmp ); - fontbmp = NULL; - } - if( tmp.fd_addr != NULL ){ - free( tmp.fd_addr ); - } - return( 1 ); -} - -#endif diff --git a/atari/plot/font_freetype.h b/atari/plot/font_freetype.h deleted file mode 100644 index 58a5372a4..000000000 --- a/atari/plot/font_freetype.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2011 Ole Loots <ole@monochrom.net> - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef FONT_PLOTTER_FREETYPE -#define FONT_PLOTTER_FREETYPE - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include "utils/utf8.h" - -/* defines for accesing the faces */ -#define FONT_FACE_DEFAULT 0 - -#define FONT_FACE_SANS_SERIF 0 -#define FONT_FACE_SANS_SERIF_BOLD 1 -#define FONT_FACE_SANS_SERIF_ITALIC 2 -#define FONT_FACE_SANS_SERIF_ITALIC_BOLD 3 -#define FONT_FACE_MONOSPACE 4 -#define FONT_FACE_MONOSPACE_BOLD 5 -#define FONT_FACE_SERIF 6 -#define FONT_FACE_SERIF_BOLD 7 -#define FONT_FACE_CURSIVE 8 -#define FONT_FACE_FANTASY 9 - -#define FONT_FACE_COUNT 10 - -struct font_desc { - const char *name; - int width, height; - const char *encoding; -}; - -/* extern int ft_load_type; */ - -int ctor_font_plotter_freetype( FONT_PLOTTER self ); - -#endif diff --git a/atari/plot/font_internal.c b/atari/plot/font_internal.c deleted file mode 100644 index 89a56d0e5..000000000 --- a/atari/plot/font_internal.c +++ /dev/null @@ -1,2386 +0,0 @@ -/* - * Copyright 2008 Vincent Sanders <vince@simtec.co.uk> - * Copyright 2011 Ole Loots <ole@monochrom.net> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef WITH_INTERNAL_FONT_DRIVER - -#include <assert.h> -#include <unistd.h> - -#include "utils/utf8.h" -#include "utils/log.h" -#include "desktop/mouse.h" -#include "desktop/plot_style.h" - -#include "atari/gui.h" -#include "atari/bitmap.h" -#include "atari/plot/plot.h" -#include "atari/plot/fontplot.h" -#include "atari/plot/font_internal.h" - - -extern unsigned long atari_plot_flags; -extern int atari_plot_vdi_handle; - -static int dtor( FONT_PLOTTER self ); -static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const char * str, size_t length, int * width ); -static int str_split( FONT_PLOTTER self, const plot_font_style_t *fstyle,const char *string, - size_t length,int x, size_t *char_offset, int *actual_x ); -static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle,const char *string, - size_t length,int x, size_t *char_offset, int *actual_x ); -static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length, const plot_font_style_t *fstyle ); - -static bool init = false; -static int vdih; -static struct bitmap * fontbmp; -extern struct s_vdi_sysinfo vdi_sysinfo; - -const struct fb_font_desc font_regular; -const struct fb_font_desc font_italic; -const struct fb_font_desc font_bold; -const struct fb_font_desc font_italic_bold; - -static MFDB tmp; -static int tmp_mfdb_size; - -#define FONTDATAMAX 4096 - -static const struct fb_font_desc* -fb_get_font(const plot_font_style_t *fstyle) -{ - if (fstyle->weight >= 700) { - if ((fstyle->flags & FONTF_ITALIC) || - (fstyle->flags & FONTF_OBLIQUE)) { - return &font_italic_bold; - } else { - return &font_bold; - } - } else { - if ((fstyle->flags & FONTF_ITALIC) || - (fstyle->flags & FONTF_OBLIQUE)) { - return &font_italic; - } else { - return &font_regular; - } - } -} - -static nserror utf8_to_font_encoding(const struct fb_font_desc* font, - const char *string, - size_t len, - char **result) -{ - return utf8_to_enc(string, font->encoding, len, result); - -} - -int ctor_font_plotter_internal( FONT_PLOTTER self ) -{ - self->dtor = dtor; - self->str_width = str_width; - self->str_split = str_split; - self->pixel_pos = pixel_pos; - self->text = text; - LOG("%s: %s\n", (char *)__FILE__, __FUNCTION__); - if( !init ) { - vdih = self->vdi_handle; - fontbmp = atari_bitmap_create(48, 48, 0); - fontbmp->opaque = false; - } - init = true; - return( 1 ); -} - -static int dtor( FONT_PLOTTER self ) -{ - if( tmp.fd_addr != NULL ){ - free( tmp.fd_addr ); - } - return( 1 ); -} - -static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const char * str, - size_t length, int * width ) -{ - const struct fb_font_desc* fb_font = fb_get_font(fstyle); - *width = fb_font->width * utf8_bounded_length(str, length); - return( 1 ); -} - -static int str_split( FONT_PLOTTER self, const plot_font_style_t * fstyle, const char *string, - size_t length,int x, size_t *char_offset, int *actual_x ) -{ - const struct fb_font_desc* fb_font = fb_get_font(fstyle); - int c_off = *char_offset = x / fb_font->width; - if (*char_offset > length) { - *char_offset = length; - } else { - while (*char_offset > 0) { - if (string[*char_offset] == ' ') - break; - (*char_offset)--; - } - if (*char_offset == 0) { - *char_offset = c_off; - while (*char_offset < length && - string[*char_offset] != ' ') { - (*char_offset)++; - } - } - } - *actual_x = *char_offset * fb_font->width; - return( 1 ); -} - -static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t * fstyle,const char *string, - size_t length,int x, size_t *char_offset, int *actual_x ) -{ - const struct fb_font_desc* fb_font = fb_get_font(fstyle); - *char_offset = x / fb_font->width; - if (*char_offset > length) - *char_offset = length; - *actual_x = *char_offset * fb_font->width; - return( 1 ); -} - -static void draw_glyph1(FONT_PLOTTER self, GRECT *inloc, uint8_t *chrp, int pitch, uint32_t colour ) -{ - size_t bmpstride; - GRECT clip; - uint32_t * fontdata; - int xloop,yloop; - int stride = pitch / 8; - uint32_t * linebuf; - GRECT loc = *inloc; - - fontbmp = atari_bitmap_realloc( loc.g_w, loc.g_h, fontbmp->bpp, loc.g_w * fontbmp->bpp, BITMAP_GROW, fontbmp ); - bmpstride = atari_bitmap_get_rowstride(fontbmp); - for( yloop = 0; yloop < loc.g_h; yloop++) { - uint32_t pixmask = 1 ; - linebuf = (uint32_t *)(fontbmp->pixdata + (bmpstride * yloop)); - fontdata = (uint32_t*)(chrp + (stride*yloop)); - for(xloop = loc.g_w-1; xloop>=0; xloop--){ - linebuf[xloop] = ((pixmask & *fontdata) == 0) ? 0 : colour; - pixmask = (pixmask << 1); - } - } - plot_blit_bitmap(fontbmp, loc.g_x, loc.g_y, 0, BITMAPF_MONOGLYPH ); -} - -static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length, - const plot_font_style_t *fstyle ) -{ - const struct fb_font_desc* fb_font = fb_get_font(fstyle); - const uint32_t *chrp; - char *buffer = NULL; - int chr; - int blen; - GRECT loc; - uint32_t c; - - utf8_to_font_encoding(fb_font, text, length, &buffer); - if (buffer == NULL) - return 1; - - /* y is given to the fonts baseline we need it to the fonts top */ - y-=((fb_font->height * 75)/100); - - /* needed? */ - y+=1; /* the coord is the bottom-left of the pixels offset by 1 to make - * it work since fb coords are the top-left of pixels - */ - blen = strlen(buffer); - if ( blen < 1 ) { - return( 1 ); - } - - if(atari_plot_flags & PLOT_FLAG_OFFSCREEN ){ - /* when the plotter is an offscreen plotter the call to - bitmap() isn't that expensive. Draw an 8 bit bitmap into the - offscreen buffer. - */ - c = fstyle->foreground; - /* in -> BGR */ - /* out -> ARGB */ - c = (ABGR_TO_RGB(c) | 0xFF); - loc.g_y = y; - loc.g_x = x; - loc.g_w = fb_font->width; - loc.g_h = fb_font->height; - for (chr = 0; chr < blen; chr++) { - loc.g_x = x; - chrp = fb_font->data + ((unsigned char)buffer[chr] * fb_font->height); - draw_glyph1(self, &loc, (uint8_t *)chrp, 32, c); - x+=fb_font->width; - } - } else { - /* render the whole string into an monochrom mfdb */ - /* and plot that to reduce overhead */ - loc.g_x = x; - loc.g_y = y; - loc.g_w = blen * fb_font->width; - assert( loc.g_w > 0 ); - loc.g_h = fb_font->height; - int stride = MFDB_STRIDE( loc.g_w ); - if( tmp.fd_addr == NULL || tmp_mfdb_size < MFDB_SIZE( 1, stride, loc.g_h) ){ - tmp_mfdb_size = init_mfdb( 1, loc.g_w, loc.g_h+1, MFDB_FLAG_STAND | MFDB_FLAG_ZEROMEM, &tmp ); - } else { - void * buf = tmp.fd_addr; - int size = init_mfdb( 1, loc.g_w, loc.g_h+1, MFDB_FLAG_STAND | MFDB_FLAG_NOALLOC, &tmp ); - tmp.fd_addr = buf; - memset( tmp.fd_addr, 0, size ); - } - short ypos; - int rowsize = tmp.fd_wdwidth << 1; - char * d; - uint32_t * pp; - for (chr = 0; chr < blen; chr++) { - pp = (uint32_t*)fb_font->data + ((unsigned char)buffer[chr] * fb_font->height); - d = ((uint8_t*)tmp.fd_addr) + chr; - for( ypos=0; ypos<loc.g_h; ypos++){ - *d = (unsigned char)*pp++; - d += rowsize; - } - } -#ifdef WITH_8BPP_SUPPORT - if( app.nplanes > 8 ){ -#endif - //unsigned short out[4]; - RGB1000 out; - //rgb_to_vdi1000( (unsigned char*)&fstyle->foreground, (unsigned short*)&out ); - out.blue = 0; - out.green = 1000; - out.red = 0; - vs_color(atari_plot_vdi_handle, OFFSET_CUSTOM_COLOR, (short *)&out); - vq_color(atari_plot_vdi_handle, OFFSET_CUSTOM_COLOR, 1, (short *)&out); - //printf("r:%d,g:%d,b:%d", out.red, out.green, out.blue); - //vsl_color(atari_plot_vdi_handle, OFFSET_CUSTOM_COLOR); - //vsf_color(atari_plot_vdi_handle, OFFSET_CUSTOM_COLOR); - plot_blit_mfdb(&loc, &tmp, OFFSET_CUSTOM_COLOR, PLOT_FLAG_TRANS); -#ifdef WITH_8BPP_SUPPORT - } else { - unsigned char c = RGB_TO_VDI(fstyle->foreground); - plot_blit_mfdb(&loc, &tmp, c, PLOT_FLAG_TRANS ); - } -#endif - } - - free(buffer); - return( 1 ); -} - -/* ------------------*/ -/* Fontdata */ -/* ------------------*/ - -static const uint32_t fontdata_bold[FONTDATAMAX] = { - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xE4, 0xAC, 0xA4, 0xA4, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEC, 0xA2, 0xA4, 0xA8, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEC, 0xA2, 0xAC, 0xA2, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEA, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xA8, 0xAE, 0xA2, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xE6, 0xA8, 0xAE, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xA2, 0xA4, 0xA4, 0xE4, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xAA, 0xAE, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xE4, 0xAA, 0xAE, 0xAA, 0xEA, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEC, 0xAA, 0xAC, 0xAA, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xE4, 0xAA, 0xA8, 0xAA, 0xE4, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEC, 0xAA, 0xAA, 0xAA, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xE8, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xCA, 0x4A, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x44, 0xCC, 0x44, 0x44, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4C, 0xC2, 0x44, 0x48, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4C, 0xC2, 0x4C, 0x42, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4A, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xC8, 0x4E, 0x42, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x46, 0xC8, 0x4E, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xC2, 0x44, 0x44, 0xE4, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xCA, 0x4E, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x44, 0xCA, 0x4E, 0x4A, 0xEA, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4C, 0xCA, 0x4C, 0x4A, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x44, 0xCA, 0x48, 0x4A, 0xE4, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4C, 0xCA, 0x4A, 0x4A, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xE8, 0x00, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, - 0x1C, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6C, 0x6C, 0xFE, 0xFE, 0xFE, 0x6C, 0x6C, - 0xFE, 0xFE, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x7C, 0xFE, 0xF6, 0xF0, 0xF8, 0x7C, - 0x3E, 0x1E, 0xDE, 0xFE, 0x7C, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE6, 0xEE, 0x1C, - 0x38, 0x70, 0xEE, 0xCE, 0x0E, 0x00, 0x00, 0x00, - 0x00, 0x70, 0xF8, 0xF8, 0xF8, 0xF8, 0x76, 0xFE, - 0xFE, 0xEC, 0xEE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x0C, 0x1C, 0x38, 0x38, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x38, 0x38, 0x1C, 0x0C, 0x06, 0x00, - 0x60, 0x30, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x0E, - 0x0E, 0x0E, 0x1C, 0x1C, 0x38, 0x30, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x54, 0xFE, 0x7C, 0x38, - 0x7C, 0xFE, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0xFE, - 0xFE, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x78, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, - 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1E, 0x3C, - 0x78, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x7C, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0x7C, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x38, 0x78, 0x78, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0x0E, 0x0E, 0x7E, 0xFC, - 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0x0E, 0x0E, 0x3C, 0x3C, - 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x0C, 0x1C, 0x3C, 0x7C, 0x6C, 0xEC, - 0xFE, 0xFE, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xFC, 0xFE, 0x0E, - 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFC, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0x0E, 0x0E, 0x1C, 0x1C, 0x1C, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xFE, 0x7C, 0xFE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, - 0x0E, 0x0E, 0x0E, 0x7C, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, - 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, - 0x00, 0x18, 0x38, 0x38, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x0E, 0x1C, 0x38, 0x70, - 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, - 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x70, 0x38, 0x1C, 0x0E, - 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0x0E, 0x0E, 0x3E, 0x7C, - 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFE, - 0xEC, 0xE0, 0xE0, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFE, - 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0xFC, 0xFE, 0xEE, 0xEE, 0xEE, 0xFC, 0xFC, - 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xE0, 0xE0, 0xE0, - 0xE0, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xF8, 0xFC, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xF8, 0xF8, - 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xF8, 0xF8, - 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xE0, 0xE0, 0xFE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, - 0x0E, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xE0, 0xE6, 0xEE, 0xFE, 0xFC, 0xF8, 0xF0, - 0xF8, 0xFC, 0xFE, 0xEE, 0xE6, 0x00, 0x00, 0x00, - 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, - 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xFE, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0xCE, 0xEE, 0xEE, 0xFE, 0xFE, 0xFE, 0xFE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xE6, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xFC, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFE, - 0xFC, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xFE, 0xFE, 0xFE, 0x7E, 0x06, 0x00, 0x00, - 0x00, 0xFC, 0xFE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xE0, 0xE0, 0xFC, 0x7E, - 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0x6C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xFE, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0x7C, 0x38, 0x38, - 0x7C, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x7C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0x0E, 0x0E, 0x1C, 0x38, 0x38, - 0x70, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x3E, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x3E, 0x3E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0xE0, 0xF0, 0x78, - 0x3C, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFC, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, - 0x1C, 0x1C, 0x1C, 0xFC, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x30, 0x38, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x0E, - 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xEE, - 0xE0, 0xE0, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x7E, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7E, 0x70, 0x70, 0x70, 0xF8, 0xF8, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0x7E, 0x7C, - 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x38, 0x00, 0x78, 0x78, 0x38, - 0x38, 0x38, 0x38, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x3C, 0x3C, 0x1C, - 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x7C, 0x78, - 0x00, 0xE0, 0xE0, 0xE0, 0xE6, 0xEE, 0xFE, 0xFC, - 0xF8, 0xFC, 0xFE, 0xEE, 0xE6, 0x00, 0x00, 0x00, - 0x00, 0x78, 0x78, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xFE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0xE0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0x0F, 0x0F, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xFE, 0xE0, - 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xE0, - 0xFC, 0x7E, 0x0E, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x30, 0x70, 0x70, 0xFC, 0xFC, 0x70, - 0x70, 0x70, 0x70, 0x7E, 0x3E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE, - 0xFE, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE, - 0x7C, 0x7C, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0x0E, 0xFE, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x1E, - 0x3C, 0x78, 0xF0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3E, 0x38, 0x38, 0x38, 0xF0, 0xF0, - 0x38, 0x38, 0x38, 0x3E, 0x1E, 0x00, 0x00, 0x00, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, - 0x00, 0xF0, 0xF8, 0x38, 0x38, 0x38, 0x1E, 0x1E, - 0x38, 0x38, 0x38, 0xF8, 0xF0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0xFE, 0xFE, 0xCC, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0x28, 0x4C, 0x48, 0x48, 0x00, 0xFE, - 0x00, 0x38, 0x7C, 0xEE, 0xE0, 0xFC, 0xE0, 0xF8, - 0xE0, 0xE0, 0xEE, 0x7C, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x38, 0x18, 0x30, 0x00, - 0x00, 0x3E, 0x7E, 0x70, 0x70, 0x70, 0xF8, 0xF8, - 0x70, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xEE, 0xEE, 0x66, 0xCC, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x38, 0xFE, 0xFE, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0xFE, 0xFE, 0x38, 0xFE, - 0xFE, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, - 0x00, 0x7C, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xCE, 0x1C, - 0x38, 0x70, 0xE0, 0xDB, 0x1B, 0x00, 0x00, 0x00, - 0xEE, 0x7C, 0x00, 0x7C, 0xFE, 0xEE, 0xE0, 0xFC, - 0x7E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x1C, - 0x38, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, - 0x00, 0x7F, 0xFF, 0xEE, 0xEE, 0xEE, 0xEF, 0xEF, - 0xEE, 0xEE, 0xEE, 0xFF, 0x7F, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0xEE, 0x7C, 0x00, 0xFE, 0xFE, 0x0E, 0x1E, 0x3C, - 0x78, 0xF0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x30, 0x30, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x36, 0x6C, 0x6C, 0x6C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x36, 0x36, 0x36, 0x6C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, - 0x7E, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7B, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF1, 0xFB, 0x5F, 0x55, 0x51, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0x7C, 0x38, 0x00, 0x7E, 0xFE, 0xE0, - 0xFC, 0x7E, 0x0E, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x38, - 0x1C, 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFA, - 0xDE, 0xDE, 0xFC, 0xFE, 0x6E, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0x7C, 0x38, 0x00, 0xFE, 0xFE, 0x1E, - 0x3C, 0x78, 0xF0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0x7C, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0xFE, 0xD6, - 0xD0, 0xD0, 0xD6, 0xFE, 0x7C, 0x10, 0x10, 0x00, - 0x00, 0x3C, 0x7E, 0x76, 0x70, 0xFC, 0xFC, 0xFC, - 0x70, 0x76, 0xFE, 0xFE, 0xDC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0x7C, 0xFE, - 0xFE, 0xFE, 0xFE, 0x7C, 0xEE, 0xEE, 0x00, 0x00, - 0x00, 0x00, 0xEE, 0xEE, 0xEE, 0x7C, 0x38, 0xFE, - 0x38, 0xFE, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7C, 0x7C, 0x70, 0x3C, 0x7E, 0x66, - 0x7E, 0x3C, 0x0E, 0x3E, 0x3E, 0x3C, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7E, 0xC3, 0x99, 0xBD, 0xA5, 0xA1, - 0xA5, 0xBD, 0x99, 0xC3, 0x7E, 0x3C, 0x00, 0x00, - 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, 0xFC, - 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, - 0x7C, 0xF8, 0xF8, 0x7C, 0x3E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x06, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7E, 0xC3, 0xB9, 0xBD, 0xA5, 0xB9, - 0xB9, 0xA5, 0xA5, 0xC3, 0x7E, 0x3C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x78, 0xFC, 0xCC, 0xFC, 0x78, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x38, 0xFE, 0xFE, 0xFE, 0x38, - 0x38, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0xF8, 0x18, 0x78, 0xF0, 0xC0, - 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0xF8, 0x18, 0x30, 0x18, 0xF8, - 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0xC0, - 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x1C, 0x0C, 0x1C, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x60, 0xE0, 0x60, 0x60, 0x60, 0xF0, - 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0xF8, 0x88, 0xF8, 0x70, 0x00, 0xF8, - 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, - 0x6C, 0x36, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0xE0, 0x62, 0x66, 0xFE, 0x1C, - 0x38, 0x76, 0xEE, 0xD6, 0x3E, 0x3E, 0x06, 0x00, - 0x00, 0x00, 0x60, 0xE0, 0x62, 0x66, 0xFE, 0x1C, - 0x38, 0x70, 0xFC, 0xC6, 0x0C, 0x18, 0x1E, 0x00, - 0x00, 0x00, 0xE0, 0x30, 0x62, 0x36, 0xEE, 0x1C, - 0x3A, 0x76, 0xEE, 0xD6, 0x3E, 0x3E, 0x06, 0x00, - 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x1C, 0x1C, - 0x7C, 0xF8, 0xE0, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, - 0x00, 0xE0, 0x70, 0x00, 0x10, 0x38, 0x7C, 0xEE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1C, 0x00, 0x10, 0x38, 0x7C, 0xEE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0xC6, 0x10, 0x38, 0x7C, 0xEE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xDC, 0x00, 0x10, 0x38, 0x7C, 0xEE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0x10, 0x38, 0x7C, 0xEE, 0xFE, - 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x38, 0x38, 0x7C, 0xEE, 0xFE, - 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0x3F, 0x7F, 0xFE, 0xEE, 0xFF, 0xFF, - 0xFE, 0xEE, 0xEF, 0xEF, 0xEF, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xE0, 0xE0, 0xE0, 0xE0, - 0xE0, 0xE0, 0xEE, 0xFE, 0x7C, 0x0E, 0x6E, 0x7C, - 0x00, 0x70, 0x38, 0x00, 0xFE, 0xFE, 0xE0, 0xE0, - 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x38, 0x00, 0xFE, 0xFE, 0xE0, 0xE0, - 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xEE, 0x00, 0xFE, 0xFE, 0xE0, 0xE0, - 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0xEE, 0xEE, 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xF8, - 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x38, 0x00, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x38, 0x00, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0xEE, 0xEE, 0x00, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF8, 0xFC, 0xEE, 0xEE, 0xEE, 0xFE, - 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xDC, 0x00, 0xEE, 0xEE, 0xEE, 0xF6, - 0xFE, 0xDE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x38, 0x00, 0x7C, 0xFE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x38, 0x00, 0x7C, 0xFE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xEE, 0x00, 0x7C, 0xFE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xDC, 0x00, 0x7C, 0xFE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0xEE, 0xEE, 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xEE, 0x7C, - 0x38, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x7A, 0xFC, 0xEE, 0xEE, 0xEE, 0xFE, 0xFE, - 0xFE, 0xEE, 0xEE, 0xFE, 0x7C, 0x80, 0x00, 0x00, - 0x00, 0x70, 0x38, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x38, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x38, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, - 0x7C, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE, 0xEE, - 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, - 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xC0, 0x00, - 0x00, 0x00, 0x70, 0x38, 0x00, 0x7C, 0x7E, 0x0E, - 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x38, 0x00, 0x7C, 0x7E, 0x0E, - 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x7C, 0x7E, 0x0E, - 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x76, 0xDC, 0x00, 0x7C, 0x7E, 0x0E, - 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x7C, 0x7E, 0x0E, - 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x38, 0x00, 0x7C, 0x7E, 0x0E, - 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x74, 0x7E, 0x7E, 0x1A, - 0x7E, 0xFE, 0xD8, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, - 0xEE, 0xE0, 0xEE, 0xFE, 0x7C, 0x1C, 0x7E, 0x7C, - 0x00, 0x00, 0x70, 0x38, 0x00, 0x7C, 0xFE, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x70, 0x00, 0x7C, 0xFE, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x7C, 0xFE, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x7C, 0xFE, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x38, 0x00, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x38, 0x00, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0xEC, 0x7C, 0xF8, 0xFC, 0x7E, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xFE, 0xDC, 0x00, 0xFC, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0x70, 0x00, 0x7C, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x70, 0x00, 0x7C, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x7C, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xFE, 0xDC, 0x00, 0x7C, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x7C, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0xFE, - 0xFE, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x7C, 0xFE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x80, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0x70, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x70, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x7C, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x38, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0xFE, 0xFC, - 0x00, 0x00, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, - 0x00, 0x00, 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0xFE, 0xFC, -}; - -const struct fb_font_desc font_bold = { - .name = "NetSurf Bold", - .width = 8, - .height = 16, - .encoding = "CP1252", - .data = fontdata_bold, -}; - - -static const uint32_t fontdata_italic[FONTDATAMAX] = { - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xE4, 0xAC, 0xA4, 0xA4, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEC, 0xA2, 0xA4, 0xA8, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEC, 0xA2, 0xAC, 0xA2, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEA, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xA8, 0xAE, 0xA2, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xE6, 0xA8, 0xAE, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xA2, 0xA4, 0xA4, 0xE4, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xAA, 0xAE, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xE4, 0xAA, 0xAE, 0xAA, 0xEA, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEC, 0xAA, 0xAC, 0xAA, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xE4, 0xAA, 0xA8, 0xAA, 0xE4, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEC, 0xAA, 0xAA, 0xAA, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xE8, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xCA, 0x4A, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x44, 0xCC, 0x44, 0x44, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4C, 0xC2, 0x44, 0x48, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4C, 0xC2, 0x4C, 0x42, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4A, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xC8, 0x4E, 0x42, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x46, 0xC8, 0x4E, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xC2, 0x44, 0x44, 0xE4, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xCA, 0x4E, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x44, 0xCA, 0x4E, 0x4A, 0xEA, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4C, 0xCA, 0x4C, 0x4A, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x44, 0xCA, 0x48, 0x4A, 0xE4, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4C, 0xCA, 0x4A, 0x4A, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xE8, 0x00, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, - 0x0C, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x36, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1B, 0x1B, 0x1B, 0x7F, 0x7F, 0x36, 0x36, - 0xFF, 0xFF, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x3E, 0x7F, 0x6B, 0x68, 0x78, 0x3C, - 0x1E, 0x16, 0xD6, 0xFE, 0x7C, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xCE, 0x1C, - 0x38, 0x70, 0xE6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x3E, 0x36, 0x36, 0x3C, 0x39, 0x7F, - 0x6E, 0xCC, 0xCC, 0xFE, 0x7A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x06, 0x0C, 0x0C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x0E, 0x1C, 0x38, 0x30, 0x60, 0x60, 0xC0, - 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x70, 0x30, 0x00, - 0x18, 0x1C, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x0C, 0x0C, 0x18, 0x38, 0x70, 0xE0, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x1C, 0x7F, - 0xFE, 0x38, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, - 0xFC, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x38, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFC, - 0x00, 0x00, 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, 0x06, 0x0E, 0x1C, - 0x38, 0x70, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x67, 0x6E, 0x76, - 0xE6, 0xCC, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x0E, 0x1E, 0x3C, 0x0C, 0x0C, 0x18, - 0x18, 0x18, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x03, 0x07, 0x1E, 0x7C, - 0x60, 0xC0, 0xC0, 0xFC, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x03, 0x06, 0x1E, 0x1E, - 0x06, 0x06, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1E, 0x36, 0x7F, - 0x7F, 0x0C, 0x0C, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0x1F, 0x30, 0x30, 0x7C, 0x7E, 0x06, - 0x06, 0x06, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x0F, 0x1F, 0x38, 0x30, 0x60, 0x7C, 0x7E, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3F, 0x7F, 0x63, 0x03, 0x06, 0x06, 0x0C, - 0x0C, 0x18, 0x18, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x33, 0x1E, 0x7C, - 0x66, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x63, 0x63, 0x7E, 0x3E, - 0x06, 0x0C, 0x1C, 0xF8, 0xF0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, - 0x00, 0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x0E, 0x1C, 0x38, 0x70, 0x70, - 0x70, 0x38, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x00, - 0x7C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x0E, - 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x03, 0x07, 0x0E, - 0x1C, 0x18, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x63, 0x6F, 0x6B, 0x6B, - 0xCF, 0xCE, 0xC0, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x66, 0x7E, 0x7E, - 0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x3F, 0x33, 0x63, 0x63, 0x7E, 0x7C, - 0x66, 0xC6, 0xC6, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x30, 0x60, 0x60, 0x60, - 0x60, 0xC0, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x3F, 0x33, 0x63, 0x63, 0x63, 0x63, - 0xC3, 0xC6, 0xCE, 0xFC, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x3F, 0x3F, 0x30, 0x30, 0x60, 0x7C, 0x7C, - 0x60, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x3F, 0x3F, 0x30, 0x30, 0x60, 0x7C, 0x7C, - 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x30, 0x60, 0x60, 0x6E, - 0x6E, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x33, 0x33, 0x33, 0x63, 0x66, 0x7E, 0x7E, - 0xC6, 0xC6, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, - 0x00, 0x3F, 0x3F, 0x0C, 0x0C, 0x18, 0x18, 0x18, - 0x18, 0x30, 0x30, 0xFC, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, - 0x06, 0x0C, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x30, 0x33, 0x36, 0x7C, 0x78, 0x70, - 0x78, 0xF8, 0xDC, 0xCE, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, - 0x60, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x33, 0x33, 0x3F, 0x3F, 0x7F, 0x6B, 0x66, - 0x66, 0xC6, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, - 0x00, 0x33, 0x33, 0x3B, 0x3B, 0x7B, 0x7E, 0x6E, - 0x6E, 0xCE, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x63, 0x66, 0x66, - 0xC6, 0xCC, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x3F, 0x33, 0x33, 0x67, 0x7E, 0x7C, - 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x63, 0x66, 0x66, - 0xC6, 0xF6, 0xDC, 0xF8, 0x7C, 0x0C, 0x00, 0x00, - 0x00, 0x3E, 0x3F, 0x33, 0x33, 0x63, 0x7E, 0x7C, - 0x6E, 0xC6, 0xC6, 0xCC, 0xCC, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x60, 0x60, 0x7C, 0x3E, - 0x06, 0x06, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x18, 0x18, 0x30, 0x30, 0x30, - 0x30, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x33, 0x33, 0x33, 0x33, 0x63, 0x66, 0x66, - 0x66, 0xC6, 0xCC, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x33, 0x33, 0x33, 0x33, 0x63, 0x63, 0x66, - 0x66, 0x6C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x33, 0x33, 0x33, 0x33, 0x63, 0x63, 0x6B, - 0x6B, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x63, 0x63, 0x77, 0x3E, 0x1C, 0x38, - 0x7C, 0xEE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x3C, 0x18, - 0x18, 0x30, 0x30, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x03, 0x07, 0x0E, 0x0C, 0x18, - 0x38, 0x70, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x0F, 0x0F, 0x0C, 0x0C, 0x18, 0x18, 0x18, - 0x18, 0x30, 0x30, 0x3E, 0x3E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x70, - 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0x1F, 0x03, 0x03, 0x06, 0x06, 0x06, - 0x06, 0x0C, 0x0C, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x0E, 0x1F, 0x3B, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, - 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x0C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3E, 0x06, - 0x7E, 0xFC, 0xCC, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x18, 0x30, 0x30, 0x3E, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x66, - 0xC0, 0xC0, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x03, 0x03, 0x06, 0x3E, 0x7E, 0x66, - 0xC6, 0xCC, 0xCC, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x66, - 0xFE, 0xFC, 0xC0, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x0F, 0x0C, 0x18, 0x7E, 0x7E, 0x30, - 0x30, 0x30, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x0C, 0xFC, 0xF8, - 0x00, 0x00, 0x30, 0x30, 0x30, 0x6E, 0x7F, 0x73, - 0x63, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x06, 0x00, 0x1C, 0x3C, 0x0C, - 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x00, 0x0E, 0x1E, 0x06, - 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0xF8, 0xF0, - 0x00, 0x30, 0x30, 0x30, 0x33, 0x67, 0x6E, 0x7C, - 0x7C, 0xDC, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x0E, 0x06, 0x06, 0x0C, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x7F, 0x7F, - 0x6B, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x7E, 0x76, - 0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x66, - 0x66, 0xCC, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3F, 0x33, - 0x63, 0x66, 0x66, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x0C, 0x0E, 0x0E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x70, - 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x60, - 0x7C, 0x3E, 0x06, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x06, 0x0C, 0x0C, 0x3F, 0x3F, 0x18, - 0x18, 0x30, 0x30, 0x3E, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x66, - 0x66, 0x66, 0xCC, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, - 0xCC, 0xCC, 0xF8, 0x70, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x63, - 0x6B, 0xDE, 0xFE, 0xFE, 0x6C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x77, - 0x3E, 0x7C, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x0C, 0xFC, 0xF8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x07, - 0x1E, 0x78, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x0E, 0x0C, 0x0C, 0x18, 0x70, 0x70, - 0x18, 0x18, 0x30, 0x38, 0x1C, 0x00, 0x00, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, - 0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x00, - 0x00, 0x38, 0x1C, 0x0C, 0x18, 0x18, 0x0E, 0x0E, - 0x18, 0x30, 0x30, 0x70, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1D, 0x3F, 0x37, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0x28, 0x4C, 0x48, 0x48, 0x00, 0xFE, - 0x00, 0x06, 0x0F, 0x1B, 0x18, 0x7E, 0x30, 0x7C, - 0x60, 0x60, 0x6C, 0x3C, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x10, 0x20, 0x00, - 0x00, 0x07, 0x0F, 0x0C, 0x18, 0x7E, 0x7E, 0x30, - 0x30, 0x30, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x66, 0x66, 0x44, 0x88, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xDB, 0xDB, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x06, 0x06, 0x1F, 0x3F, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, - 0x00, 0x06, 0x06, 0x06, 0x1F, 0x3F, 0x0C, 0x3F, - 0x3F, 0x18, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, - 0x00, 0x3E, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x63, 0x06, - 0x0C, 0x30, 0x60, 0xDB, 0x9B, 0x00, 0x00, 0x00, - 0x63, 0x3E, 0x00, 0x1E, 0x3F, 0x33, 0x60, 0x7C, - 0x3E, 0x06, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E, - 0x1C, 0x30, 0x38, 0x1C, 0x0C, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0x3F, 0x33, 0x33, 0x66, 0x67, 0x67, - 0x66, 0xCC, 0xCC, 0xFF, 0x7F, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x63, 0x3E, 0x00, 0x7F, 0x7F, 0x03, 0x07, 0x0E, - 0x18, 0x70, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x08, 0x10, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0C, 0x04, 0x08, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x09, 0x12, 0x1B, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x09, 0x12, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3F, - 0x3F, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x19, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFB, 0xFF, 0x55, 0xA2, 0xA2, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x36, 0x1C, 0x00, 0x3F, 0x7F, 0x60, - 0x7C, 0x3E, 0x06, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1C, - 0x0E, 0x0C, 0x1C, 0x38, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x7F, 0x6D, - 0x6F, 0xDE, 0xD8, 0xFE, 0x6E, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x36, 0x1C, 0x00, 0x7F, 0x7F, 0x07, - 0x1E, 0x78, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x33, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x3C, - 0x18, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, - 0x0C, 0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x04, 0x3E, 0x7F, 0x6B, - 0x68, 0xD0, 0xD6, 0xFE, 0x7C, 0x20, 0x20, 0x00, - 0x00, 0x0F, 0x1F, 0x19, 0x18, 0x30, 0x7C, 0x7C, - 0x30, 0x60, 0xE6, 0xFE, 0xDC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x19, 0x33, 0x1E, 0x3F, - 0x33, 0x66, 0x7E, 0x3C, 0x66, 0xCC, 0x00, 0x00, - 0x00, 0x00, 0x19, 0x19, 0x19, 0x1E, 0x0C, 0x3F, - 0x0C, 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x06, 0x0C, 0x0C, 0x00, - 0x00, 0x18, 0x18, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x0E, 0x18, 0x18, 0x3C, 0x7E, 0x66, - 0x7E, 0x3C, 0x18, 0x18, 0x70, 0xE0, 0x00, 0x00, - 0x00, 0x00, 0x33, 0x66, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1F, 0x21, 0x21, 0x4D, 0x51, 0x51, - 0x91, 0xA1, 0x9A, 0x82, 0x7C, 0x38, 0x00, 0x00, - 0x00, 0x1C, 0x02, 0x1E, 0x22, 0x3C, 0x00, 0x7C, - 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, - 0x36, 0xD8, 0xD8, 0x6C, 0x36, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1E, 0x3E, 0x06, 0x0C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1F, 0x21, 0x49, 0x55, 0x55, 0x59, - 0x99, 0xA5, 0xA5, 0x82, 0x7E, 0x78, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x3F, 0x3C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x06, 0x3F, 0x3F, 0x0C, - 0x0C, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x3E, 0x06, 0x3C, 0x78, 0x60, - 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x3E, 0x06, 0x18, 0x0C, 0x7C, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, - 0x33, 0x66, 0x66, 0x7E, 0x7C, 0xC0, 0xC0, 0x80, - 0x00, 0x00, 0x00, 0x3F, 0x6F, 0xDB, 0xDB, 0x7B, - 0x1B, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x1C, 0x0C, 0x1C, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x38, 0x18, 0x30, 0x30, 0x78, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x1E, 0x22, 0x3C, 0x18, 0x00, 0x3C, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, - 0x36, 0x36, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x30, 0x10, 0x23, 0x76, 0x0C, - 0x18, 0x64, 0xCC, 0x94, 0x3E, 0x08, 0x08, 0x00, - 0x00, 0x00, 0x10, 0x30, 0x10, 0x23, 0x76, 0x0C, - 0x18, 0x60, 0xDC, 0x82, 0x1C, 0x20, 0x3C, 0x00, - 0x00, 0x00, 0x38, 0x04, 0x18, 0x0B, 0x76, 0x0C, - 0x18, 0x64, 0xCC, 0x96, 0x3E, 0x08, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, - 0x3C, 0x70, 0xC0, 0xC6, 0xC6, 0xFC, 0x78, 0x00, - 0x00, 0x18, 0x0C, 0x00, 0x04, 0x1C, 0x36, 0x63, - 0x7F, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x06, 0x00, 0x04, 0x1C, 0x36, 0x63, - 0x7F, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1B, 0x11, 0x04, 0x1C, 0x36, 0x63, - 0x7F, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x1D, 0x37, 0x00, 0x04, 0x1C, 0x36, 0x63, - 0x7F, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x1B, 0x1B, 0x04, 0x0E, 0x36, 0x63, 0x7F, - 0x7F, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x11, 0x0E, 0x0E, 0x36, 0x63, 0x7F, - 0x7F, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x0F, 0x1F, 0x3B, 0x66, 0x7F, 0x7F, - 0x66, 0xCC, 0xCC, 0xCF, 0xCF, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x33, 0x30, 0x60, 0x60, 0x60, - 0x60, 0xC0, 0xC6, 0xFE, 0x7C, 0x1C, 0xCC, 0x78, - 0x00, 0x0C, 0x06, 0x00, 0x3F, 0x7F, 0x60, 0x78, - 0x78, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x06, 0x00, 0x3F, 0x7F, 0x60, 0x78, - 0x78, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1B, 0x00, 0x3F, 0x7F, 0x60, 0x78, - 0x78, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x1B, 0x1B, 0x00, 0x3F, 0x3F, 0x60, 0x60, 0x78, - 0x78, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x06, 0x00, 0x1F, 0x1F, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x06, 0x00, 0x1F, 0x1F, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x09, 0x1F, 0x1F, 0x0C, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1B, 0x1B, 0x00, 0x1F, 0x1F, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1E, 0x1F, 0x1B, 0x33, 0x33, 0x7B, - 0x33, 0x66, 0x6E, 0x7C, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x1D, 0x37, 0x00, 0x31, 0x63, 0x73, 0x7B, - 0x7F, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x06, 0x00, 0x3E, 0x7F, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x06, 0x00, 0x3E, 0x7F, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1B, 0x00, 0x3E, 0x7F, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1D, 0x37, 0x00, 0x3E, 0x7F, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1B, 0x1B, 0x00, 0x3E, 0x7F, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x77, 0x3E, - 0x1C, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x1D, 0x3E, 0x37, 0x6B, 0x6B, 0x6B, 0xD6, - 0xD6, 0xD6, 0xEE, 0x7C, 0xB8, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x06, 0x00, 0x33, 0x33, 0x63, 0x66, - 0x66, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x06, 0x00, 0x33, 0x33, 0x63, 0x66, - 0x66, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1B, 0x00, 0x33, 0x33, 0x63, 0x66, - 0x66, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x1B, 0x1B, 0x00, 0x33, 0x33, 0x63, 0x63, 0x63, - 0x66, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x0C, 0x00, 0x33, 0x33, 0x66, 0x6E, - 0x7C, 0x38, 0x30, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x1F, 0x3F, 0x33, 0x33, - 0x3F, 0x7C, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1F, 0x1B, 0x1B, 0x33, 0x3F, 0x3E, - 0x33, 0x66, 0x66, 0x7E, 0x7C, 0xC0, 0x80, 0x00, - 0x00, 0x00, 0x0C, 0x06, 0x00, 0x3F, 0x7F, 0x63, - 0x63, 0xCE, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x0C, 0x00, 0x3F, 0x7F, 0x63, - 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x0E, 0x1B, 0x00, 0x3F, 0x7F, 0x63, - 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1D, 0x37, 0x00, 0x3F, 0x7F, 0x63, - 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x3F, 0x7F, 0x63, - 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1B, 0x0E, 0x00, 0x3E, 0x7F, 0x63, - 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x3F, 0x0D, - 0x1F, 0x7E, 0xD8, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, - 0x63, 0xC0, 0xC6, 0xFE, 0x7C, 0x30, 0xF8, 0xF0, - 0x00, 0x00, 0x0C, 0x06, 0x00, 0x3E, 0x7F, 0x63, - 0x7F, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x0C, 0x00, 0x3E, 0x7F, 0x63, - 0x7F, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x0E, 0x1B, 0x00, 0x3E, 0x7F, 0x63, - 0x7F, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x3E, 0x7F, 0x63, - 0x7F, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x06, 0x00, 0x0C, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x0F, 0x19, 0x00, 0x0C, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x0C, 0x0C, 0x0C, - 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x1B, 0x1F, 0x3E, 0x37, 0x3E, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1D, 0x3F, 0x37, 0x00, 0x7E, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x0C, 0x00, 0x3E, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x0C, 0x00, 0x3E, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x0E, 0x1B, 0x00, 0x3E, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1D, 0x3F, 0x37, 0x00, 0x3E, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x3E, 0x7F, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x3F, - 0x7E, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x67, - 0x6B, 0xD6, 0xE6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x0C, 0x00, 0x63, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x0C, 0x00, 0x63, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x0E, 0x1B, 0x00, 0x63, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x63, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x06, 0x00, 0x63, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x0C, 0xF8, 0xF0, - 0x00, 0x00, 0x18, 0x18, 0x18, 0x3E, 0x3F, 0x33, - 0x33, 0x66, 0x66, 0x7E, 0x7C, 0xC0, 0xC0, 0xC0, - 0x00, 0x00, 0x00, 0x1B, 0x00, 0x63, 0x63, 0x63, - 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x0C, 0xF8, 0xF0, -}; - -const struct fb_font_desc font_italic = { - .name = "NetSurf Italic", - .width = 8, - .height = 16, - .encoding = "CP1252", - .data = fontdata_italic, -}; - - -static const uint32_t fontdata_italic_bold[FONTDATAMAX] = { - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xE4, 0xAC, 0xA4, 0xA4, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEC, 0xA2, 0xA4, 0xA8, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEC, 0xA2, 0xAC, 0xA2, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEA, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xA8, 0xAE, 0xA2, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xE6, 0xA8, 0xAE, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xA2, 0xA4, 0xA4, 0xE4, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xAA, 0xAE, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xE4, 0xAA, 0xAE, 0xAA, 0xEA, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEC, 0xAA, 0xAC, 0xAA, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xE4, 0xAA, 0xA8, 0xAA, 0xE4, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEC, 0xAA, 0xAA, 0xAA, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xE8, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xCA, 0x4A, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x44, 0xCC, 0x44, 0x44, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4C, 0xC2, 0x44, 0x48, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4C, 0xC2, 0x4C, 0x42, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4A, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xC8, 0x4E, 0x42, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x46, 0xC8, 0x4E, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xC2, 0x44, 0x44, 0xE4, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xCA, 0x4E, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x44, 0xCA, 0x4E, 0x4A, 0xEA, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4C, 0xCA, 0x4C, 0x4A, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x44, 0xCA, 0x48, 0x4A, 0xE4, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4C, 0xCA, 0x4A, 0x4A, 0xEC, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xEE, 0x00, 0xFE, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xE8, 0x00, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x1C, 0x1C, 0x1C, - 0x1C, 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x36, 0x36, 0x7F, 0x7F, 0x7F, 0x36, 0x6C, - 0xFE, 0xFE, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x3E, 0x7F, 0x7B, 0x78, 0x7C, 0x7C, - 0x3E, 0x1E, 0xDE, 0xFE, 0x7C, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x77, 0x0E, - 0x3C, 0x70, 0xEE, 0xCE, 0x0E, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x3E, 0x7E, 0x7C, 0x7C, 0x3B, 0xFE, - 0xFE, 0xEC, 0xEE, 0xFE, 0x74, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x06, 0x0E, 0x1C, 0x1C, 0x38, 0x38, 0x70, - 0x70, 0x70, 0x38, 0x38, 0x1C, 0x0C, 0x06, 0x00, - 0x60, 0x30, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x0E, - 0x1C, 0x1C, 0x38, 0x38, 0x70, 0x60, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x2A, 0x7F, 0x3E, 0x18, - 0x7C, 0xFE, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x7E, - 0x7E, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x78, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, - 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x3C, - 0x78, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x3E, 0x77, 0x77, 0x77, 0x77, 0xEE, - 0xEE, 0xEE, 0xEE, 0x7C, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x1C, 0x3C, 0x3C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x07, 0x07, 0x3E, 0x7C, - 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x07, 0x07, 0x1E, 0x3C, - 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0x76, 0xEC, - 0xFE, 0xFE, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x70, 0x70, 0x7C, 0x7E, 0x0E, - 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7E, 0x70, 0x70, 0x7C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x07, 0x07, 0x0E, 0x0E, 0x1C, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x7F, 0x3E, 0x7E, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x7F, 0x3E, - 0x0E, 0x0E, 0x0E, 0x7C, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, - 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, - 0x00, 0x18, 0x38, 0x38, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x1C, 0x70, - 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, - 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x30, 0x38, 0x1C, 0x0E, 0x0E, - 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x07, 0x07, 0x1E, 0x7C, - 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x7F, 0xFE, - 0xEC, 0xE0, 0xE0, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x76, 0xFE, - 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x7E, 0x7F, 0x77, 0x77, 0x77, 0x7E, 0xFC, - 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x70, 0x70, 0xE0, - 0xE0, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0x7E, 0x77, 0x77, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x70, 0x70, 0x70, 0x7C, 0xF8, - 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x70, 0x70, 0x70, 0x7C, 0xF8, - 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x70, 0x70, 0xFE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7E, 0xFE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x0E, - 0x0E, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x70, 0x72, 0x77, 0x7F, 0x7E, 0xF8, - 0xF8, 0xFC, 0xFE, 0xEE, 0xE6, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xE0, - 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x77, 0x7F, 0x7F, 0x7F, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x67, 0x77, 0x77, 0x7F, 0x7F, 0x7E, 0xFE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xE6, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7E, 0x7F, 0x77, 0x77, 0x77, 0x77, 0xFE, - 0xFC, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x76, 0xEE, - 0xEE, 0xFE, 0xFE, 0xFE, 0x7E, 0x06, 0x00, 0x00, - 0x00, 0x7E, 0x7F, 0x77, 0x77, 0x77, 0x7E, 0xFC, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x70, 0x70, 0x7C, 0x3E, - 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xEE, - 0x6C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xEE, - 0xFE, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x77, 0x77, 0x3E, 0x1C, 0x38, - 0x7C, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x3E, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x07, 0x07, 0x0E, 0x1C, 0x38, - 0x70, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x3E, 0x3E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x70, 0x78, 0x38, - 0x1C, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7E, 0x7E, 0x0E, 0x0E, 0x0E, 0x0E, 0x1C, - 0x1C, 0x1C, 0x1C, 0xFC, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x1C, 0x3E, 0x77, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x1C, 0x0C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3E, 0x0E, - 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x70, 0x7C, 0x7E, 0x6E, - 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xEE, - 0xE0, 0xE0, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x07, 0x07, 0x07, 0x3F, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xEE, - 0xFE, 0xFC, 0xE0, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0x3F, 0x38, 0x38, 0x70, 0x7C, 0x7C, - 0x70, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x1C, 0xFC, 0xF8, - 0x00, 0x00, 0x70, 0x70, 0x70, 0x7C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x1E, 0x3E, 0x1C, - 0x1C, 0x38, 0x38, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x1E, 0x3E, 0x0E, - 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x38, 0xF8, 0xF0, - 0x00, 0x38, 0x38, 0x38, 0x3A, 0x7F, 0x7E, 0x7C, - 0x70, 0xF8, 0xFC, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x3C, 0x1C, 0x1C, 0x38, 0x38, 0x38, - 0x38, 0x70, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x7E, 0xFE, - 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0xE0, 0xE0, 0xE0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0x7C, 0x1C, 0x1E, 0x1E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x7E, 0x70, - 0x70, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x70, - 0x7C, 0x3E, 0x0E, 0x7C, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x70, 0x7C, 0x7C, 0x70, - 0xE0, 0xE0, 0xE0, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0xEE, - 0xFE, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0x7E, - 0x38, 0x7C, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xFE, 0x7E, 0x1C, 0x1C, 0xFC, 0xF8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7E, 0x1E, - 0x3C, 0x78, 0xF0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x0F, 0x1F, 0x1C, 0x1C, 0x1C, 0x78, 0xF0, - 0x38, 0x38, 0x38, 0x3E, 0x1E, 0x00, 0x00, 0x00, - 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, - 0x00, 0x78, 0x7C, 0x1C, 0x1C, 0x1C, 0x0F, 0x1E, - 0x38, 0x38, 0x38, 0xF8, 0xF0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x66, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77, - 0x00, 0xEE, 0x28, 0x4C, 0x48, 0x48, 0x00, 0xFE, - 0x00, 0x06, 0x1F, 0x3B, 0x70, 0xFE, 0x70, 0xF8, - 0xE0, 0xE0, 0xEE, 0xFC, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x38, 0x30, 0x60, 0x00, - 0x00, 0x1F, 0x3F, 0x38, 0x38, 0x70, 0x7C, 0x7C, - 0x70, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xCC, 0x98, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x7F, 0x7F, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, - 0x00, 0x1C, 0x1C, 0x1C, 0x7F, 0x7F, 0x1C, 0xFE, - 0xFE, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, - 0x00, 0x3E, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x1C, - 0x38, 0x70, 0xE0, 0xDB, 0x1B, 0x00, 0x00, 0x00, - 0x77, 0x3E, 0x00, 0x3E, 0x7F, 0x77, 0x70, 0x7C, - 0x3E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x1C, - 0x38, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, - 0x00, 0x3F, 0x7F, 0x77, 0x77, 0x77, 0x77, 0xEF, - 0xEE, 0xEE, 0xEE, 0xFF, 0x7F, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x77, 0x3E, 0x00, 0x7F, 0x7F, 0x07, 0x0E, 0x1C, - 0x38, 0x70, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x36, 0x36, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x1B, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7E, - 0x7E, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3B, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x79, 0x7F, 0x2F, 0x29, 0x29, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x3E, 0x1C, 0x00, 0x1F, 0x3E, 0x70, - 0x7C, 0x3E, 0x0E, 0x7C, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x38, - 0x1C, 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x7F, 0xFA, - 0xDE, 0xDE, 0xFC, 0xFE, 0x6E, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x3E, 0x1C, 0x00, 0x7F, 0x7E, 0x1E, - 0x3C, 0x78, 0xF0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x3B, 0x00, 0x77, 0x77, 0x77, 0x77, 0x3E, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x08, 0x3E, 0x7F, 0xD6, - 0xD0, 0xD0, 0xD6, 0xFE, 0x7C, 0x10, 0x10, 0x00, - 0x00, 0x1E, 0x3F, 0x3B, 0x38, 0x7E, 0x7E, 0xFC, - 0x70, 0x76, 0xFE, 0xFE, 0xDC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x3E, 0xFE, - 0xFE, 0xFE, 0xFE, 0x7C, 0xEE, 0xEE, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x77, 0x77, 0x3E, 0x1C, 0xFE, - 0x38, 0xFE, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3E, 0x3E, 0x38, 0x1E, 0x3F, 0x66, - 0x7E, 0x3C, 0x0E, 0x3E, 0x3E, 0x3C, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x61, 0x4D, 0x5D, 0x51, 0xA1, - 0xA5, 0xBD, 0x99, 0xC3, 0x7E, 0x3C, 0x00, 0x00, - 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0xFC, - 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, - 0x7C, 0xF8, 0xF8, 0x7C, 0x3E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x03, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3F, 0x61, 0x59, 0x5D, 0x55, 0xB9, - 0xB9, 0xA5, 0xA5, 0xC3, 0x7E, 0x3C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7E, 0x66, 0x7E, 0x3C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x1C, 0x7F, 0x7F, 0x7F, 0x38, - 0x38, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x78, 0x7C, 0x0C, 0x3C, 0x78, 0xC0, - 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x78, 0x7C, 0x0C, 0x18, 0x0C, 0xF8, - 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1C, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0xC0, - 0x00, 0x00, 0x00, 0x3F, 0x6D, 0x6D, 0x6D, 0x7A, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x38, - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x1C, 0x0C, 0x1C, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x70, 0x30, 0x30, 0x30, 0xF0, - 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x7C, 0x44, 0x7C, 0x38, 0x00, 0xF8, - 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, - 0x6C, 0x36, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x70, 0x31, 0x33, 0x7F, 0x1C, - 0x38, 0x76, 0xEE, 0xD6, 0x3E, 0x3E, 0x06, 0x00, - 0x00, 0x00, 0x30, 0x70, 0x31, 0x33, 0x7F, 0x1C, - 0x38, 0x70, 0xFC, 0xC6, 0x0C, 0x18, 0x1E, 0x00, - 0x00, 0x00, 0x70, 0x18, 0x31, 0x1B, 0x77, 0x1C, - 0x3A, 0x76, 0xEE, 0xD6, 0x3E, 0x3E, 0x06, 0x00, - 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x00, 0x0E, 0x1C, - 0x7C, 0xF8, 0xE0, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, - 0x00, 0x70, 0x38, 0x00, 0x08, 0x1C, 0x3E, 0xEE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x0E, 0x00, 0x08, 0x1C, 0x3E, 0xEE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x36, 0x63, 0x08, 0x1C, 0x3E, 0xEE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x3B, 0x6E, 0x00, 0x08, 0x1C, 0x3E, 0xEE, - 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x08, 0x1C, 0x3E, 0x76, 0xFE, - 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x36, 0x1C, 0x1C, 0x3E, 0x76, 0xFE, - 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x0F, 0x1F, 0x3F, 0x7F, 0x77, 0x7F, 0xFF, - 0xFE, 0xEE, 0xEF, 0xEF, 0xEF, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x70, 0x70, 0x70, 0xE0, - 0xE0, 0xE0, 0xEE, 0xFE, 0x7C, 0x0E, 0x6E, 0x7C, - 0x00, 0x38, 0x1C, 0x00, 0x7F, 0x7F, 0x70, 0xE0, - 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1C, 0x00, 0x7F, 0x7F, 0x70, 0xE0, - 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x77, 0x00, 0x7F, 0x7F, 0x70, 0xE0, - 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x77, 0x77, 0x00, 0x7F, 0x7F, 0x70, 0x70, 0xF8, - 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1C, 0x00, 0x1C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x36, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x77, 0x77, 0x00, 0x1C, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0x7E, 0x77, 0x77, 0x76, 0xFE, - 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x3B, 0x6E, 0x00, 0x77, 0x77, 0x76, 0xF6, - 0xFE, 0xDE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x1C, 0x00, 0x3E, 0x7F, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1C, 0x00, 0x3E, 0x7F, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x77, 0x00, 0x3E, 0x7F, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3B, 0x6E, 0x00, 0x3E, 0x7F, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x77, 0x77, 0x00, 0x3E, 0x7F, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x76, 0x7C, - 0x38, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x3D, 0x7E, 0x77, 0x77, 0x77, 0x7E, 0xFE, - 0xFE, 0xEE, 0xEE, 0xFE, 0x7C, 0x80, 0x00, 0x00, - 0x00, 0x38, 0x1C, 0x00, 0x77, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1C, 0x00, 0x77, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x77, 0x00, 0x77, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1C, 0x00, 0x77, 0x77, 0x76, 0xEE, - 0x7C, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x70, 0x7E, 0x7F, 0x76, 0xEE, - 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x7E, 0xFC, - 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xC0, 0x00, - 0x00, 0x00, 0x70, 0x38, 0x00, 0x3C, 0x3E, 0x0E, - 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x3E, 0x0E, - 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x3C, 0x3E, 0x0E, - 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x76, 0xDC, 0x00, 0x3C, 0x3E, 0x0E, - 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x3C, 0x3E, 0x0E, - 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x38, 0x00, 0x3C, 0x3E, 0x0E, - 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3A, 0x3F, 0x3F, 0x1A, - 0x7E, 0xFE, 0xD8, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, - 0xEE, 0xE0, 0xEE, 0xFE, 0x7C, 0x1C, 0x7E, 0x7C, - 0x00, 0x00, 0x38, 0x1C, 0x00, 0x3E, 0x7F, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x38, 0x00, 0x3E, 0x7F, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x3E, 0x77, 0x00, 0x3E, 0x7F, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x77, 0x00, 0x3E, 0x7F, 0xEE, - 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x3E, 0x77, 0x00, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x77, 0x00, 0x1C, 0x1C, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x76, 0x3E, 0x7C, 0x7E, 0x3F, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3B, 0x7F, 0x6E, 0x00, 0x7E, 0x7F, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x38, 0x00, 0x3C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x3E, 0x77, 0x00, 0x3C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x3B, 0x7F, 0x6E, 0x00, 0x3C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x77, 0x00, 0x3C, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0xFE, - 0xFE, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x3E, 0x7E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x38, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x38, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x3E, 0x77, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x77, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0xFE, 0xFC, - 0x00, 0x00, 0x70, 0x70, 0x7E, 0x7F, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, - 0x00, 0x00, 0x77, 0x77, 0x00, 0x77, 0x76, 0xEE, - 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0xFE, 0xFC, -}; - -const struct fb_font_desc font_italic_bold = { - .name = "NetSurf Italic Bold", - .width = 8, - .height = 16, - .encoding = "CP1252", - .data = fontdata_italic_bold, -}; - - -static const uint32_t fontdata_regular[FONTDATAMAX] = { - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xE4, 0xAC, 0xA4, 0xA4, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEC, 0xA2, 0xA4, 0xA8, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEC, 0xA2, 0xAC, 0xA2, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEA, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xA8, 0xAE, 0xA2, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xE6, 0xA8, 0xAE, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xA2, 0xA4, 0xA4, 0xE4, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xAA, 0xAE, 0xAA, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xE4, 0xAA, 0xAE, 0xAA, 0xEA, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEC, 0xAA, 0xAC, 0xAA, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xE4, 0xAA, 0xA8, 0xAA, 0xE4, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEC, 0xAA, 0xAA, 0xAA, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xE8, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xCA, 0x4A, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x44, 0xCC, 0x44, 0x44, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4C, 0xC2, 0x44, 0x48, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4C, 0xC2, 0x4C, 0x42, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4A, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xC8, 0x4E, 0x42, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x46, 0xC8, 0x4E, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xC2, 0x44, 0x44, 0xE4, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xCA, 0x4E, 0x4A, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x44, 0xCA, 0x4E, 0x4A, 0xEA, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4C, 0xCA, 0x4C, 0x4A, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x44, 0xCA, 0x48, 0x4A, 0xE4, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4C, 0xCA, 0x4A, 0x4A, 0xEC, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xEE, 0x00, 0xFE, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xE8, 0x00, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0xFE, 0x6C, 0x6C, - 0xFE, 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x7C, 0xFE, 0xD6, 0xD0, 0xF0, 0x7C, - 0x1E, 0x16, 0xD6, 0xFE, 0x7C, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xCE, 0x1C, - 0x38, 0x70, 0xE6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0xF8, 0xD8, 0xD8, 0xF8, 0x72, 0xFE, - 0xDE, 0xCC, 0xCC, 0xFE, 0x7A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x0E, 0x1C, 0x18, 0x38, 0x30, 0x30, 0x30, - 0x30, 0x38, 0x18, 0x1C, 0x0E, 0x06, 0x00, 0x00, - 0x60, 0x70, 0x38, 0x18, 0x1C, 0x0C, 0x0C, 0x0C, - 0x0C, 0x1C, 0x18, 0x38, 0x70, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0x38, 0xFE, - 0xFE, 0x38, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x7E, - 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x38, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, - 0x00, 0x00, 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, 0x06, 0x0E, 0x1C, - 0x38, 0x70, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xCE, 0xCE, 0xD6, 0xD6, - 0xE6, 0xE6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x38, 0x78, 0x78, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0x06, 0x06, 0x3E, 0x7C, - 0xE0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0x06, 0x06, 0x3C, 0x3C, - 0x06, 0x06, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x0C, 0x1C, 0x3C, 0x7C, 0xEC, 0xFE, - 0xFE, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0xFE, - 0x06, 0x06, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7C, 0xE0, 0xC0, 0xC0, 0xFC, 0xFE, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0xC6, 0x0E, 0x0C, 0x1C, 0x18, - 0x38, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0x7C, 0x7C, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, - 0x06, 0x06, 0x0E, 0x7C, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x0E, 0x1C, 0x38, 0x70, 0x70, - 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x00, - 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x70, 0x38, 0x1C, 0x0E, 0x0E, - 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0x06, 0x1E, 0x3C, - 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xCE, 0xDE, 0xD6, 0xD6, - 0xDE, 0xCC, 0xC0, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0xFE, 0xFE, - 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xFC, 0xFC, - 0xC6, 0xC6, 0xC6, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, - 0xC0, 0xC0, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xF8, 0xFC, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xCE, 0xFC, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xF8, 0xF8, - 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xF8, 0xF8, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xC0, 0xDE, 0xDE, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xFE, - 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x7E, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x7E, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, - 0x0C, 0x0C, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00, - 0x00, 0xC0, 0xC6, 0xCE, 0xDC, 0xF8, 0xF0, 0xE0, - 0xF0, 0xF8, 0xDC, 0xCE, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, - 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0xEE, 0xFE, 0xFE, 0xFE, 0xD6, - 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xF6, 0xDE, - 0xDE, 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xFE, 0xFC, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, - 0xC6, 0xD6, 0xDE, 0xFE, 0x7C, 0x06, 0x00, 0x00, - 0x00, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xFC, 0xFC, - 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xC0, 0xFC, 0x7E, - 0x06, 0x06, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x7E, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xEE, - 0x6C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, - 0xD6, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0xC6, 0xEE, 0x7C, 0x38, 0x38, - 0x7C, 0xEE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xEE, 0x7C, 0x38, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0x0E, 0x0C, 0x1C, 0x18, 0x38, - 0x30, 0x70, 0x60, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x3E, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x3E, 0x3E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x70, - 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, - 0x0C, 0x0C, 0x0C, 0x7C, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x30, 0x30, 0x18, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x06, - 0x7E, 0xFE, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xC6, - 0xC0, 0xC0, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x06, 0x06, 0x06, 0x7E, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xC6, - 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x3E, 0x30, 0x30, 0x30, 0x78, 0x78, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0x7E, 0x7C, - 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xDC, 0xFE, 0xE6, - 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x38, 0x18, - 0x18, 0x18, 0x18, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x1C, 0x0C, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x7C, 0x78, - 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCE, 0xDC, - 0xF8, 0xF8, 0xDC, 0xCE, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xFE, - 0xD6, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xFE, 0xE6, - 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0x07, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xFE, 0xE0, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xC0, - 0xFC, 0x7C, 0x06, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x30, 0x30, 0x30, 0x7C, 0xFC, 0x30, - 0x30, 0x30, 0x30, 0x3E, 0x1E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xEE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, - 0xD6, 0xD6, 0xFE, 0xFE, 0x6C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xEE, - 0x7C, 0x7C, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0xFE, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x0E, - 0x3C, 0x78, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1E, 0x18, 0x18, 0x18, 0x70, 0x70, - 0x18, 0x18, 0x18, 0x1E, 0x0E, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x00, 0x70, 0x78, 0x18, 0x18, 0x18, 0x0E, 0x0E, - 0x18, 0x18, 0x18, 0x78, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x76, 0xFE, 0xDC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, - 0x00, 0xEE, 0x28, 0x4C, 0x48, 0x48, 0x00, 0xFE, - 0x00, 0x18, 0x3C, 0x66, 0x60, 0xFC, 0x60, 0xF8, - 0x60, 0x60, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00, - 0x00, 0x1E, 0x3E, 0x30, 0x30, 0x30, 0x78, 0x78, - 0x30, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x66, 0x66, 0x22, 0x44, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xDB, 0xDB, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x18, 0x18, 0x7E, 0x7E, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, - 0x00, 0x18, 0x18, 0x18, 0x7E, 0x7E, 0x18, 0x7E, - 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, - 0x00, 0x7C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, - 0x18, 0x30, 0x60, 0xDB, 0x9B, 0x00, 0x00, 0x00, - 0xC6, 0x7C, 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xFC, - 0x7E, 0x06, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1C, - 0x38, 0x30, 0x38, 0x1C, 0x0C, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0xFF, 0xCC, 0xCC, 0xCC, 0xCF, 0xCF, - 0xCC, 0xCC, 0xCC, 0xFF, 0x7F, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0xC6, 0x7C, 0x00, 0xFE, 0xFE, 0x06, 0x0C, 0x18, - 0x30, 0x60, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x20, 0x30, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x30, 0x10, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x24, 0x48, 0x6C, 0x6C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x36, 0x36, 0x12, 0x24, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, - 0x7E, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x32, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF1, 0xFB, 0x5F, 0x55, 0x51, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0x6C, 0x38, 0x00, 0x7E, 0xFE, 0xC0, - 0xFC, 0x7C, 0x06, 0xFE, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, - 0x1C, 0x0C, 0x1C, 0x38, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xDA, - 0xDE, 0xDE, 0xD8, 0xFE, 0x6E, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE, - 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0x6C, 0x38, 0x00, 0xFE, 0xFE, 0x0E, - 0x3C, 0x78, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xEE, 0x7C, - 0x38, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0xFE, 0xD6, - 0xD0, 0xD0, 0xD6, 0xFE, 0x7C, 0x10, 0x10, 0x00, - 0x00, 0x3C, 0x7E, 0x66, 0x60, 0x60, 0xF8, 0xF8, - 0x60, 0x60, 0xE6, 0xFE, 0xDC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x7E, - 0x66, 0x66, 0x7E, 0x3C, 0x66, 0x66, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, - 0x18, 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7C, 0x60, 0x60, 0x3C, 0x7E, 0x66, - 0x7E, 0x3C, 0x06, 0x06, 0x3E, 0x3C, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7E, 0xC3, 0x99, 0xBD, 0xA5, 0xA1, - 0xA5, 0xBD, 0x99, 0xC3, 0x7E, 0x3C, 0x00, 0x00, - 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00, 0xF8, - 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, - 0x6C, 0xD8, 0xD8, 0x6C, 0x36, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7E, 0x7E, 0x06, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7E, 0xC3, 0xB9, 0xBD, 0xA5, 0xB9, - 0xB9, 0xA5, 0xA5, 0xC3, 0x7E, 0x3C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x78, 0xFC, 0xCC, 0xFC, 0x78, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x7E, 0x18, - 0x18, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0xF8, 0x18, 0x78, 0xF0, 0xC0, - 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0xF8, 0x18, 0x30, 0x18, 0xF8, - 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x7E, 0x7C, 0x60, 0x60, 0xC0, - 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 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, - 0x00, 0x18, 0x1C, 0x0C, 0x1C, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x60, 0xE0, 0x60, 0x60, 0x60, 0xF0, - 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0xF8, 0x88, 0xF8, 0x70, 0x00, 0xF8, - 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, - 0x6C, 0x36, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0xC0, 0x42, 0x46, 0xEC, 0x18, - 0x30, 0x64, 0xCC, 0x94, 0x3E, 0x04, 0x04, 0x00, - 0x00, 0x00, 0x40, 0xC0, 0x42, 0x46, 0xEC, 0x18, - 0x30, 0x60, 0xDC, 0x82, 0x0C, 0x10, 0x1E, 0x00, - 0x00, 0x00, 0xE0, 0x10, 0x62, 0x16, 0xEC, 0x18, - 0x30, 0x64, 0xCC, 0x96, 0x3E, 0x04, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, - 0x78, 0xF0, 0xC0, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, - 0x00, 0x60, 0x30, 0x00, 0x10, 0x38, 0x6C, 0xC6, - 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x18, 0x00, 0x10, 0x38, 0x6C, 0xC6, - 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x44, 0x10, 0x38, 0x6C, 0xC6, - 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xDC, 0x00, 0x10, 0x38, 0x6C, 0xC6, - 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x6C, 0x6C, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xFE, - 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x44, 0x38, 0x38, 0x6C, 0xC6, 0xFE, - 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0x3F, 0x7C, 0xEC, 0xCC, 0xFE, 0xFE, - 0xCC, 0xCC, 0xCC, 0xCF, 0xCF, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, - 0xC0, 0xC0, 0xC6, 0xFE, 0x7C, 0x0E, 0x66, 0x3C, - 0x00, 0x30, 0x18, 0x00, 0xFE, 0xFE, 0xC0, 0xF0, - 0xF0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x18, 0x00, 0xFE, 0xFE, 0xC0, 0xF0, - 0xF0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x00, 0xFE, 0xFE, 0xC0, 0xF0, - 0xF0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x6C, 0x6C, 0x00, 0xFE, 0xFE, 0xC0, 0xC0, 0xF0, - 0xF0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x24, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x66, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x78, 0x7C, 0x6E, 0x66, 0x66, 0xF6, - 0x66, 0x66, 0x6E, 0x7C, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6, - 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x18, 0x00, 0x7C, 0xFE, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x18, 0x00, 0x7C, 0xFE, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x00, 0x7C, 0xFE, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xDC, 0x00, 0x7C, 0xFE, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x6C, 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xEE, 0x7C, - 0x38, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x7E, 0xFE, 0xC6, 0xC6, 0xCE, 0xCE, 0xD6, - 0xD6, 0xE6, 0xE6, 0xFE, 0x7C, 0x80, 0x00, 0x00, - 0x00, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x7E, - 0x3C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x7C, 0x7E, 0x66, 0x66, - 0x7E, 0x7C, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x7E, 0x66, 0x66, 0x66, 0x7E, 0x7C, - 0x66, 0x66, 0x66, 0x7E, 0x7C, 0xE0, 0xC0, 0x00, - 0x00, 0x00, 0x30, 0x18, 0x00, 0x7E, 0xFE, 0xC6, - 0xC6, 0xCE, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x30, 0x00, 0x7E, 0xFE, 0xC6, - 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7E, 0xFE, 0xC6, - 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x76, 0xDC, 0x00, 0x7E, 0xFE, 0xC6, - 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7E, 0xFE, 0xC6, - 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x38, 0x00, 0x7E, 0xFE, 0xC6, - 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x7E, 0x1A, - 0x3E, 0x7E, 0xD8, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, - 0xC6, 0xC0, 0xC6, 0xFE, 0x7C, 0x18, 0x7C, 0x78, - 0x00, 0x00, 0x30, 0x18, 0x00, 0x7C, 0xFE, 0xC6, - 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x30, 0x00, 0x7C, 0xFE, 0xC6, - 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xFE, 0xC6, - 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7C, 0xFE, 0xC6, - 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x3C, 0x66, 0x00, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x66, 0x00, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x6C, 0x7C, 0xF8, 0xDC, 0x7C, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xFE, 0xDC, 0x00, 0xFC, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x30, 0x00, 0x7C, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x30, 0x00, 0x7C, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xFE, 0xDC, 0x00, 0x7C, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7C, 0xFE, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E, - 0x7E, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x7C, 0xFE, 0xCE, - 0xD6, 0xD6, 0xE6, 0xFE, 0x7C, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x30, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x30, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0C, 0x18, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0xFC, 0xF8, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x7C, 0x7E, 0x66, - 0x66, 0x66, 0x66, 0x7E, 0x7C, 0x60, 0x60, 0x60, - 0x00, 0x00, 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, - 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0xFE, 0xFC, -}; - -const struct fb_font_desc font_regular = { - .name = "NetSurf Regular", - .width = 8, - .height = 16, - .encoding = "CP1252", - .data = fontdata_regular, -}; - -#endif diff --git a/atari/plot/font_internal.h b/atari/plot/font_internal.h deleted file mode 100644 index 9bfbbedef..000000000 --- a/atari/plot/font_internal.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2008 Vincent Sanders <vince@simtec.co.uk> - * Copyright 2011 Ole Loots <ole@monochrom.net> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef WITH_INTERNAL_FONT_DRIVER -#ifndef FONT_PLOTTER_INTERNAL -#define FONT_PLOTTER_INTERNAL - -#include "atari/plot/plot.h" - -int ctor_font_plotter_internal( FONT_PLOTTER self ); - -struct fb_font_desc { - const char *name; - int width, height; - const char *encoding; - const uint32_t *data; -}; - - -#endif -#endif diff --git a/atari/plot/font_vdi.c b/atari/plot/font_vdi.c deleted file mode 100644 index ef5499207..000000000 --- a/atari/plot/font_vdi.c +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright 2010 Ole Loots <ole@monochrom.net> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef WITH_VDI_FONT_DRIVER - -#include <mt_gemx.h> - -#include "atari/plot/plot.h" -#include "atari/plot/font_vdi.h" - -#include "utils/utf8.h" -#include "utils/log.h" - -#include "atari/encoding.h" - - -//static char * lstr = NULL; - -static int dtor( FONT_PLOTTER self ); -static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const char * str, size_t length, int * width ); -static int str_split( FONT_PLOTTER self, const plot_font_style_t *fstyle,const char *string, - size_t length,int x, size_t *char_offset, int *actual_x ); -static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle,const char *string, - size_t length,int x, size_t *char_offset, int *actual_x ); -static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length, const plot_font_style_t *fstyle ); - -static bool init = false; -static int vdih; - -extern struct s_vdi_sysinfo vdi_sysinfo; - -static inline void atari_to_vdi_str(char *lstr, int length) -{ - int i, z; - - for (i=z=0; i<length; ) { - if (((char)lstr[i]==(char)0xC2) && ((char)lstr[i+1] == (char)0xA0)) { - lstr[z] = ' '; - lstr[z+1] = ' '; - i=i+2; - z=z+2; - } - else { - lstr[z] = lstr[i]; - i++; - z++; - } - } -} - -int ctor_font_plotter_vdi( FONT_PLOTTER self ) -{ - self->dtor = dtor; - self->str_width = str_width; - self->str_split = str_split; - self->pixel_pos = pixel_pos; - self->text = text; - LOG("%s: %s\n", (char *)__FILE__, __FUNCTION__); - if( !init ) { - vdih = self->vdi_handle; - } - init = true; - return( 1 ); -} - -static int dtor( FONT_PLOTTER self ) -{ - return( 1 ); -} - -static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const char * str, - size_t length, int * width ) -{ - short cw, ch, cellw, cellh; - short pxsize; - short fx=0; - char * lstr = NULL; - - utf8_to_local_encoding(str, length, &lstr); - assert( lstr != NULL ); - int slen = strlen(lstr); - - - atari_to_vdi_str(lstr, slen); - - if( fstyle->flags & FONTF_ITALIC ) - fx |= 4; - if( fstyle->flags & FONTF_OBLIQUE ) - fx |= 16; - if( fstyle->weight > 450 ) - fx |= 1; - vst_effects( self->vdi_handle, fx ); - /* TODO: replace 90 with global dpi setting */ - //pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 ); - //vst_height( self->vdi_handle, pxsize ,&cw, &ch, &cellw, &cellh); - pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 ); - vst_point( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh); -/* - if(slen != utf8_bounded_length(str, length)){ - printf("sl: %d, utl: %d\n ", slen, utf8_bounded_length(str, length)); - printf("s: %s // %s\n", str, lstr ); - }*/ - - - *width = slen * cellw; - free((void*)lstr); - return( 0 ); -} - -static int str_split( FONT_PLOTTER self, const plot_font_style_t * fstyle, const char *string, - size_t length,int x, size_t *char_offset, int *actual_x ) -{ - short cw, ch, cellw, cellh; - short pxsize; - short fx=0; - char *lstr = NULL; - size_t slen = 0; - int last_space_x = 0; - int last_space_idx = 0; - size_t nxtchr = 0; - - utf8_to_local_encoding(string, length, &lstr ); - assert( lstr != NULL ); - slen = strlen(lstr); - - - atari_to_vdi_str(lstr, slen); - - if( fstyle->flags & FONTF_ITALIC ) - fx |= 4; - if( fstyle->flags & FONTF_OBLIQUE ) - fx |= 16; - if( fstyle->weight > 450 ) - fx |= 1; - vst_effects( self->vdi_handle, fx ); - //pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 ); - //vst_height( self->vdi_handle, pxsize ,&cw, &ch, &cellw, &cellh); - - pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 ); - vst_point( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh); - *actual_x = 0; - //*char_offset = 0; - while (nxtchr < slen) { - if( lstr[nxtchr] == ' ' ) { - last_space_x = *actual_x; - last_space_idx = nxtchr; - } - *actual_x += cellw; - if (*actual_x > x && last_space_idx != 0) { - *actual_x = last_space_x; - *char_offset = last_space_idx; - //printf("at: %s\n", lstr); - return(0); - } - - nxtchr++; - } - if(nxtchr >= length){ - nxtchr = length-1; - } - - *char_offset = nxtchr; - -// for( i=0; i<slen; i++) { -// if( lstr[i] == ' ' ) { -// last_space_x = *actual_x; -// last_space_idx = cpos; -// } -// if( *actual_x > x ) { -// *actual_x = last_space_x; -// *char_offset = last_space_idx; -// return true; -// } -// *actual_x += cellw; -// cpos++; -// } -// *char_offset = cpos; - free( (void*)lstr ); - return( 0 ); -} - -static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t * fstyle,const char *string, - size_t length,int x, size_t *char_offset, int *actual_x ) -{ - short cw, ch, cellw, cellh; - short pxsize=0; - short fx=0; - - char *lstr = NULL; - int i=0; - utf8_to_local_encoding(string, length, &lstr ); - assert( lstr != NULL ); - int slen = strlen(lstr); - - atari_to_vdi_str(lstr, slen); - - if( fstyle->flags & FONTF_ITALIC ) - fx |= 4; - if( fstyle->flags & FONTF_OBLIQUE ) - fx |= 16; - if( fstyle->weight > 450 ) - fx |= 1; - vst_effects(self->vdi_handle, fx); - pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 ); - vst_height( self->vdi_handle, pxsize ,&cw, &ch, &cellw, &cellh); - *actual_x = 0; - *char_offset = 0; - for( i=0; i<slen; i++) { - *actual_x += cellw; - if( *actual_x > x) { - *actual_x -= cellw; - *char_offset = i; - break; - } - } - free((void*)lstr); - lstr = NULL; - return( 0 ); -} - -static inline void vst_rgbcolor( short vdih, uint32_t cin ) -{ -#ifdef WITH_8BPP_SUPPORT - if( vdi_sysinfo.scr_bpp > 8 ) { -#endif - //unsigned short c[4]; - RGB1000 c; - - rgb_to_vdi1000( (unsigned char*)&cin, &c ); - vs_color( vdih, OFFSET_CUSTOM_COLOR, (unsigned short*)&c); - vst_color( vdih, OFFSET_CUSTOM_COLOR ); -#ifdef WITH_8BPP_SUPPORT - } else { - if( vdi_sysinfo.scr_bpp >= 4 ) - vst_color( vdih, RGB_TO_VDI(cin) ); - else - vst_color( vdih, BLACK ); - } -#endif -} - -static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length, - const plot_font_style_t *fstyle ) -{ - /* todo: either limit the string to max 80 chars, or use v_ftext instead of v_gtext */ - short cw, ch, cellw, cellh; - short pxsize=8; - short fx=0; - GRECT canvas; - char *lstr = NULL; - assert( utf8_to_local_encoding(text, length, &lstr) == NSERROR_OK); - assert( lstr != NULL ); - - int slen = strlen(lstr); - if(slen > 800){ - lstr[800]=0; - } - - - atari_to_vdi_str(lstr, slen); - - if( fstyle->flags & FONTF_ITALIC ) - fx |= 4; - if( fstyle->flags & FONTF_OBLIQUE ) - fx |= 4; - if( fstyle->weight > 450 ) - fx |= 1; - - /* TODO: netsurf uses 90 as default dpi ( somewhere defined in libcss), - use that value or pass it as arg, to reduce netsurf dependency */ - //pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 ); - pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 ); - - plot_get_dimensions(&canvas); - x += canvas.g_x; - y += canvas.g_y; - vst_effects( self->vdi_handle, fx ); - vst_alignment(vdih, 0, 0, &cw, &ch ); - vst_point( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh); - //vst_height( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh); - vswr_mode( self->vdi_handle, MD_TRANS ); - vst_rgbcolor(self->vdi_handle, fstyle->foreground); - - if( atari_sysinfo.gdos_FSMC ){ - //printf("\nftext\n"); - v_ftext( self->vdi_handle, x, y, (char*)lstr ); - } else { - //printf("\ngtext\n"); - v_gtext( self->vdi_handle, x, y, (char*)lstr ); - } - free( lstr ); - return( 0 ); -} - -#endif diff --git a/atari/plot/font_vdi.h b/atari/plot/font_vdi.h deleted file mode 100644 index 3a1fdb54b..000000000 --- a/atari/plot/font_vdi.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2010 Ole Loots <ole@monochrom.net> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef WITH_VDI_FONT_DRIVER -#ifndef FONT_PLOTTER_VDI -#define FONT_PLOTTER_VDI - -int ctor_font_plotter_vdi( FONT_PLOTTER self ); - -#endif -#endif diff --git a/atari/plot/fontplot.c b/atari/plot/fontplot.c deleted file mode 100644 index 9f0edd9a4..000000000 --- a/atari/plot/fontplot.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2010 Ole Loots <ole@monochrom.net> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <stdbool.h> -#include <assert.h> -#include <stdlib.h> -#include <mt_gem.h> - -#include "desktop/mouse.h" -#include "desktop/plot_style.h" - -#include "atari/bitmap.h" -#include "atari/plot/fontplot.h" - -const struct s_font_driver_table_entry font_driver_table[] = -{ -#ifdef WITH_VDI_FONT_DRIVER - {"vdi", ctor_font_plotter_vdi, 0}, -#endif -#ifdef WITH_FREETYPE_FONT_DRIVER - {"freetype", ctor_font_plotter_freetype, 0}, -#endif -#ifdef WITH_INTERNAL_FONT_DRIVER - {"internal", ctor_font_plotter_internal, 0}, -#endif - {(char*)NULL, NULL, 0} -}; - -void dump_font_drivers(void) -{ - int i = 0; - while( font_driver_table[i].name != NULL ) { - printf("%s -> flags: %d\n", font_driver_table[i].name, - font_driver_table[i].flags); - i++; - } -} - - -/** - * Create an new text plotter object. - * - * Available: "vdi", "freetype", "internal" - * - * \param vdihandle the vdi handle to act upon, - * \param name selector ID (string) of the font plotter. - * \param flags configration flags of the plotter, available flags: - * FONTPLOT_FLAG_MONOGLYPH - Enable 1 bit font plotting - * \param error set to != 0 when errors occur - * \return the new font plotter instance on success, or NULL on failure. - */ -FONT_PLOTTER new_font_plotter(int vdihandle, char * name, unsigned long flags, - int * error) -{ - int i=0; - int res = 0-ERR_PLOTTER_NOT_AVAILABLE; - FONT_PLOTTER fplotter = NULL; - - /* set the default error code: */ - *error = 0-ERR_PLOTTER_NOT_AVAILABLE; - - - /* Find the selector string in the font plotter table, */ - /* and bail out when the font plotter is not available: */ - for (i = 0; font_driver_table[i].name != NULL; i++) { - - /* found selector in driver table? */ - if (strcmp(name, font_driver_table[i].name) == 0) { - - /* allocate the font plotter instance: */ - fplotter = (FONT_PLOTTER)malloc(sizeof(struct s_font_plotter)); - if (fplotter == NULL) { - *error = 0-ERR_NO_MEM; - return(NULL); - } - - /* Initialize the font plotter with the requested settings: */ - memset( fplotter, 0, sizeof(FONT_PLOTTER)); - fplotter->vdi_handle = vdihandle; - fplotter->name = name; - fplotter->flags = 0; - fplotter->flags |= flags; - - /* Execute the constructor: */ - assert(font_driver_table[i].ctor); - res = font_driver_table[i].ctor(fplotter); - - /* success? */ - if (res < 0) { - /* NO success! */ - free(fplotter); - *error = res; - return(NULL); - } - *error = 0; - break; - } - } - - return(fplotter); -} - -/* - Free an font plotter -*/ -int delete_font_plotter(FONT_PLOTTER p) -{ - if (p) { - p->dtor(p); - free(p); - p = NULL; - } - else - return(-1); - return(0); -} - diff --git a/atari/plot/fontplot.h b/atari/plot/fontplot.h deleted file mode 100644 index 6690bff2c..000000000 --- a/atari/plot/fontplot.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2010 Ole Loots <ole@monochrom.net> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef FONT_PLOT_H -#define FONT_PLOT_H - -typedef struct s_font_plotter * FONT_PLOTTER; - -struct s_font_driver_table_entry -{ - const char * name; - int (*ctor)( FONT_PLOTTER self ); - int flags; -}; - -/* declaration of font plotter member functions: (_fpmf_ prefix) */ -typedef int (*_fpmf_str_width)( FONT_PLOTTER self, const plot_font_style_t *fstyle, - const char * str, size_t length, int * width); -typedef int (*_fpmf_str_split)( FONT_PLOTTER self, const plot_font_style_t *fstyle, - const char *string, size_t length, - int x, size_t *char_offset, int *actual_x); -typedef int (*_fpmf_pixel_pos)( FONT_PLOTTER self, const plot_font_style_t *fstyle, - const char *string, size_t length, - int x, size_t *char_offset, int *actual_x); -typedef int (*_fpmf_text)( FONT_PLOTTER self, int x, int y, const char *text, - size_t length, const plot_font_style_t *fstyle); - -typedef void (*_fpmf_draw_glyph)(FONT_PLOTTER self, GRECT * clip, GRECT * loc, - uint8_t * pixdata, int pitch, uint32_t colour); -typedef int (*_fpmf_dtor)( FONT_PLOTTER self ); - - -/* prototype of the font plotter "object" */ -struct s_font_plotter -{ - char * name; - int flags; - int vdi_handle; - void * priv_data; - - _fpmf_str_width str_width; - _fpmf_str_split str_split; - _fpmf_pixel_pos pixel_pos; - _fpmf_text text; - _fpmf_draw_glyph draw_glyph; - _fpmf_dtor dtor; -}; - - -FONT_PLOTTER plot_get_text_plotter(void); -/* Set the font plotting engine. -*/ -void plot_set_text_plotter(FONT_PLOTTER font_plotter); -void dump_font_drivers(void); -FONT_PLOTTER new_font_plotter( int vdihandle, char * name, unsigned long flags, - int * error); -int delete_font_plotter( FONT_PLOTTER p ); - -#ifdef WITH_VDI_FONT_DRIVER - #include "atari/plot/font_vdi.h" -#endif -#ifdef WITH_INTERNAL_FONT_DRIVER - #include "atari/plot/font_internal.h" -#endif -#ifdef WITH_FREETYPE_FONT_DRIVER - #include "atari/plot/font_freetype.h" -#endif - - - -#endif diff --git a/atari/plot/plot.c b/atari/plot/plot.c deleted file mode 100644 index 45e4cead2..000000000 --- a/atari/plot/plot.c +++ /dev/null @@ -1,2247 +0,0 @@ -/* - * Copyright 2010 Ole Loots <ole@monochrom.net> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <assert.h> -#include <sys/types.h> -#include <stdint.h> -#include <string.h> -#include <limits.h> -#include <math.h> -#include <stdbool.h> -#include <mt_gem.h> -#include <mint/osbind.h> - -#include "utils/log.h" -#include "utils/utf8.h" -#include "utils/utils.h" -#include "image/bitmap.h" -#include "desktop/plotters.h" -#include "desktop/mouse.h" - -#include "atari/gui.h" -#include "atari/osspec.h" -#include "atari/misc.h" -#include "atari/bitmap.h" -#include "utils/nsoption.h" -#include "atari/plot/eddi.h" -#include "atari/plot/fontplot.h" -#include "atari/plot/plot.h" - -void vq_scrninfo(VdiHdl handle, short *work_out); - -struct s_view { - short x; /* drawing (screen) offset x */ - short y; /* drawing (screen) offset y */ - short w; /* width of buffer, not in sync with vis_w */ - short h; /* height of buffer, not in sync with vis_w */ - short vis_x; /* visible rectangle of the screen buffer */ - short vis_y; /* coords are relative to plot location */ - short vis_w; /* clipped to screen dimensions */ - short vis_h; /* visible width */ - struct rect abs_clipping; /* The toplevel clipping rectangle */ - struct rect clipping; /* actual clipping rectangle */ - float scale; -}; - -/* -* Capture the screen at x,y location -* param self instance -* param x absolute screen coords -* param y absolute screen coords -* param w width -* param h height -* -* This creates an snapshot in RGBA format (NetSurf's native format) -* -*/ -static struct bitmap * snapshot_create(int x, int y, int w, int h); - -/* Garbage collection of the snapshot routine */ -/* this should be called after you are done with the data returned by snapshot_create */ -/* don't access the screenshot after you called this function */ -static void snapshot_suspend(void); - -/* destroy memory used by screenshot */ -static void snapshot_destroy(void); - -#ifdef WITH_8BPP_SUPPORT -static unsigned short sys_pal[256][3]; /*RGB*/ -static unsigned short pal[256][3]; /*RGB*/ -static char rgb_lookup[256][4]; -short web_std_colors[6] = {0, 51, 102, 153, 204, 255}; - -unsigned short vdi_web_pal[216][3] = { - {0x000,0x000,0x000}, {0x0c8,0x000,0x000}, {0x190,0x000,0x000}, {0x258,0x000,0x000}, {0x320,0x000,0x000}, {0x3e8,0x000,0x000}, - {0x000,0x0c8,0x000}, {0x0c8,0x0c8,0x000}, {0x190,0x0c8,0x000}, {0x258,0x0c8,0x000}, {0x320,0x0c8,0x000}, {0x3e8,0x0c8,0x000}, - {0x000,0x190,0x000}, {0x0c8,0x190,0x000}, {0x190,0x190,0x000}, {0x258,0x190,0x000}, {0x320,0x190,0x000}, {0x3e8,0x190,0x000}, - {0x000,0x258,0x000}, {0x0c8,0x258,0x000}, {0x190,0x258,0x000}, {0x258,0x258,0x000}, {0x320,0x258,0x000}, {0x3e8,0x258,0x000}, - {0x000,0x320,0x000}, {0x0c8,0x320,0x000}, {0x190,0x320,0x000}, {0x258,0x320,0x000}, {0x320,0x320,0x000}, {0x3e8,0x320,0x000}, - {0x000,0x3e8,0x000}, {0x0c8,0x3e8,0x000}, {0x190,0x3e8,0x000}, {0x258,0x3e8,0x000}, {0x320,0x3e8,0x000}, {0x3e8,0x3e8,0x000}, - {0x000,0x000,0x0c8}, {0x0c8,0x000,0x0c8}, {0x190,0x000,0x0c8}, {0x258,0x000,0x0c8}, {0x320,0x000,0x0c8}, {0x3e8,0x000,0x0c8}, - {0x000,0x0c8,0x0c8}, {0x0c8,0x0c8,0x0c8}, {0x190,0x0c8,0x0c8}, {0x258,0x0c8,0x0c8}, {0x320,0x0c8,0x0c8}, {0x3e8,0x0c8,0x0c8}, - {0x000,0x190,0x0c8}, {0x0c8,0x190,0x0c8}, {0x190,0x190,0x0c8}, {0x258,0x190,0x0c8}, {0x320,0x190,0x0c8}, {0x3e8,0x190,0x0c8}, - {0x000,0x258,0x0c8}, {0x0c8,0x258,0x0c8}, {0x190,0x258,0x0c8}, {0x258,0x258,0x0c8}, {0x320,0x258,0x0c8}, {0x3e8,0x258,0x0c8}, - {0x000,0x320,0x0c8}, {0x0c8,0x320,0x0c8}, {0x190,0x320,0x0c8}, {0x258,0x320,0x0c8}, {0x320,0x320,0x0c8}, {0x3e8,0x320,0x0c8}, - {0x000,0x3e8,0x0c8}, {0x0c8,0x3e8,0x0c8}, {0x190,0x3e8,0x0c8}, {0x258,0x3e8,0x0c8}, {0x320,0x3e8,0x0c8}, {0x3e8,0x3e8,0x0c8}, - {0x000,0x000,0x190}, {0x0c8,0x000,0x190}, {0x190,0x000,0x190}, {0x258,0x000,0x190}, {0x320,0x000,0x190}, {0x3e8,0x000,0x190}, - {0x000,0x0c8,0x190}, {0x0c8,0x0c8,0x190}, {0x190,0x0c8,0x190}, {0x258,0x0c8,0x190}, {0x320,0x0c8,0x190}, {0x3e8,0x0c8,0x190}, - {0x000,0x190,0x190}, {0x0c8,0x190,0x190}, {0x190,0x190,0x190}, {0x258,0x190,0x190}, {0x320,0x190,0x190}, {0x3e8,0x190,0x190}, - {0x000,0x258,0x190}, {0x0c8,0x258,0x190}, {0x190,0x258,0x190}, {0x258,0x258,0x190}, {0x320,0x258,0x190}, {0x3e8,0x258,0x190}, - {0x000,0x320,0x190}, {0x0c8,0x320,0x190}, {0x190,0x320,0x190}, {0x258,0x320,0x190}, {0x320,0x320,0x190}, {0x3e8,0x320,0x190}, - {0x000,0x3e8,0x190}, {0x0c8,0x3e8,0x190}, {0x190,0x3e8,0x190}, {0x258,0x3e8,0x190}, {0x320,0x3e8,0x190}, {0x3e8,0x3e8,0x190}, - {0x000,0x000,0x258}, {0x0c8,0x000,0x258}, {0x190,0x000,0x258}, {0x258,0x000,0x258}, {0x320,0x000,0x258}, {0x3e8,0x000,0x258}, - {0x000,0x0c8,0x258}, {0x0c8,0x0c8,0x258}, {0x190,0x0c8,0x258}, {0x258,0x0c8,0x258}, {0x320,0x0c8,0x258}, {0x3e8,0x0c8,0x258}, - {0x000,0x190,0x258}, {0x0c8,0x190,0x258}, {0x190,0x190,0x258}, {0x258,0x190,0x258}, {0x320,0x190,0x258}, {0x3e8,0x190,0x258}, - {0x000,0x258,0x258}, {0x0c8,0x258,0x258}, {0x190,0x258,0x258}, {0x258,0x258,0x258}, {0x320,0x258,0x258}, {0x3e8,0x258,0x258}, - {0x000,0x320,0x258}, {0x0c8,0x320,0x258}, {0x190,0x320,0x258}, {0x258,0x320,0x258}, {0x320,0x320,0x258}, {0x3e8,0x320,0x258}, - {0x000,0x3e8,0x258}, {0x0c8,0x3e8,0x258}, {0x190,0x3e8,0x258}, {0x258,0x3e8,0x258}, {0x320,0x3e8,0x258}, {0x3e8,0x3e8,0x258}, - {0x000,0x000,0x320}, {0x0c8,0x000,0x320}, {0x190,0x000,0x320}, {0x258,0x000,0x320}, {0x320,0x000,0x320}, {0x3e8,0x000,0x320}, - {0x000,0x0c8,0x320}, {0x0c8,0x0c8,0x320}, {0x190,0x0c8,0x320}, {0x258,0x0c8,0x320}, {0x320,0x0c8,0x320}, {0x3e8,0x0c8,0x320}, - {0x000,0x190,0x320}, {0x0c8,0x190,0x320}, {0x190,0x190,0x320}, {0x258,0x190,0x320}, {0x320,0x190,0x320}, {0x3e8,0x190,0x320}, - {0x000,0x258,0x320}, {0x0c8,0x258,0x320}, {0x190,0x258,0x320}, {0x258,0x258,0x320}, {0x320,0x258,0x320}, {0x3e8,0x258,0x320}, - {0x000,0x320,0x320}, {0x0c8,0x320,0x320}, {0x190,0x320,0x320}, {0x258,0x320,0x320}, {0x320,0x320,0x320}, {0x3e8,0x320,0x320}, - {0x000,0x3e8,0x320}, {0x0c8,0x3e8,0x320}, {0x190,0x3e8,0x320}, {0x258,0x3e8,0x320}, {0x320,0x3e8,0x320}, {0x3e8,0x3e8,0x320}, - {0x000,0x000,0x3e8}, {0x0c8,0x000,0x3e8}, {0x190,0x000,0x3e8}, {0x258,0x000,0x3e8}, {0x320,0x000,0x3e8}, {0x3e8,0x000,0x3e8}, - {0x000,0x0c8,0x3e8}, {0x0c8,0x0c8,0x3e8}, {0x190,0x0c8,0x3e8}, {0x258,0x0c8,0x3e8}, {0x320,0x0c8,0x3e8}, {0x3e8,0x0c8,0x3e8}, - {0x000,0x190,0x3e8}, {0x0c8,0x190,0x3e8}, {0x190,0x190,0x3e8}, {0x258,0x190,0x3e8}, {0x320,0x190,0x3e8}, {0x3e8,0x190,0x3e8}, - {0x000,0x258,0x3e8}, {0x0c8,0x258,0x3e8}, {0x190,0x258,0x3e8}, {0x258,0x258,0x3e8}, {0x320,0x258,0x3e8}, {0x3e8,0x258,0x3e8}, - {0x000,0x320,0x3e8}, {0x0c8,0x320,0x3e8}, {0x190,0x320,0x3e8}, {0x258,0x320,0x3e8}, {0x320,0x320,0x3e8}, {0x3e8,0x320,0x3e8}, - {0x000,0x3e8,0x3e8}, {0x0c8,0x3e8,0x3e8}, {0x190,0x3e8,0x3e8}, {0x258,0x3e8,0x3e8}, {0x320,0x3e8,0x3e8}, {0x3e8,0x3e8,0x3e8} -}; -#endif - -/* Error code translations: */ -static const char * plot_error_codes[] = { - "None", - "ERR_BUFFERSIZE_EXCEEDS_SCREEN", - "ERR_NO_MEM", - "ERR_PLOTTER_NOT_AVAILABLE" -}; - -FONT_PLOTTER fplotter = NULL; - -extern short vdih; - -/* temp buffer for bitmap conversion: */ -static void * buf_packed; -static int size_buf_packed; - -/* temp buffer for bitmap conversion: */ -void * buf_planar; -int size_buf_planar; - -/* buffer for plot operations that require device format, */ -/* currently used for transparent mfdb blits and snapshots: */ -static MFDB buf_scr; -static int size_buf_scr; - -/* buffer for std form, used during 8bpp snapshot */ -MFDB buf_std; -int size_buf_std; - -struct bitmap * buf_scr_compat; - -/* intermediate bitmap format */ -static HermesFormat vfmt; - -/* no screen format here, hermes may not suitable for it */ - -/* netsurf source bitmap format */ -static HermesFormat nsfmt; - -struct s_vdi_sysinfo vdi_sysinfo; -/* bit depth of framebuffers: */ -static int atari_plot_bpp_virt; -static struct s_view view; - -//static HermesHandle hermes_pal_h; /* hermes palette handle */ -static HermesHandle hermes_cnv_h; /* hermes converter instance handle */ -static HermesHandle hermes_res_h; - -//static short prev_vdi_clip[4]; -static struct bitmap snapshot; - -VdiHdl atari_plot_vdi_handle = -1; -unsigned long atari_plot_flags; -unsigned long atari_font_flags; - -typedef bool (*bitmap_convert_fnc)( struct bitmap * img, int x, int y, - GRECT * clip, uint32_t bg, uint32_t flags, MFDB *out ); -static bitmap_convert_fnc bitmap_convert; - -const char* plot_err_str(int i) -{ - return(plot_error_codes[abs(i)]); -} - -/** - * Set line drawing color by passing netsurf XBGR "colour" type. - * - * \param vdih The vdi handle - * \param cin The netsurf colour value - */ -inline static void vsl_rgbcolor(short vdih, colour cin) -{ - #ifdef WITH_8BPP_SUPPORT - if( vdi_sysinfo.scr_bpp > 8 ) { - #endif - RGB1000 c; /* a struct with three (RGB) shorts */ - rgb_to_vdi1000( (unsigned char*)&cin, &c); - vs_color(vdih, OFFSET_CUSTOM_COLOR, (short *)&c); - vsl_color(vdih, OFFSET_CUSTOM_COLOR); - #ifdef WITH_8BPP_SUPPORT - } else { - if( vdi_sysinfo.scr_bpp >= 4 ){ - vsl_color(vdih, RGB_TO_VDI(cin)); - } - else - vsl_color(vdih, BLACK); - } - #endif -} - -/** - * Set fill color by passing netsurf XBGR "colour" type. - * - * \param vdih The vdi handle - * \param cin The netsurf colour value - */ -inline static void vsf_rgbcolor(short vdih, colour cin) -{ - #ifdef WITH_8BPP_SUPPORT - if( vdi_sysinfo.scr_bpp > 8 ) { - #endif - RGB1000 c; /* a struct with three (RGB) shorts */ - rgb_to_vdi1000( (unsigned char*)&cin, &c); - vs_color( vdih, OFFSET_CUSTOM_COLOR, (short *)&c); - vsf_color( vdih, OFFSET_CUSTOM_COLOR ); - #ifdef WITH_8BPP_SUPPORT - } else { - if( vdi_sysinfo.scr_bpp >= 4 ){ - vsf_color( vdih, RGB_TO_VDI(cin) ); - } - else - vsf_color( vdih, WHITE ); - } - #endif -} - - - -/** - * Get current visible coords - */ -inline static void plot_get_visible_grect(GRECT * out) -{ - out->g_x = view.vis_x; - out->g_y = view.vis_y; - out->g_w = view.vis_w; - out->g_h = view.vis_h; -} - - - -/* calculate visible area of framebuffer in coords relative to framebuffer */ -/* position */ -/* result: */ -/* this function should calculates an rectangle relative to the plot origin*/ -/* and size. */ -/* If the ploter coords do not fall within the screen region, */ -/* all values of the region are set to zero. */ -inline static void update_visible_rect(void) -{ - GRECT screen; // dimensions of the screen - GRECT frame; // dimensions of the drawing area - GRECT common; // dimensions of intersection of both - - screen.g_x = 0; - screen.g_y = 0; - screen.g_w = vdi_sysinfo.scr_w; - screen.g_h = vdi_sysinfo.scr_h; - - common.g_x = frame.g_x = view.x; - common.g_y = frame.g_y = view.y; - common.g_w = frame.g_w = view.w; - common.g_h = frame.g_h = view.h; - - if (rc_intersect(&screen, &common)) { - view.vis_w = common.g_w; - view.vis_h = common.g_h; - if (view.x < screen.g_x) - view.vis_x = frame.g_w - common.g_w; - else - view.vis_x = 0; - if (view.y <screen.g_y) - view.vis_y = frame.g_h - common.g_h; - else - view.vis_y = 0; - } else { - view.vis_w = view.vis_h = 0; - view.vis_x = view.vis_y = 0; - } -} - -/* Returns the visible parts of the box (relative coords within framebuffer),*/ -/* relative to screen coords (normally starting at 0,0 ) */ -inline static bool fbrect_to_screen(GRECT box, GRECT * ret) -{ - GRECT out, vis, screen; - - screen.g_x = 0; - screen.g_y = 0; - screen.g_w = vdi_sysinfo.scr_w; - screen.g_h = vdi_sysinfo.scr_h; - - /* get visible region: */ - vis.g_x = view.x; - vis.g_y = view.y; - vis.g_w = view.w; - vis.g_h = view.h; - - if ( !rc_intersect( &screen, &vis ) ) { - return( false ); - } - vis.g_x = view.w - vis.g_w; - vis.g_y = view.h - vis.g_h; - - /* clip box to visible region: */ - if( !rc_intersect(&vis, &box) ) { - return( false ); - } - out.g_x = box.g_x + view.x; - out.g_y = box.g_y + view.y; - out.g_w = box.g_w; - out.g_h = box.g_h; - *ret = out; - return ( true ); -} - -/* copy an rectangle from the plot buffer to screen */ -/* because this is an on-screen plotter, this is an screen to screen copy. */ -bool plot_copy_rect(GRECT src, GRECT dst) -{ - MFDB devmf; - MFDB scrmf; - short pxy[8]; - GRECT vis; - - /* clip to visible rect, only needed for onscreen renderer: */ - plot_get_visible_grect(&vis ); - - if( !rc_intersect(&vis, &src) ) - return(true); - if( !rc_intersect(&vis, &dst) ) - return(true); - - src.g_x = view.x + src.g_x; - src.g_y = view.y + src.g_y; - dst.g_x = view.x + dst.g_x; - dst.g_y = view.y + dst.g_y; - - devmf.fd_addr = NULL; - devmf.fd_w = src.g_w; - devmf.fd_h = src.g_h; - devmf.fd_wdwidth = 0; - devmf.fd_stand = 0; - devmf.fd_nplanes = 0; - devmf.fd_r1 = devmf.fd_r2 = devmf.fd_r3 = 0; - - scrmf.fd_addr = NULL; - scrmf.fd_w = dst.g_w; - scrmf.fd_h = dst.g_h; - scrmf.fd_wdwidth = 0 ; - scrmf.fd_stand = 0; - scrmf.fd_nplanes = 0; - scrmf.fd_r1 = scrmf.fd_r2 = scrmf.fd_r3 = 0; - - pxy[0] = src.g_x; - pxy[1] = src.g_y; - pxy[2] = pxy[0] + src.g_w-1; - pxy[3] = pxy[1] + src.g_h-1; - pxy[4] = dst.g_x; - pxy[5] = dst.g_y; - pxy[6] = pxy[4] + dst.g_w-1; - pxy[7] = pxy[5] + dst.g_h-1; - plot_lock(); - vro_cpyfm( atari_plot_vdi_handle, S_ONLY, (short*)&pxy, &devmf, &scrmf); - plot_unlock(); - - return(true); -} - -/** - * Fill the screen info structure. - * - * \param vdhi The handle - * \param[out] info The infor structure to fill. - */ -static void read_vdi_sysinfo(short vdih, struct s_vdi_sysinfo * info) { - - unsigned long cookie_EdDI=0; /** \todo this long is being cast to a pointer */ - short out[300]; - memset( info, 0, sizeof(struct s_vdi_sysinfo) ); - - info->vdi_handle = vdih; - if ( tos_getcookie(C_EdDI, (long *)&cookie_EdDI) == C_NOTFOUND ) { - info->EdDiVersion = 0; - } else { - info->EdDiVersion = EdDI_version( (void *)cookie_EdDI ); - } - - memset( &out, 0, sizeof(short)*300 ); - vq_extnd( vdih, 0, (short*)&out ); - info->scr_w = out[0]+1; - info->scr_h = out[1]+1; - if( out[39] == 2 ) { - info->scr_bpp = 1; - info->colors = out[39]; - } else { - info->colors = out[39]; - } - - memset( &out, 0, sizeof(short)*300 ); - vq_extnd( vdih, 1, (short*)&out ); - info->scr_bpp = out[4]; - info->maxpolycoords = out[14]; - info->maxintin = out[15]; - if( out[30] & 1 ) { - info->rasterscale = true; - } else { - info->rasterscale = false; - } - - switch( info->scr_bpp ) { - case 8: - info->pixelsize=1; - break; - case 15: - case 16: - info->pixelsize=2; - break; - case 24: - info->pixelsize=3; - break; - case 32: - info->pixelsize=4; - break; - case 64: - info->pixelsize=8; - break; - default: - info->pixelsize=1; - break; - - } - info->pitch = info->scr_w * info->pixelsize; - info->vdiformat = ( (info->scr_bpp <= 8) ? VDI_FORMAT_INTER : VDI_FORMAT_PACK); - info->screensize = ( info->scr_w * info->pixelsize ) * info->scr_h; - - if( info->EdDiVersion >= EDDI_10 ) { - memset( &out, 0, sizeof(short)*300 ); - vq_scrninfo(vdih, (short*)&out); - info->vdiformat = out[0]; - info->clut = out[1]; - info->scr_bpp = out[2]; - info->hicolors = *((unsigned long*) &out[3]); - if( info->EdDiVersion >= EDDI_11 ) { - info->pitch = out[5]; - info->screen = (void *) *((unsigned long *) &out[6]); - } - - switch( info->clut ) { - - case VDI_CLUT_HARDWARE: { - - } - break; - - case VDI_CLUT_SOFTWARE: { - int component; /* red, green, blue, alpha, overlay */ - int num_bit; - unsigned short *tmp_p; - - /* We can build masks with info here */ - tmp_p = (unsigned short *) &out[16]; - for (component=0; component<5; component++) { - for (num_bit=0; num_bit<16; num_bit++) { - unsigned short val; - - val = *tmp_p++; - - if (val == 0xffff) { - continue; - } - - switch(component) { - case 0: - info->mask_r |= 1<< val; - break; - case 1: - info->mask_g |= 1<< val; - break; - case 2: - info->mask_b |= 1<< val; - break; - case 3: - info->mask_a |= 1<< val; - break; - } - } - } - } - - /* Remove lower green bits for Intel endian screen */ - if ((info->mask_g == ((7<<13)|3)) || (info->mask_g == ((7<<13)|7))) { - info->mask_g &= ~(7<<13); - } - break; - - case VDI_CLUT_NONE: - break; - } - } -} - - -/* - Convert an RGB color to an VDI Color -*/ -inline void rgb_to_vdi1000(unsigned char * in, RGB1000 *out) -{ - double r = ((double)in[3]/255); /* prozentsatz red */ - double g = ((double)in[2]/255); /* prozentsatz green */ - double b = ((double)in[1]/255); /* prozentsatz blue */ - out->red = 1000 * r + 0.5; - out->green = 1000 * g + 0.5; - out->blue = 1000 * b + 0.5; - return; -} - -inline void vdi1000_to_rgb(unsigned short * in, unsigned char * out) -{ - double r = ((double)in[0]/1000); /* prozentsatz red */ - double g = ((double)in[1]/1000); /* prozentsatz green */ - double b = ((double)in[2]/1000); /* prozentsatz blue */ - out[2] = 255 * r + 0.5; - out[1] = 255 * g + 0.5; - out[0] = 255 * b + 0.5; - return; -} - - -#ifdef WITH_8BPP_SUPPORT -/** - * Set pixel within an 8 bit VDI standard bitmap. - */ -inline static void set_stdpx( MFDB * dst, int wdplanesz, int x, int y, unsigned char val ) -{ - short * buf; - short whichbit = (1<<(15-(x%16))); - - buf = dst->fd_addr; - buf += ((dst->fd_wdwidth*(y))+(x>>4)); - - *buf = (val&1) ? ((*buf)|(whichbit)) : ((*buf)&~(whichbit)); - - buf += wdplanesz; - *buf = (val&(1<<1)) ? ((*buf)|(whichbit)) : ((*buf)&~(whichbit)); - - buf += wdplanesz; - *buf = (val&(1<<2)) ? ((*buf)|(whichbit)) : ((*buf)&~(whichbit)); - - buf += wdplanesz; - *buf = (val&(1<<3)) ? ((*buf)|(whichbit)) : ((*buf)&~(whichbit)); - - buf += wdplanesz; - *buf = (val&(1<<4)) ? ((*buf)|(whichbit)) : ((*buf)&~(whichbit)); - - buf += wdplanesz; - *buf = (val&(1<<5)) ? ((*buf)|(whichbit)) : ((*buf)&~(whichbit)); - - buf += wdplanesz; - *buf = (val&(1<<6)) ? ((*buf)|(whichbit)) : ((*buf)&~(whichbit)); - - buf += wdplanesz; - *buf = (val&(1<<7)) ? ((*buf)|(whichbit)) : ((*buf)&~(whichbit)); -} - -/** - * Read pixel from an 8 bit VDI standard bitmap. - */ -inline static unsigned char get_stdpx(MFDB * dst, int wdplanesz, int x, int y) -{ - unsigned char ret=0; - short * buf; - short whichbit = (1<<(15-(x%16))); - - buf = dst->fd_addr; - buf += ((dst->fd_wdwidth*(y))+(x>>4)); - - if( *buf & whichbit ) - ret |= 1; - - buf += wdplanesz; - if( *buf & whichbit ) - ret |= 2; - - buf += wdplanesz; - if( *buf & whichbit ) - ret |= 4; - - buf += wdplanesz; - if( *buf & whichbit ) - ret |= 8; - - buf += wdplanesz; - if( *buf & whichbit ) - ret |= 16; - - buf += wdplanesz; - if( *buf & whichbit ) - ret |= 32; - - buf += wdplanesz; - if( *buf & whichbit ) - ret |= 64; - - buf += wdplanesz; - if( *buf & whichbit ) - ret |= 128; - - return( ret ); -} - -/* - Convert an RGB color into an index into the 216 colors web pallette -*/ -inline short rgb_to_666_index(unsigned char r, unsigned char g, unsigned char b) -{ - short i; - unsigned char rgb[3] = {r,g,b}; - unsigned char tval[3]; - - int diff_a, diff_b, diff_c; - diff_a = abs(r-g); - diff_b = abs(r-b); - diff_c = abs(r-b); - if( diff_a < 2 && diff_b < 2 && diff_c < 2 ) { - if( (r!=0XFF) && (g!=0XFF) && (b!=0XFF) ) { - if( ((r&0xF0)>>4) != 0 ) - //printf("conv gray: %x -> %d\n", ((r&0xF0)>>4) , (OFFSET_CUST_PAL) + ((r&0xF0)>>4) ); - return( (OFFSET_CUST_PAL - OFFSET_WEB_PAL) + ((r&0xF0)>>4) ); - } - } - - /* convert each 8bit color to 6bit web color: */ - for( i=0; i<3; i++) { - if(0 == rgb[i] % web_std_colors[1] ) { - tval[i] = rgb[i] / web_std_colors[1]; - } else { - int pos = ((short)rgb[i] / web_std_colors[1]); - if( abs(rgb[i] - web_std_colors[pos]) > abs(rgb[i] - web_std_colors[pos+1]) ) - tval[i] = pos+1; - else - tval[i] = pos; - } - } - return(tval[2]*36+tval[1]*6+tval[0]); -} -#endif - - -static void dump_vdi_info(short vdih) -{ - struct s_vdi_sysinfo temp; - read_vdi_sysinfo( vdih, &temp ); - printf("struct s_vdi_sysinfo {\n"); - printf(" short vdi_handle: %d\n", temp.vdi_handle); - printf(" short scr_w: %d \n", temp.scr_w); - printf(" short scr_h: %d\n", temp.scr_h); - printf(" short scr_bpp: %d\n", temp.scr_bpp); - printf(" int colors: %d\n", temp.colors); - printf(" ulong hicolors: %lu\n", temp.hicolors); - printf(" short pixelsize: %d\n", temp.pixelsize); - printf(" unsigned short pitch: %d\n", temp.pitch); - printf(" unsigned short vdiformat: %d\n", temp.vdiformat); - printf(" unsigned short clut: %d\n", temp.clut); - printf(" void * screen: 0x0%p\n", temp.screen); - printf(" unsigned long screensize: %lu\n", temp.screensize); - printf(" unsigned long mask_r: 0x0%08lx\n", temp.mask_r); - printf(" unsigned long mask_g: 0x0%08lx\n", temp.mask_g); - printf(" unsigned long mask_b: 0x0%08lx\n", temp.mask_b); - printf(" unsigned long mask_a: 0x0%08lx\n", temp.mask_a); - printf(" short maxintin: %d\n", temp.maxintin); - printf(" short maxpolycoords: %d\n", temp.maxpolycoords); - printf(" unsigned long EdDiVersion: 0x0%03lx\n", temp.EdDiVersion); - printf(" unsigned short rasterscale: 0x%2x\n", temp.rasterscale); - printf("};\n"); -} - -/** - * Create an snapshot of the screen image in device format. - */ -static MFDB * snapshot_create_native_mfdb(int x, int y, int w, int h) -{ - MFDB scr; - short pxy[8]; - - /* allocate memory for the snapshot */ - { - int scr_stride = MFDB_STRIDE( w ); - int scr_size = ( ((scr_stride >> 3) * h) * vdi_sysinfo.scr_bpp ); - if(size_buf_scr == 0 ){ - /* init screen mfdb */ - buf_scr.fd_addr = malloc( scr_size ); - size_buf_scr = scr_size; - } else { - if( scr_size >size_buf_scr ) { - buf_scr.fd_addr = realloc( - buf_scr.fd_addr, scr_size - ); - size_buf_scr = scr_size; - } - } - if(buf_scr.fd_addr == NULL ) { - size_buf_scr = 0; - return( NULL ); - } - buf_scr.fd_nplanes = vdi_sysinfo.scr_bpp; - buf_scr.fd_w = scr_stride; - buf_scr.fd_h = h; - buf_scr.fd_wdwidth = scr_stride >> 4; - assert(buf_scr.fd_addr != NULL ); - } - init_mfdb( 0, w, h, 0, &scr ); - pxy[0] = x; - pxy[1] = y; - pxy[2] = pxy[0] + w-1; - pxy[3] = pxy[1] + h-1; - pxy[4] = 0; - pxy[5] = 0; - pxy[6] = w-1; - pxy[7] = h-1; - vro_cpyfm( - atari_plot_vdi_handle, S_ONLY, (short*)&pxy, - &scr, &buf_scr - ); - - return( &buf_scr ); -} - -/** - * Create an snapshot of the screen image in VDI standard format (8 bit). - */ -static MFDB * snapshot_create_std_mfdb(int x, int y, int w, int h) -{ - /* allocate memory for the snapshot */ - { - int scr_stride = MFDB_STRIDE( w ); - int scr_size = ( ((scr_stride >> 3) * h) * vdi_sysinfo.scr_bpp ); - if(size_buf_std == 0 ){ - /* init screen mfdb */ - buf_std.fd_addr = malloc( scr_size ); - size_buf_std = scr_size; - } else { - if( scr_size >size_buf_std ) { - buf_std.fd_addr = realloc( - buf_std.fd_addr, scr_size - ); - size_buf_std = scr_size; - } - } - if(buf_std.fd_addr == NULL ) { - size_buf_std = 0; - return( NULL ); - } - buf_std.fd_nplanes = 8; - buf_std.fd_w = scr_stride; - buf_std.fd_h = h; - buf_std.fd_stand = 1; - buf_std.fd_wdwidth = scr_stride >> 4; - assert(buf_std.fd_addr != NULL ); - } - MFDB * native = snapshot_create_native_mfdb(x,y,w,h ); - assert( native ); - - vr_trnfm(atari_plot_vdi_handle, native, &buf_std); - return( &buf_std ); -} - -/* - * Create an snapshot of the screen in netsurf ABGR format - */ -static struct bitmap * snapshot_create(int x, int y, int w, int h) -{ - int err; - MFDB * native; - // uint32_t start = clock(); - - // FIXME: This can be optimized a lot. - // 1. do not copy the snapshot to the bitmap buffer - // when the format of screen and bitmap equals. - // just point the bitmap to the native mfdb. - // 2. if we have eddi 1.1, we could optimize that further - // make snapshot_create_native_mfdb just returning a pointer - // to the screen. - - native = snapshot_create_native_mfdb(x, y, w, h ); - - if(vfmt.bits == 32 ) - goto no_copy; - - /* allocate buffer for result bitmap: */ - if(buf_scr_compat == NULL ) { - buf_scr_compat = atari_bitmap_create(w, h, 0); - } else { - buf_scr_compat = atari_bitmap_realloc( w, h, - buf_scr_compat->bpp, - w *buf_scr_compat->bpp, - BITMAP_GROW, - buf_scr_compat ); - } - - /* convert screen buffer to ns format: */ - err = Hermes_ConverterRequest( hermes_cnv_h, - &vfmt, - &nsfmt - ); - assert( err != 0 ); - err = Hermes_ConverterCopy( hermes_cnv_h, - native->fd_addr, - 0, /* x src coord of top left in pixel coords */ - 0, /* y src coord of top left in pixel coords */ - w, h, - native->fd_w * vdi_sysinfo.pixelsize, /* stride as bytes */ - buf_scr_compat->pixdata, - 0, /* x dst coord of top left in pixel coords */ - 0, /* y dst coord of top left in pixel coords */ - w, h, - atari_bitmap_get_rowstride(buf_scr_compat) /* stride as bytes */ - ); - assert( err != 0 ); - return( (struct bitmap * )buf_scr_compat ); - -no_copy: - - snapshot.width = w; - snapshot.height = h; - snapshot.pixdata = native->fd_addr; - snapshot.native = *native; - snapshot.rowstride = MFDB_STRIDE( w )*4; - - uint32_t row, col; - for (row = 0; row<(uint32_t)h; row++) { - // fd_w matches stride! - uint32_t *rowptr = ((uint32_t*)native->fd_addr + ((row*native->fd_w))); - for (col=0; col<(uint32_t)w; col++) { - *(rowptr+col) = (*(rowptr+col)<<8); - } - } - return( &snapshot ); -} - -/** - * Notify the snapshot interface that the last snapshot is no longer in use. - */ -static void snapshot_suspend(void) -{ - if(size_buf_scr > CONV_KEEP_LIMIT ) { - buf_scr.fd_addr = realloc( - buf_scr.fd_addr, CONV_KEEP_LIMIT - ); - if(buf_scr.fd_addr != NULL ) { - size_buf_scr = CONV_KEEP_LIMIT; - } else { - size_buf_scr = 0; - } - } - -#ifdef WITH_8BPP_SUPPORT - if(size_buf_std > CONV_KEEP_LIMIT ) { - buf_std.fd_addr = realloc( - buf_std.fd_addr, CONV_KEEP_LIMIT - ); - if(buf_std.fd_addr != NULL ) { - size_buf_std = CONV_KEEP_LIMIT; - } else { - size_buf_std = 0; - } - } -#endif - - if(buf_scr_compat != NULL ) { - size_t bs = atari_bitmap_buffer_size(buf_scr_compat ); - if( bs > CONV_KEEP_LIMIT ) { - int w = 0; - int h = 1; - w = (CONV_KEEP_LIMIT /buf_scr_compat->bpp); - assert( CONV_KEEP_LIMIT == w*buf_scr_compat->bpp ); - buf_scr_compat = atari_bitmap_realloc( w, h, - buf_scr_compat->bpp, - CONV_KEEP_LIMIT, BITMAP_SHRINK,buf_scr_compat - ); - } - } -} - -/** - * Shut down the snapshot interface. - */ -static void snapshot_destroy(void) -{ - - free(buf_scr.fd_addr); - if( buf_scr_compat != NULL) { - atari_bitmap_destroy(buf_scr_compat); - } - - buf_scr.fd_addr = NULL; - buf_scr_compat = NULL; - -#ifdef WITH_8BPP_SUPPORT - free(buf_std.fd_addr); - buf_std.fd_addr = NULL; -#endif -} - - -inline static uint32_t ablend(uint32_t pixel, uint32_t scrpixel) -{ - int opacity = pixel & 0xFF; - int transp = 0x100 - opacity; - uint32_t rb, g; - pixel >>= 8; - scrpixel >>= 8; - rb = ((pixel & 0xFF00FF) * opacity + - (scrpixel & 0xFF00FF) * transp) >> 8; - g = ((pixel & 0x00FF00) * opacity + - (scrpixel & 0x00FF00) * transp) >> 8; - - return ((rb & 0xFF00FF) | (g & 0xFF00)) << 8; -} - -/* - Alpha blends an image, using one pixel as the background. - The bitmap receives the result. -*/ -inline static bool ablend_pixel(struct bitmap * img, uint32_t bg, GRECT * clip) -{ - uint32_t * imgrow; - int img_x, img_y, img_stride; - - img_stride= atari_bitmap_get_rowstride(img); - - for( img_y = 0; img_y < clip->g_h; img_y++) { - imgrow = (uint32_t *)(img->pixdata + (img_stride * img_y)); - for( img_x = 0; img_x < clip->g_w; img_x++ ) { - imgrow[img_x] = ablend( imgrow[img_x], bg ); - } - } - return(true); -} - - -/* - Aplha blends the foreground image (img) onto the - background images (bg). The background receives the blended - image pixels. -*/ -inline static bool ablend_bitmap( struct bitmap * img, struct bitmap * bg, - GRECT * img_clip, GRECT * bg_clip ) -{ - uint32_t * imgrow; - uint32_t * screenrow; - int img_x, img_y, bg_x, bg_y, img_stride, bg_stride; - - bg_clip = bg_clip; - img_stride = atari_bitmap_get_rowstride(img); - bg_stride = atari_bitmap_get_rowstride(bg); - - for( img_y = img_clip->g_y, bg_y = 0; bg_y < img_clip->g_h; bg_y++, img_y++) { - imgrow = (uint32_t *)(img->pixdata + (img_stride * img_y)); - screenrow = (uint32_t *)(bg->pixdata + (bg_stride * bg_y)); - for( img_x = img_clip->g_x, bg_x = 0; bg_x < img_clip->g_w; bg_x++, img_x++ ) { - - // when the pixel isn't fully transparent,...: - if( (imgrow[img_x] & 0x0FF) != 0 ){ - screenrow[bg_x] = ablend( imgrow[img_x], screenrow[bg_x]); - } - - // FIXME, maybe this loop would be faster??: - // --- - //if( (imgrow[img_x] & 0x0FF) != 0xFF ){ - // imgrow[bg_x] = ablend( imgrow[img_x], screenrow[bg_x]); - //} - - // or maybe even this??? - // --- - //if( (imgrow[img_x] & 0x0FF) == 0xFF ){ - // screenrow[bg_x] = imgrow[img_x]; - //} else if( (imgrow[img_x] & 0x0FF) != 0x00 ) { - // screenrow[bg_x] = ablend( imgrow[img_x], screenrow[bg_x]); - //} - } - } - return(false); -} - - -#ifdef WITH_8BPP_SUPPORT -/** - * Convert an bitmap to an 8 bit device dependant MFDB - * \param img the bitmap (only tested with 32bit bitmaps) - * \param x screen coord of the background - * \param y screen coord of the background - * \param clip the region of the image that get's converted - * \param bg the background used for cheap transparency - * \param flags - * \param out receives the converted bitmap (still owned by the plot API) - * - */ -static bool bitmap_convert_8(struct bitmap * img, int x, - int y, GRECT * clip, uint32_t bg, uint32_t flags, - MFDB *out ) -{ - MFDB native; - MFDB stdform; - int dststride; /* stride of dest. image */ - int dstsize; /* size of dest. in byte */ - int bw, bh; - struct bitmap * scrbuf = NULL; - bool cache = ( flags & BITMAPF_BUFFER_NATIVE ); - bool opaque = atari_bitmap_get_opaque( img ); - - if( opaque == false ){ - if( ( (atari_plot_flags & PLOT_FLAG_TRANS) == 0) - && - ((flags & (BITMAPF_MONOGLYPH|BITMAPF_BUFFER_NATIVE))==0) ){ - opaque = true; - } - } - - assert( clip->g_h > 0 ); - assert( clip->g_w > 0 ); - - bw = atari_bitmap_get_width( img ); - bh = atari_bitmap_get_height( img ); - - // The converted bitmap can be saved for subsequent blits, when - // the bitmap is fully opaque - - if( (opaque == true) || (flags & BITMAPF_BUFFER_NATIVE ) ){ - if( img->converted == true ){ - *out = img->native; - return( 0 ); - } - if( ( flags & BITMAPF_MONOGLYPH ) == 0 ){ - cache = true; - } - } - if( ( flags & BITMAPF_MONOGLYPH ) != 0 ){ - assert(cache == false); - } - - /* (re)allocate buffer for out image: */ - /* altough the buffer is named "buf_packed" on 8bit systems */ - /* it's not... */ - if( cache == false ){ - // the size of the output will match the size of the clipping: - dststride = MFDB_STRIDE( clip->g_w ); - dstsize = ( ((dststride >> 3) * clip->g_h) * atari_plot_bpp_virt); - if( dstsize > size_buf_packed) { - int blocks = (dstsize / (CONV_BLOCK_SIZE-1))+1; - if( buf_packed == NULL ) - buf_packed =(void*)malloc( blocks * CONV_BLOCK_SIZE); - else - buf_packed =(void*)realloc(buf_packed,blocks * CONV_BLOCK_SIZE); - assert( buf_packed ); - if( buf_packed == NULL ) { - return( 0-ERR_NO_MEM ); - } - size_buf_packed = blocks * CONV_BLOCK_SIZE; - } - native.fd_addr = buf_packed; - } - else { - // the output image will be completly saved, so size of the output - // image will match the input image size. - dststride = MFDB_STRIDE( bw ); - dstsize = ( ((dststride >> 3) * bh) * atari_plot_bpp_virt); - assert( out->fd_addr == NULL ); - native.fd_addr = (void*)malloc( dstsize ); - if (native.fd_addr == NULL){ - if (scrbuf != NULL) - atari_bitmap_destroy(scrbuf); - return( 0-ERR_NO_MEM ); - } - } - - - /* - on 8 bit systems we must convert the TC (ABGR) image - to vdi standard format. ( only tested for 256 colors ) - and then convert it to native format with v_trnfm() - */ - // realloc mem for stdform - if( opaque == false ){ - // point image to snapshot buffer, otherwise allocate mem - MFDB * bg = snapshot_create_std_mfdb(x, y, clip->g_w, clip->g_h); - stdform.fd_addr = bg->fd_addr; - bh = clip->g_h; - } else { - if( dstsize > size_buf_planar) { - int blocks = (dstsize / (CONV_BLOCK_SIZE-1))+1; - if( buf_planar == NULL ) - buf_planar =(void*)malloc( blocks * CONV_BLOCK_SIZE ); - else - buf_planar =(void*)realloc(buf_planar, blocks * CONV_BLOCK_SIZE); - assert(buf_planar); - if( buf_planar == NULL ) { - return( 0-ERR_NO_MEM ); - } - size_buf_planar = blocks * CONV_BLOCK_SIZE; - } - stdform.fd_addr = buf_planar; - } - stdform.fd_w = dststride; - stdform.fd_h = bh; - stdform.fd_wdwidth = dststride >> 4; - stdform.fd_stand = 1; - stdform.fd_nplanes = (short)atari_plot_bpp_virt; - stdform.fd_r1 = stdform.fd_r2 = stdform.fd_r3 = 0; - - int img_stride = atari_bitmap_get_rowstride(img); - uint32_t prev_pixel = 0x12345678; //TODO: check for collision in first pixel - unsigned long col = 0; - unsigned char val = 0; - uint32_t * row; - uint32_t pixel; - int wdplanesize = stdform.fd_wdwidth*stdform.fd_h; - - if( opaque == false ){ - // apply transparency and convert to vdi std format - unsigned long bgcol = 0; - unsigned char prev_col = 0; - for( y=0; y<clip->g_h; y++ ){ - row = (uint32_t *)(img->pixdata + (img_stride * (y+clip->g_y))); - for( x=0; x<clip->g_w; x++ ){ - pixel = row[x+clip->g_x]; - if( (pixel&0xFF) == 0 ){ - continue; - } - if( (pixel&0xFF) < 0xF0 ){ - col = get_stdpx( &stdform, wdplanesize,x,y ); - if( (col != prev_col) || (y == 0) ) - bgcol = (((rgb_lookup[col][2] << 16) | (rgb_lookup[col][1] << 8) | (rgb_lookup[col][0]))<<8); - if( prev_col != col || prev_pixel != pixel ){ - prev_col = col; - pixel = ablend( pixel, bgcol ); - prev_pixel = pixel; - pixel = pixel >> 8; - /* convert pixel value to vdi color index: */ - col = ( ((pixel&0xFF)<<16) - | (pixel&0xFF00) - | ((pixel&0xFF0000)>>16) ); - val = RGB_TO_VDI( col ); - } - set_stdpx( &stdform, wdplanesize, x, y, val ); - } else { - if( pixel != prev_pixel ){ - /* convert pixel value to vdi color index: */ - pixel = pixel >> 8; - col = ( ((pixel&0xFF)<<16) - | (pixel&0xFF00) - | ((pixel&0xFF0000)>>16) ); - val = RGB_TO_VDI( col ); - prev_pixel = pixel; - } - set_stdpx( &stdform, wdplanesize, x, y, val ); - } - } - } - // adjust output position: - clip->g_x = 0; - clip->g_y = 0; - } else { - // convert the whole image data to vdi std format. - for( y=0; y < bh; y++ ){ - row = (uint32_t *)(img->pixdata + (img_stride * y)); - for( x=0; x < bw; x++ ){ - pixel = row[x]; - if( pixel != prev_pixel ){ - /* convert pixel value to vdi color index: */ - pixel = pixel >> 8; - col = ( ((pixel&0xFF)<<16) - | (pixel&0xFF00) - | ((pixel&0xFF0000)>>16) ); - val = RGB_TO_VDI( col ); - prev_pixel = pixel; - } - set_stdpx( &stdform, wdplanesize, x, y, val ); - } - } - } - - // convert into native format: - native.fd_w = stdform.fd_w; - native.fd_h = stdform.fd_h; - native.fd_wdwidth = stdform.fd_wdwidth; - native.fd_stand = 0; - native.fd_nplanes = (short)atari_plot_bpp_virt; - native.fd_r1 = native.fd_r2 = native.fd_r3 = 0; - vr_trnfm(atari_plot_vdi_handle, &stdform, &native ); - *out = native; - if( cache == true ){ - img->native = native; - img->converted = true; - } - - return(0); -} -#endif - - -/* -* -* Convert bitmap to the native screen format -* img: the bitmap -* x: coordinate where the bitmap REGION (described in clip) -* shall be drawn (screen coords) -* y: coordinate where the bitmap REGION (described in clip) -* shall be drawn (screen coords) -* clip: which area of the bitmap shall be drawn -* bg: background color -* flags: blit flags -* out: the result MFDB -*/ -static bool bitmap_convert_tc(struct bitmap * img, int x, int y, - GRECT * clip, uint32_t bg, uint32_t flags, MFDB *out ) -{ - int dststride; /* stride of dest. image */ - int dstsize; /* size of dest. in byte */ - int err; - int bw, bh; - struct bitmap * scrbuf = NULL; - struct bitmap * source = NULL; - bool cache = ( flags & BITMAPF_BUFFER_NATIVE ); - bool opaque = atari_bitmap_get_opaque( img ); - - if( opaque == false ){ - if( ( (atari_plot_flags & PLOT_FLAG_TRANS) == 0) - && - ((flags & (BITMAPF_MONOGLYPH|BITMAPF_BUFFER_NATIVE))==0) ){ - opaque = true; - } - } - - - assert( clip->g_h > 0 ); - assert( clip->g_w > 0 ); - - bw = atari_bitmap_get_width( img ); - bh = atari_bitmap_get_height( img ); - - // The converted bitmap can be saved for subsequent blits, WHEN: - // A.) the bitmap is fully opaque OR - // B.) the bitmap is completly inside the window - // the latter one is important for alpha blits, - // because we must get the window background to apply transparency - // If the image is not completly within the window, - // we can't get the whole background for the image. - // this only works if the image isn't used at several different places. - // In fact in case of alpha bitmap caching it is only used for the - // toolbar buttons right now. - - if( (opaque == true) || (flags & BITMAPF_BUFFER_NATIVE ) ){ - if( img->converted == true ){ - *out = img->native; - return( 0 ); - } - if( ( flags & BITMAPF_MONOGLYPH ) == 0 ){ - cache = true; - } - } - - /* rem. if eddi xy is installed, we could directly access the screen! */ - /* apply transparency to the image: */ - if (( opaque == false )) { - /* copy the screen to an temp buffer: */ - if ((flags & BITMAPF_BUFFER_NATIVE) == 0) { - scrbuf = snapshot_create(x, y, clip->g_w, clip->g_h); - if( scrbuf != NULL ) { - - assert( clip->g_w <= bw ); - assert( clip->g_h <= bh ); - - // copy blended pixels to the screen buffer: - ablend_bitmap( img, scrbuf, clip, NULL ); - /* adjust size which gets converted: */ - bw = clip->g_w; - bh = clip->g_h; - /* adjust output position: */ - clip->g_x = 0; - clip->g_y = 0; - /* set the source of conversion: */ - source = scrbuf; - } - } else { - /* - The whole bitmap can be transformed to an mfdb - (and get's cached) - */ - GRECT region = { 0, 0, bw, bh }; - ablend_pixel( img, bg, ®ion ); - source = img; - } - } else { - source = img; - } - /* (re)allocate buffer for converted image: */ - dststride = MFDB_STRIDE(bw); - dstsize = ( ((dststride >> 3) * bh) * atari_plot_bpp_virt ); - if (cache == false) { - if (dstsize > size_buf_packed) { - int blocks = (dstsize / (CONV_BLOCK_SIZE-1))+1; - if( buf_packed == NULL ) - buf_packed =(void*)malloc( blocks * CONV_BLOCK_SIZE ); - else - buf_packed =(void*)realloc(buf_packed, - blocks * CONV_BLOCK_SIZE); - assert( buf_packed ); - if( buf_packed == NULL ) { - if( scrbuf != NULL ) - atari_bitmap_destroy( scrbuf ); - return( 0-ERR_NO_MEM ); - } - size_buf_packed = blocks * CONV_BLOCK_SIZE; - } - out->fd_addr = buf_packed; - } else { - assert( out->fd_addr == NULL ); - out->fd_addr = (void*)malloc( dstsize ); - if( out->fd_addr == NULL ){ - if( scrbuf != NULL ) - atari_bitmap_destroy( scrbuf ); - return( 0-ERR_NO_MEM ); - } - } - - out->fd_w = dststride; - out->fd_h = bh; - out->fd_wdwidth = dststride >> 4; - out->fd_stand = 0; - out->fd_nplanes = (short)atari_plot_bpp_virt; - out->fd_r1 = out->fd_r2 = out->fd_r3 = 0; - - err = Hermes_ConverterRequest( - hermes_cnv_h, - &nsfmt, - &vfmt - ); - assert( err != 0 ); - - // FIXME: here we can use the same optimization which is used for - // the snapshot creation. - - /* convert image to virtual format: */ - err = Hermes_ConverterCopy( hermes_cnv_h, - source->pixdata, - 0, /* x src coord of top left in pixel coords */ - 0, /* y src coord of top left in pixel coords */ - bw, bh, - source->rowstride, /* stride as bytes */ - out->fd_addr, - 0, /* x dst coord of top left in pixel coords */ - 0, /* y dst coord of top left in pixel coords */ - bw, bh, - (dststride >> 3) * atari_plot_bpp_virt /* stride as bytes */ - ); - assert( err != 0 ); - - if( cache == true ){ - img->native = *out; - img->converted = true; - } - return( 0 ); - -} - - inline static void convert_bitmap_done(void) -{ - if (size_buf_packed > CONV_KEEP_LIMIT) { - /* free the mem if it was an large allocation ... */ - buf_packed = realloc(buf_packed, CONV_KEEP_LIMIT); - size_buf_packed = CONV_KEEP_LIMIT; - } -} - - -bool plot_blit_bitmap(struct bitmap * bmp, int x, int y, - unsigned long bg, unsigned long flags ) -{ - MFDB src_mf; - MFDB scrmf; - short pxy[8]; - GRECT off, clip, vis; - int screen_x, screen_y; - - src_mf.fd_addr = NULL; - scrmf.fd_addr = NULL; - - off.g_x = x; - off.g_y = y; - off.g_h = bmp->height; - off.g_w = bmp->width; - - // clip plotter clip rectangle: - clip.g_x = view.clipping.x0; - clip.g_y = view.clipping.y0; - clip.g_w = view.clipping.x1 - view.clipping.x0; - clip.g_h = view.clipping.y1 - view.clipping.y0; - - if( !rc_intersect( &clip, &off) ) { - return(true); - } - - // clip the visible rectangle of the plot area - // this is the area of the plotter which falls into - // screen region: - plot_get_visible_grect(&vis); - if( !rc_intersect( &vis, &off) ) { - return(true); - } - - screen_x = view.x + off.g_x; - screen_y = view.y + off.g_y; - - // convert the clipping relative to bitmap: - off.g_x = off.g_x - x; - off.g_y = off.g_y - y; - assert( (off.g_x >= 0) && (off.g_y >= 0) ); - - /* Convert the Bitmap to native screen format - ready for output. */ - /* This includes blending transparent pixels: */ - if (bitmap_convert(bmp, screen_x, screen_y, &off, bg, flags, &src_mf) - != 0 ) { - return(true); - } - - // setup the src region: - pxy[0] = off.g_x; - pxy[1] = off.g_y; - pxy[2] = off.g_x + off.g_w-1; - pxy[3] = off.g_y + off.g_h-1; - - // setup the target region: - pxy[4] = screen_x; - pxy[5] = screen_y; - pxy[6] = screen_x + off.g_w-1; - pxy[7] = screen_y + off.g_h-1; - - vro_cpyfm(atari_plot_vdi_handle, S_ONLY, (short*)&pxy, &src_mf, &scrmf); - convert_bitmap_done(); - snapshot_suspend(); - return(true); -} - -bool plot_blit_mfdb(GRECT * loc, MFDB * insrc, short fgcolor, - uint32_t flags) -{ - MFDB screen; -// MFDB tran; - MFDB * src; - short pxy[8]; - short c[2] = {fgcolor, 0}; - GRECT off; - - plot_get_clip_grect(&off); - if( rc_intersect(loc, &off) == 0 ){ - return( 1 ); - } - - init_mfdb( 0, loc->g_w, loc->g_h, 0, &screen ); -// -// if( insrc->fd_stand){ -// printf("st\n"); -// int size = init_mfdb( insrc->fd_nplanes, loc->g_w, loc->g_h, -// MFDB_FLAG_NOALLOC, -// &tran -// ); -// if( size_buf_scr == 0 ){ -// buf_scr.fd_addr = malloc( size ); -// size_buf_scr = size; -// } else { -// if( size > size_buf_scr ) { -// buf_scr.fd_addr = realloc( -// buf_scr.fd_addr, size -// ); -// size_buf_scr = size; -// } -// } -// tran.fd_addr = buf_scr.fd_addr; -// vr_trnfm(atari_plot_vdi_handle, insrc, &tran ); -// src = &tran; -// } else { - src = insrc; -// } - - pxy[0] = off.g_x - loc->g_x; - pxy[1] = off.g_y - loc->g_y; - pxy[2] = pxy[0] + off.g_w - 1; - pxy[3] = pxy[1] + off.g_h - 1; - pxy[4] = view.x + off.g_x; - pxy[5] = view.y + off.g_y; - pxy[6] = pxy[4] + off.g_w-1; - pxy[7] = pxy[5] + off.g_h-1; - - - if( flags & PLOT_FLAG_TRANS && src->fd_nplanes == 1){ - vrt_cpyfm(atari_plot_vdi_handle, MD_REPLACE/*MD_TRANS*/, (short*)pxy, src, &screen, (short*)&c); - } else { - /* this method only plots transparent bitmaps, right now... */ - } - return( 1 ); -} - -/* -Init screen and font driver objects. -Returns non-zero value > -1 when the objects could be succesfully created. -Returns value < 0 to indicate an error -*/ - -int plot_init(char * fdrvrname) -{ - - GRECT loc_pos= {0,0,360,400}; - int err=0; - - if( nsoption_int(atari_dither) == 1) - atari_plot_flags |= PLOT_FLAG_DITHER; - if( nsoption_int(atari_transparency) == 1 ) - atari_plot_flags |= PLOT_FLAG_TRANS; - if( nsoption_int(atari_font_monochrom) == 1 ) - atari_font_flags |= FONTPLOT_FLAG_MONOGLYPH; - - if(atari_plot_vdi_handle == -1) { - - short dummy; - short work_in[12] = {Getrez()+2,1,1,1,1,1,1,1,1,1,2,1}; - short work_out[57]; - atari_plot_vdi_handle=graf_handle(&dummy, &dummy, &dummy, &dummy); - v_opnvwk(work_in, &atari_plot_vdi_handle, work_out); - LOG("Plot VDI handle: %d", atari_plot_vdi_handle); - } - read_vdi_sysinfo(atari_plot_vdi_handle, &vdi_sysinfo); - if(verbose_log) { - dump_vdi_info(atari_plot_vdi_handle) ; - dump_font_drivers(); - } - - fplotter = new_font_plotter(atari_plot_vdi_handle, fdrvrname, - atari_font_flags, &err); - if(err) { - const char * desc = plot_err_str(err); - die(("Unable to load font plotter %s -> %s", fdrvrname, desc )); - } - - memset(&view, 0, sizeof(struct s_view)); - atari_plot_bpp_virt = vdi_sysinfo.scr_bpp; - view.x = loc_pos.g_x; - view.y = loc_pos.g_y; - view.w = loc_pos.g_w; - view.h = loc_pos.g_h; - size_buf_packed = 0; - size_buf_planar = 0; - buf_packed = NULL; - buf_planar = NULL; - if( vdi_sysinfo.vdiformat == VDI_FORMAT_PACK ) { - atari_plot_bpp_virt = vdi_sysinfo.scr_bpp; - } else { - atari_plot_bpp_virt = 8; - } - - plot_set_scale(1.0); - update_visible_rect(); - - struct rect clip; - clip.x0 = 0; - clip.y0 = 0; - clip.x1 = view.w; - clip.y1 = view.h; - plot_clip(&clip); - - assert(Hermes_Init()); - -#ifdef WITH_8BPP_SUPPORT - bitmap_convert = (vdi_sysinfo.scr_bpp > 8) ? bitmap_convert_tc : bitmap_convert_8; - - /* Setup color lookup tables and palette */ - unsigned char rgbcol[4]; - if( vdi_sysinfo.scr_bpp <= 8 ){ - unsigned char graytone=0; - int i; - for( i=0; i<=255; i++ ) { - - // get the current color and save it for restore: - vq_color(atari_plot_vdi_handle, i, 1, (unsigned short*)&sys_pal[i][0] ); - if( i<OFFSET_WEB_PAL ) { - pal[i][0] = sys_pal[i][0]; - pal[i][1] = sys_pal[i][1]; - pal[i][2] = sys_pal[i][2]; - } else if( vdi_sysinfo.scr_bpp >= 8 ) { - if ( i < OFFSET_CUST_PAL ){ - pal[i][0] = vdi_web_pal[i-OFFSET_WEB_PAL][0]; - pal[i][1] = vdi_web_pal[i-OFFSET_WEB_PAL][1]; - pal[i][2] = vdi_web_pal[i-OFFSET_WEB_PAL][2]; - //set the new palette color to websafe value: - vs_color(atari_plot_vdi_handle, i, &pal[i][0]); - } - if( i >= OFFSET_CUST_PAL && i<OFFSET_CUST_PAL+16 ) { - /* here we define 20 additional gray colors... */ - rgbcol[1] = rgbcol[2] = rgbcol[3] = ((graytone&0x0F) << 4); - rgb_to_vdi1000( &rgbcol[0], &pal[i][0] ); - vs_color(atari_plot_vdi_handle, i, &pal[i][0]); - graytone++; - } - - } - vdi1000_to_rgb( &pal[i][0], &rgb_lookup[i][0] ); - } - - } else { - /* no need to change the palette - its application specific */ - } -#else - bitmap_convert = bitmap_convert_tc; -#endif - - /* Setup Hermes conversion handles */ - unsigned long hermesflags = (atari_plot_flags & PLOT_FLAG_DITHER) ? HERMES_CONVERT_DITHER : 0; - hermes_cnv_h = Hermes_ConverterInstance(hermesflags); - assert( hermes_cnv_h ); - hermes_res_h = Hermes_ConverterInstance(hermesflags); - assert( hermes_res_h ); - - /* set up the src & dst format: */ - /* netsurf uses RGBA ... */ - nsfmt.a = 0xFFUL; - nsfmt.b = 0x0FF00UL; - nsfmt.g = 0x0FF0000UL; - nsfmt.r = 0x0FF000000UL; - nsfmt.bits = 32; - nsfmt.indexed = false; - nsfmt.has_colorkey = false; - - vfmt.r = vdi_sysinfo.mask_r; - vfmt.g = vdi_sysinfo.mask_g; - vfmt.b = vdi_sysinfo.mask_b; - vfmt.a = vdi_sysinfo.mask_a; - vfmt.bits = atari_plot_bpp_virt; - vfmt.indexed = (atari_plot_bpp_virt <= 8) ? 1 : 0; - vfmt.has_colorkey = 0; - - return( err ); -} - -int plot_finalise( void ) -{ - - delete_font_plotter(fplotter); - -#ifdef WITH_8BPP_SUPPORT - if (vfmt.indexed) { - int i; - for (i=OFFSET_WEB_PAL; i<OFFSET_CUST_PAL+16; i++) { - vs_color(atari_plot_vdi_handle, i, &sys_pal[i][0]); - } - } -#endif - - /* close Hermes stuff: */ - Hermes_ConverterReturn(hermes_cnv_h); - Hermes_Done(); - - /* free up temporary buffers */ - free(buf_packed ); - free(buf_planar); - snapshot_destroy(); - - return 0; -} - -bool plot_lock(void) -{ - if ((atari_plot_flags & PLOT_FLAG_LOCKED) != 0) - return(true); - if( !wind_update(BEG_UPDATE|0x100) ) - return(false); - if( !wind_update(BEG_MCTRL|0x100) ){ - wind_update(END_UPDATE); - return(false); - } - atari_plot_flags |= PLOT_FLAG_LOCKED; - graf_mouse(M_OFF, NULL); - return(true); -} - -bool plot_unlock(void) -{ - if( (atari_plot_flags & PLOT_FLAG_LOCKED) == 0 ) - return(true); - wind_update(END_MCTRL); - wind_update(END_UPDATE); - graf_mouse(M_ON, NULL); - vs_clip_off(atari_plot_vdi_handle); - atari_plot_flags &= ~PLOT_FLAG_LOCKED; - return(false); -} - -bool plot_rectangle(int x0, int y0, int x1, int y1, - const plot_style_t *pstyle ) -{ - short pxy[4]; - GRECT r, rclip, sclip; - int sw = pstyle->stroke_width; - uint32_t lt; - - /* current canvas clip: */ - rclip.g_x = view.clipping.x0; - rclip.g_y = view.clipping.y0; - rclip.g_w = view.clipping.x1 - view.clipping.x0; - rclip.g_h = view.clipping.y1 - view.clipping.y0; - - /* physical clipping: */ - sclip.g_x = rclip.g_x; - sclip.g_y = rclip.g_y; - sclip.g_w = view.vis_w; - sclip.g_h = view.vis_h; - - rc_intersect(&sclip, &rclip); - r.g_x = x0; - r.g_y = y0; - r.g_w = x1 - x0; - r.g_h = y1 - y0; - - if (!rc_intersect( &rclip, &r )) { - return(true); - } - if (pstyle->stroke_type != PLOT_OP_TYPE_NONE) { - /* - manually draw the line, because we do not need vdi clipping - for vertical / horizontal line draws. - */ - if( sw == 0) - sw = 1; - - NSLT2VDI(lt, pstyle); - vsl_type(atari_plot_vdi_handle, (lt&0x0F)); - /* - if the line style is not available within VDI system, - define own style: - */ - if( (lt&0x0F) == 7 ){ - vsl_udsty(atari_plot_vdi_handle, ((lt&0xFFFF00) >> 8)); - } - vsl_width(atari_plot_vdi_handle, (short)sw ); - vsl_rgbcolor(atari_plot_vdi_handle, pstyle->stroke_colour); - /* top border: */ - if( r.g_y == y0){ - pxy[0] = view.x + r.g_x; - pxy[1] = view.y + r.g_y ; - pxy[2] = view.x + r.g_x + r.g_w; - pxy[3] = view.y + r.g_y; - v_pline(atari_plot_vdi_handle, 2, (short *)&pxy); - } - - /* right border: */ - if( r.g_x + r.g_w == x1 ){ - pxy[0] = view.x + r.g_x + r.g_w; - pxy[1] = view.y + r.g_y; - pxy[2] = view.x + r.g_x + r.g_w; - pxy[3] = view.y + r.g_y + r.g_h; - v_pline(atari_plot_vdi_handle, 2, (short *)&pxy); - } - - /* bottom border: */ - if( r.g_y+r.g_h == y1 ){ - pxy[0] = view.x + r.g_x; - pxy[1] = view.y + r.g_y+r.g_h; - pxy[2] = view.x + r.g_x+r.g_w; - pxy[3] = view.y + r.g_y+r.g_h; - v_pline(atari_plot_vdi_handle, 2, (short *)&pxy); - } - - /* left border: */ - if( r.g_x == x0 ){ - pxy[0] = view.x + r.g_x; - pxy[1] = view.y + r.g_y; - pxy[2] = view.x + r.g_x; - pxy[3] = view.y + r.g_y + r.g_h; - v_pline(atari_plot_vdi_handle, 2, (short *)&pxy); - } - } - - if( pstyle->fill_type != PLOT_OP_TYPE_NONE ){ - short stroke_width = (short)(pstyle->stroke_type != PLOT_OP_TYPE_NONE) ? - pstyle->stroke_width : 0; - - vsf_rgbcolor(atari_plot_vdi_handle, pstyle->fill_colour); - vsf_perimeter(atari_plot_vdi_handle, 0); - vsf_interior(atari_plot_vdi_handle, FIS_SOLID); - - - pxy[0] = view.x + r.g_x + stroke_width; - pxy[1] = view.y + r.g_y + stroke_width; - pxy[2] = view.x + r.g_x + r.g_w -1 - stroke_width; - pxy[3] = view.y + r.g_y + r.g_h -1 - stroke_width; - - vsf_style(atari_plot_vdi_handle, 1); - v_bar(atari_plot_vdi_handle, (short*)&pxy); - } - return (true); -} - -bool plot_line(int x0, int y0, int x1, int y1, - const plot_style_t *pstyle ) -{ - short pxy[4]; - uint32_t lt; - int sw = pstyle->stroke_width; - - if((x0 < 0 && x1 < 0) || (y0 < 0 && y1 < 0)){ - return(true); - } - - pxy[0] = view.x + MAX(0,x0); - pxy[1] = view.y + MAX(0,y0); - pxy[2] = view.x + MAX(0,x1); - pxy[3] = view.y + MAX(0,y1); - - if((y0 > view.h-1) && (y1 > view.h-1)) - return(true); - - //printf("view: %d,%d,%d,%d\n", view.x, view.y, view.w, view.h); - //printf("line: %d,%d,%d,%d\n", x0, y0, x1, y1); - - - //plot_vdi_clip(true); - if( sw == 0) - sw = 1; - NSLT2VDI(lt, pstyle) - vsl_type(atari_plot_vdi_handle, (lt&0x0F)); - /* if the line style is not available within VDI system,define own style: */ - if( (lt&0x0F) == 7 ){ - vsl_udsty(atari_plot_vdi_handle, ((lt&0xFFFF00) >> 8)); - } - vsl_width(atari_plot_vdi_handle, (short)sw); - vsl_rgbcolor(atari_plot_vdi_handle, pstyle->stroke_colour); - v_pline(atari_plot_vdi_handle, 2, (short *)&pxy ); - //plot_vdi_clip(false); - return (true); -} - -static bool plot_polygon(const int *p, unsigned int n, - const plot_style_t *pstyle) -{ - short pxy[n*2]; - unsigned int i=0; - if (vdi_sysinfo.maxpolycoords > 0) - assert( (signed int)n < vdi_sysinfo.maxpolycoords); - - vsf_interior(atari_plot_vdi_handle, FIS_SOLID); - vsf_style(atari_plot_vdi_handle, 1); - for (i = 0; i<n*2; i=i+2) { - pxy[i] = (short)view.x+p[i]; - pxy[i+1] = (short)view.y+p[i+1]; - } - if (pstyle->fill_type == PLOT_OP_TYPE_SOLID) { - vsf_rgbcolor(atari_plot_vdi_handle, pstyle->fill_colour); - v_fillarea(atari_plot_vdi_handle, n, (short*)&pxy); - } else { - pxy[n*2]=pxy[0]; - pxy[n*2+1]=pxy[1]; - vsl_rgbcolor(atari_plot_vdi_handle, pstyle->stroke_colour); - v_pline(atari_plot_vdi_handle, n+1, (short *)&pxy); - } - - return ( true ); -} - -/*** - * Set plot origin and canvas size - * \param x the x origin - * \param y the y origin - * \param w the width of the plot area - * \param h the height of the plot area - */ -bool plot_set_dimensions(int x, int y, int w, int h) -{ - bool doupdate = false; - struct rect newclip = {0, 0, w, h}; - GRECT absclip = {x, y, w, h}; - - if (!(w == view.w && h == view.h)) { - view.w = (short)w; - view.h = (short)h; - doupdate = true; - } - if (!(x == view.x && y == view.y)) { - view.x = (short)x; - view.y = (short)y; - doupdate = true; - } - if (doupdate==true) - update_visible_rect(); - - //dbg_rect("plot_set_dimensions", &newclip); - - plot_set_abs_clipping(&absclip); - plot_clip(&newclip); - return(true); -} - -/*** - * Get current canvas size - * \param dst the GRECT * which receives the canvas size - * - */ -bool plot_get_dimensions(GRECT *dst) -{ - dst->g_x = view.x; - dst->g_y = view.y; - dst->g_w = view.w; - dst->g_h = view.h; - return(true); -} - -/** - * set scale of plotter. - * \param scale the new scale value - * \return the old scale value - */ - -float plot_set_scale(float scale) -{ - float ret = view.scale; - - view.scale = scale; - - return(ret); -} - -float plot_get_scale(void) -{ - return(view.scale); -} - - -/** - * - * Subsequent calls to plot_clip will be clipped by the absolute clip. - * \param area the maximum clipping rectangle (absolute screen coords) - * -*/ -void plot_set_abs_clipping(const GRECT *area) -{ - GRECT canvas; - - plot_get_dimensions(&canvas); - - if(!rc_intersect(area, &canvas)){ - view.abs_clipping.x0 = 0; - view.abs_clipping.x1 = 0; - view.abs_clipping.y0 = 0; - view.abs_clipping.y1 = 0; - } - else { - view.abs_clipping.x0 = area->g_x; - view.abs_clipping.x1 = area->g_x + area->g_w; - view.abs_clipping.y0 = area->g_y; - view.abs_clipping.y1 = area->g_y + area->g_h; - } -} - - -/*** - * Get the maximum clip extent, in absolute screen coords - * \param dst the structure that receives the absolute clipping - */ -void plot_get_abs_clipping(struct rect *dst) -{ - *dst = view.abs_clipping; -} - - -/*** - * Get the maximum clip extent, in absolute screen coords - * \param dst the structure that receives the absolute clipping - */ -void plot_get_abs_clipping_grect(GRECT *dst) -{ - dst->g_x = view.abs_clipping.x0; - dst->g_w = view.abs_clipping.x1 - view.abs_clipping.x0; - dst->g_y = view.abs_clipping.y0; - dst->g_h = view.abs_clipping.y1 - view.abs_clipping.y0; -} - -bool plot_clip(const struct rect *clip) -{ - GRECT canvas, screen, gclip, maxclip; - short pxy[4]; - - screen.g_x = 0; - screen.g_y = 0; - screen.g_w = vdi_sysinfo.scr_w; - screen.g_h = vdi_sysinfo.scr_h; - - plot_get_dimensions(&canvas); - - view.clipping.y0 = clip->y0; - view.clipping.y1 = clip->y1; - view.clipping.x0 = clip->x0; - view.clipping.x1 = clip->x1; - - plot_get_clip_grect(&gclip); - - gclip.g_x += canvas.g_x; - gclip.g_y += canvas.g_y; - - rc_intersect(&canvas, &gclip); - - if(gclip.g_h < 0){ - gclip.g_h = 0; - } - - if (!rc_intersect(&screen, &gclip)) { - //dbg_rect("cliprect: ", &view.clipping); - //dbg_grect("screen: ", &canvas); - //dbg_grect("canvas clipped: ", &gclip); - //assert(1 == 0); - } - - // When setting VDI clipping, obey to maximum cliping rectangle: - plot_get_abs_clipping_grect(&maxclip); - rc_intersect(&maxclip, &gclip); - - //dbg_grect("canvas clipped to screen", &gclip); - - pxy[0] = gclip.g_x; - pxy[1] = gclip.g_y; - pxy[2] = pxy[0] + gclip.g_w; - pxy[3] = pxy[1] + gclip.g_h; - - vs_clip(atari_plot_vdi_handle, 1, (short*)&pxy); - - return ( true ); -} - -VdiHdl plot_get_vdi_handle(void) -{ - return(atari_plot_vdi_handle); -} - -long plot_get_flags(void) -{ - return(atari_plot_flags); -} - - -bool plot_get_clip(struct rect * out) -{ - out->x0 = view.clipping.x0; - out->y0 = view.clipping.y0; - out->x1 = view.clipping.x1; - out->y1 = view.clipping.y1; - return( true ); -} - -void plot_get_clip_grect(GRECT * out) -{ - struct rect clip={0,0,0,0}; - - plot_get_clip(&clip); - - out->g_x = clip.x0; - out->g_y = clip.y0; - out->g_w = clip.x1 - clip.x0; - out->g_h = clip.y1 - clip.y0; -} - -FONT_PLOTTER plot_get_text_plotter() -{ - return(fplotter); -} - -void plot_set_text_plotter(FONT_PLOTTER font_plotter) -{ - fplotter = font_plotter; -} - -static bool plot_text(int x, int y, const char *text, size_t length, const plot_font_style_t *fstyle ) -{ - if (view.scale != 1.0) { - plot_font_style_t newstyle = *fstyle; - newstyle.size = (int)((float)fstyle->size*view.scale); - fplotter->text(fplotter, x, y, text, length, &newstyle); - } else { - fplotter->text(fplotter, x, y, text, length, fstyle); - } - - return ( true ); -} - -static bool plot_disc(int x, int y, int radius, const plot_style_t *pstyle) -{ - if (pstyle->fill_type != PLOT_OP_TYPE_SOLID) { - vsf_rgbcolor(atari_plot_vdi_handle, pstyle->stroke_colour); - vsf_perimeter(atari_plot_vdi_handle, 1); - vsf_interior(atari_plot_vdi_handle, 0); - v_circle(atari_plot_vdi_handle, view.x + x, view.y + y, radius); - } else { - vsf_rgbcolor(atari_plot_vdi_handle, pstyle->fill_colour); - vsf_perimeter(atari_plot_vdi_handle, 0); - vsf_interior(atari_plot_vdi_handle, FIS_SOLID); - v_circle(atari_plot_vdi_handle, view.x + x, view.y + y, radius); - } - - return(true); -} - -static bool plot_arc(int x, int y, int radius, int angle1, int angle2, - const plot_style_t *pstyle) -{ - - vswr_mode(atari_plot_vdi_handle, MD_REPLACE ); - if (pstyle->fill_type == PLOT_OP_TYPE_NONE) - return(true); - if ( pstyle->fill_type != PLOT_OP_TYPE_SOLID) { - vsl_rgbcolor(atari_plot_vdi_handle, pstyle->stroke_colour); - vsf_perimeter(atari_plot_vdi_handle, 1); - vsf_interior(atari_plot_vdi_handle, 1 ); - v_arc(atari_plot_vdi_handle, view.x + x, view.y + y, radius, angle1*10, angle2*10); - } else { - vsf_rgbcolor(atari_plot_vdi_handle, pstyle->fill_colour); - vsl_width(atari_plot_vdi_handle, 1 ); - vsf_perimeter(atari_plot_vdi_handle, 1); - v_arc(atari_plot_vdi_handle, view.x + x, view.y + y, radius, angle1*10, angle2*10); - } - - return (true); -} - -static bool plot_bitmap(int x, int y, int width, int height, - struct bitmap *bitmap, colour bg, - bitmap_flags_t flags) -{ - struct bitmap * bm = NULL; - bool repeat_x = (flags & BITMAPF_REPEAT_X); - bool repeat_y = (flags & BITMAPF_REPEAT_Y); - int bmpw,bmph; - struct rect clip = {0,0,0,0}; - - bmpw = atari_bitmap_get_width(bitmap); - bmph = atari_bitmap_get_height(bitmap); - - if(view.scale != 1.0){ - width = (int)(((float)width)*view.scale); - height = (int)(((float)height)*view.scale); - } - - if ( repeat_x || repeat_y ) { - plot_get_clip(&clip); - if( repeat_x && width == 1 && repeat_y && height == 1 ) { - width = MAX( width, clip.x1 - x ); - height = MAX( height, clip.y1 - y ); - } else if( repeat_x && width == 1 ) { - width = MAX( width, clip.x1 - x); - } else if( repeat_y && height == 1) { - height = MAX( height, clip.y1 - y ); - } - } - - if( width != bmpw || height != bmph ) { - atari_bitmap_resize(bitmap, hermes_res_h, &nsfmt, width, height ); - if( bitmap->resized ) - bm = bitmap->resized; - else - bm = bitmap; - } else { - bm = bitmap; - } - - /* out of memory? */ - if( bm == NULL ) { - printf("plot: out of memory! bmp: %p, bmpres: %p\n", bitmap, bitmap->resized ); - return( true ); - } - - if (!(repeat_x || repeat_y) ) { - plot_blit_bitmap(bm, x, y, bg, flags ); - } else { - int xf,yf; - int xoff = x; - int yoff = y; - - if (yoff > clip.y0 ) - yoff = (clip.y0 - height) + ((yoff - clip.y0) % height); - if (xoff > clip.x0 ) - xoff = (clip.x0 - width) + ((xoff - clip.x0) % width); - /* for now, repeating just works in the rigth / down direction */ - /* - if( repeat_x == true ) - xoff = clip.x0; - if(repeat_y == true ) - yoff = clip.y0; - */ - - for( xf = xoff; xf < clip.x1; xf += width ) { - for( yf = yoff; yf < clip.y1; yf += height ) { - plot_blit_bitmap(bm, xf, yf, bg, flags ); - if (!repeat_y) - break; - } - if (!repeat_x) - break; - } - } - return ( true ); -} - -static bool plot_path(const float *p, unsigned int n, colour fill, float width, - colour c, const float transform[6]) -{ - return ( true ); -} - - - -const struct plotter_table atari_plotters = { - .rectangle = plot_rectangle, - .line = plot_line, - .polygon = plot_polygon, - .clip = plot_clip, - .text = plot_text, - .disc = plot_disc, - .arc = plot_arc, - .bitmap = plot_bitmap, - .path = plot_path, - .flush = NULL, - .group_start = NULL, - .group_end = NULL, - .option_knockout = true -}; diff --git a/atari/plot/plot.h b/atari/plot/plot.h deleted file mode 100644 index 22f8781c2..000000000 --- a/atari/plot/plot.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2010 Ole Loots <ole@monochrom.net> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef NS_ATARI_PLOT_H -#define NS_ATARI_PLOT_H - -/** how much memory should be kept allocated for temp. conversion bitmaps: */ -#define CONV_KEEP_LIMIT 512000 - -/** how much memory to allocate if some is needed: */ -#define CONV_BLOCK_SIZE 32000 - -/* Plotter Option Flags: */ -#define PLOT_FLAG_DITHER 0x04 /**< set if the plotter shall dither images */ -#define PLOT_FLAG_TRANS 0x08 /**< set if the plotter supports transparent operations */ - -/* Plotter "feature" flags */ -#define PLOT_FLAG_HAS_DITHER 0x0400 -#define PLOT_FLAG_HAS_ALPHA 0x0800 -#define PLOT_FLAG_OFFSCREEN 0x1000 /**< offscreen plotter should set this flag */ - -/* Plotter "internal" flags */ -#define PLOT_FLAG_LOCKED 0x08000 /**< plotter should set this flag during screen updates */ - -/* Font Plotter flags: */ -#define FONTPLOT_FLAG_MONOGLYPH 0x01 - -/* Flags for init_mfdb function: */ -#define MFDB_FLAG_STAND 0x01 -#define MFDB_FLAG_ZEROMEM 0x02 -#define MFDB_FLAG_NOALLOC 0x04 - -/* Flags for blit functions: */ -#define BITMAPF_MONOGLYPH 4096 /**< The bitmap is an character bitmap */ -#define BITMAPF_BUFFER_NATIVE 8192 /**< Bitmap shall be kept converted */ - -/* Error codes: */ -#define ERR_BUFFERSIZE_EXCEEDS_SCREEN 1 /* The buffer allocated is larger than the screen */ -#define ERR_NO_MEM 2 /* Not enough memory for requested operation */ -#define ERR_PLOTTER_NOT_AVAILABLE 3 /* invalid plotter driver name passed */ - -struct s_vdi_sysinfo { - short vdi_handle; /**< vdi handle */ - short scr_w; /**< resolution horz. */ - short scr_h; /**< resolution vert. */ - short scr_bpp; /**< bits per pixel */ - int colors; /**< 0=hiclor, 2=mono */ - unsigned long hicolors; /**< if colors = 0 */ - short pixelsize; /**< bytes per pixel */ - unsigned short pitch; /**< row pitch */ - unsigned short vdiformat; /**< pixel format */ - unsigned short clut; /**< type of clut support */ - void *screen; /**< pointer to screen, or NULL */ - unsigned long screensize; /**< size of screen (in bytes) */ - unsigned long mask_r; /**< red color mask */ - unsigned long mask_g; /**< green color mask */ - unsigned long mask_b; /**< blue color mask */ - unsigned long mask_a; /**< alpha color mask */ - short maxintin; /* maximum pxy items */ - short maxpolycoords; /* max coords for p_line etc. */ - unsigned long EdDiVersion; /* EdDi Version or 0 */ - bool rasterscale; /* raster scaling support */ -}; - -struct rect; - -extern const struct plotter_table atari_plotters; - -int plot_init(char *); -int plot_finalise(void); - -/** - * translate an error number - */ -const char* plot_err_str(int i) ; - -bool plot_lock(void); -bool plot_unlock(void); -bool plot_set_dimensions( int x, int y, int w, int h ); -bool plot_get_dimensions(GRECT *dst); -float plot_get_scale(void); -float plot_set_scale(float); -void plot_set_abs_clipping(const GRECT *area); -void plot_get_abs_clipping(struct rect *dst); -void plot_get_abs_clipping_grect(GRECT *dst); -bool plot_get_clip(struct rect * out); -/* Get clipping for current framebuffer as GRECT */ -void plot_get_clip_grect(GRECT * out); -bool plot_clip(const struct rect *clip); -VdiHdl plot_get_vdi_handle(void); -long plot_get_flags(void); -bool plot_rectangle( int x0, int y0, int x1, int y1,const plot_style_t *style ); -bool plot_line( int x0, int y0, int x1, int y1, const plot_style_t *style ); -bool plot_blit_bitmap(struct bitmap * bmp, int x, int y, - unsigned long bg, unsigned long flags); -bool plot_blit_mfdb(GRECT * loc, MFDB * insrc, short fgcolor, uint32_t flags); -bool plot_copy_rect(GRECT src, GRECT dst); - -/* convert an vdi color to bgra */ -void vdi1000_to_rgb( unsigned short * in, unsigned char * out ); - -/* convert an bgra color to vdi1000 color */ -void rgb_to_vdi1000( unsigned char * in, RGB1000 *out); - -/* convert an rgb color to an index into the web palette */ -short rgb_to_666_index(unsigned char r, unsigned char g, unsigned char b); - -/* assign vdi line style to dst ( netsurf type ) */ -#define NSLT2VDI(dst, src) \ - dst = 0; \ - switch( src->stroke_type ) { \ - case PLOT_OP_TYPE_DOT: \ - dst = (0xAAAA00 | 7); \ - break; \ - case PLOT_OP_TYPE_DASH: \ - dst = 3; \ - break; \ - case PLOT_OP_TYPE_SOLID: \ - case PLOT_OP_TYPE_NONE: \ - default: \ - dst = 1; \ - break; \ - } - - -#ifdef WITH_8BPP_SUPPORT -/* some Well known indexes into the VDI palette */ -/* common indexes into the VDI palette */ -/* (only used when running with 256 colors or less ) */ -#define OFFSET_WEB_PAL 16 -#define OFFSET_CUST_PAL 232 -#define RGB_TO_VDI(c) rgb_to_666_index( (c&0xFF),(c&0xFF00)>>8,(c&0xFF0000)>>16)+OFFSET_WEB_PAL -#endif /* WITH_8BPP_SUPPORT*/ - -/* the name of this macro is crap - it should be named bgr_to_rgba ... or so */ -#define ABGR_TO_RGB(c) ( ((c&0xFF)<<16) | (c&0xFF00) | ((c&0xFF0000)>>16) ) << 8 - -/* this index into the palette is used by the TC renderer to set - * current draw color. - */ -#define OFFSET_CUSTOM_COLOR 255 - -#endif |