From d21447d096a320a08b3efb2b8768fad0dcdcfd64 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 5 May 2016 22:28:51 +0100 Subject: move frontends into sub directory --- frontends/atari/plot/eddi.h | 54 + frontends/atari/plot/eddi.s | 42 + frontends/atari/plot/font_freetype.c | 714 ++++++++++ frontends/atari/plot/font_freetype.h | 52 + frontends/atari/plot/font_internal.c | 2386 ++++++++++++++++++++++++++++++++++ frontends/atari/plot/font_internal.h | 37 + frontends/atari/plot/font_vdi.c | 310 +++++ frontends/atari/plot/font_vdi.h | 26 + frontends/atari/plot/fontplot.c | 132 ++ frontends/atari/plot/fontplot.h | 86 ++ frontends/atari/plot/plot.c | 2247 ++++++++++++++++++++++++++++++++ frontends/atari/plot/plot.h | 158 +++ 12 files changed, 6244 insertions(+) create mode 100644 frontends/atari/plot/eddi.h create mode 100644 frontends/atari/plot/eddi.s create mode 100644 frontends/atari/plot/font_freetype.c create mode 100644 frontends/atari/plot/font_freetype.h create mode 100644 frontends/atari/plot/font_internal.c create mode 100644 frontends/atari/plot/font_internal.h create mode 100644 frontends/atari/plot/font_vdi.c create mode 100644 frontends/atari/plot/font_vdi.h create mode 100644 frontends/atari/plot/fontplot.c create mode 100644 frontends/atari/plot/fontplot.h create mode 100644 frontends/atari/plot/plot.c create mode 100644 frontends/atari/plot/plot.h (limited to 'frontends/atari/plot') diff --git a/frontends/atari/plot/eddi.h b/frontends/atari/plot/eddi.h new file mode 100644 index 000000000..7d6b90d4b --- /dev/null +++ b/frontends/atari/plot/eddi.h @@ -0,0 +1,54 @@ +/* + 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/frontends/atari/plot/eddi.s b/frontends/atari/plot/eddi.s new file mode 100644 index 000000000..f0ea18a1e --- /dev/null +++ b/frontends/atari/plot/eddi.s @@ -0,0 +1,42 @@ +/* + 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/frontends/atari/plot/font_freetype.c b/frontends/atari/plot/font_freetype.c new file mode 100644 index 000000000..a77aff855 --- /dev/null +++ b/frontends/atari/plot/font_freetype.c @@ -0,0 +1,714 @@ +/* + * Copyright 2005 James Bursa + * 2008 Vincent Sanders + * 2011 Ole Loots + * 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 . + */ + +#ifdef WITH_FREETYPE_FONT_DRIVER +#include +#include +#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; iadvance.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/frontends/atari/plot/font_freetype.h b/frontends/atari/plot/font_freetype.h new file mode 100644 index 000000000..58a5372a4 --- /dev/null +++ b/frontends/atari/plot/font_freetype.h @@ -0,0 +1,52 @@ +/* + * Copyright 2011 Ole Loots + * 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 . + */ + +#ifndef FONT_PLOTTER_FREETYPE +#define FONT_PLOTTER_FREETYPE + +#include +#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/frontends/atari/plot/font_internal.c b/frontends/atari/plot/font_internal.c new file mode 100644 index 000000000..89a56d0e5 --- /dev/null +++ b/frontends/atari/plot/font_internal.c @@ -0,0 +1,2386 @@ +/* + * Copyright 2008 Vincent Sanders + * Copyright 2011 Ole Loots + * + * 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 . + */ + +#ifdef WITH_INTERNAL_FONT_DRIVER + +#include +#include + +#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 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/frontends/atari/plot/font_internal.h b/frontends/atari/plot/font_internal.h new file mode 100644 index 000000000..9bfbbedef --- /dev/null +++ b/frontends/atari/plot/font_internal.h @@ -0,0 +1,37 @@ +/* + * Copyright 2008 Vincent Sanders + * Copyright 2011 Ole Loots + * + * 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 . + */ + +#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/frontends/atari/plot/font_vdi.c b/frontends/atari/plot/font_vdi.c new file mode 100644 index 000000000..ef5499207 --- /dev/null +++ b/frontends/atari/plot/font_vdi.c @@ -0,0 +1,310 @@ +/* + * Copyright 2010 Ole Loots + * + * 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 . + */ + +#ifdef WITH_VDI_FONT_DRIVER + +#include + +#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; idtor = 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 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 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/frontends/atari/plot/font_vdi.h b/frontends/atari/plot/font_vdi.h new file mode 100644 index 000000000..3a1fdb54b --- /dev/null +++ b/frontends/atari/plot/font_vdi.h @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Ole Loots + * + * 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 . + */ + +#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/frontends/atari/plot/fontplot.c b/frontends/atari/plot/fontplot.c new file mode 100644 index 000000000..9f0edd9a4 --- /dev/null +++ b/frontends/atari/plot/fontplot.c @@ -0,0 +1,132 @@ +/* + * Copyright 2010 Ole Loots + * + * 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 . + */ + +#include +#include +#include +#include + +#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/frontends/atari/plot/fontplot.h b/frontends/atari/plot/fontplot.h new file mode 100644 index 000000000..6690bff2c --- /dev/null +++ b/frontends/atari/plot/fontplot.h @@ -0,0 +1,86 @@ +/* + * Copyright 2010 Ole Loots + * + * 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 . + */ + +#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/frontends/atari/plot/plot.c b/frontends/atari/plot/plot.c new file mode 100644 index 000000000..45e4cead2 --- /dev/null +++ b/frontends/atari/plot/plot.c @@ -0,0 +1,2247 @@ +/* + * Copyright 2010 Ole Loots + * + * 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 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 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; yg_h; y++ ){ + row = (uint32_t *)(img->pixdata + (img_stride * (y+clip->g_y))); + for( x=0; xg_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= 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 && istroke_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; ifill_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/frontends/atari/plot/plot.h b/frontends/atari/plot/plot.h new file mode 100644 index 000000000..22f8781c2 --- /dev/null +++ b/frontends/atari/plot/plot.h @@ -0,0 +1,158 @@ +/* + * Copyright 2010 Ole Loots + * + * 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 . + */ + +#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 -- cgit v1.2.3