diff src/common/Text.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/common/Text.cpp	Sat Mar 03 10:31:27 2012 -0600
     1.3 @@ -0,0 +1,496 @@
     1.4 +/* FCE Ultra - NES/Famicom Emulator
     1.5 + *
     1.6 + * Copyright notice for this file:
     1.7 + *  Copyright (C) 2002 Ben Parnell
     1.8 + *
     1.9 + * This program is free software; you can redistribute it and/or modify
    1.10 + * it under the terms of the GNU General Public License as published by
    1.11 + * the Free Software Foundation; either version 2 of the License, or
    1.12 + * (at your option) any later version.
    1.13 + *
    1.14 + * This program is distributed in the hope that it will be useful,
    1.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1.17 + * GNU General Public License for more details.
    1.18 + *
    1.19 + * You should have received a copy of the GNU General Public License
    1.20 + * along with this program; if not, write to the Free Software
    1.21 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    1.22 + */
    1.23 +
    1.24 +/* Code originally from fceu/drawing.h file, adapted by Forgotten
    1.25 + */
    1.26 +#include "System.h"
    1.27 +
    1.28 +bool outlinedText = true, transparentText = false;
    1.29 +int  textColor    = 0, textMethod = 1;
    1.30 +
    1.31 +extern u32 RGB_LOW_BITS_MASK;
    1.32 +
    1.33 +static const u8 fontdata2[2048] = {
    1.34 +	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e, 0x7e, 0xff,  0xdb, 0xff,
    1.35 +	0xc3, 0xe7, 0xff, 0x7e, 0x36, 0x7f, 0x7f, 0x7f, 0x3e, 0x1c, 0x08, 0x00, 0x08, 0x1c, 0x3e, 0x7f, 0x3e, 0x1c, 0x08, 0x00,
    1.36 +	0x1c,
    1.37 +	0x3e, 0x1c, 0x7f, 0x7f, 0x3e, 0x1c, 0x3e, 0x08, 0x08, 0x1c, 0x3e, 0x7f, 0x3e, 0x1c, 0x3e, 0x00, 0x00, 0x18, 0x3c, 0x3c,
    1.38 +	0x18,
    1.39 +	0x00, 0x00, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,  0xff, 0xc3,
    1.40 +	0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xf0, 0xe0, 0xf0, 0xbe, 0x33, 0x33, 0x33, 0x1e, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18,
    1.41 +	0x7e,
    1.42 +	0x18, 0xfc, 0xcc, 0xfc, 0x0c, 0x0c, 0x0e, 0x0f, 0x07, 0xfe, 0xc6, 0xfe, 0xc6, 0xc6, 0xe6, 0x67, 0x03, 0x99, 0x5a, 0x3c,
    1.43 +	0xe7,
    1.44 +	0xe7, 0x3c, 0x5a, 0x99, 0x01, 0x07, 0x1f, 0x7f, 0x1f, 0x07, 0x01, 0x00, 0x40, 0x70, 0x7c, 0x7f, 0x7c, 0x70, 0x40, 0x00,
    1.45 +	0x18,
    1.46 +	0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00, 0xfe, 0xdb, 0xdb, 0xde, 0xd8,
    1.47 +	0xd8,
    1.48 +	0xd8, 0x00, 0x7c, 0xc6, 0x1c, 0x36, 0x36, 0x1c, 0x33, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x18, 0x3c,
    1.49 +	0x7e,
    1.50 +	0x18, 0x7e, 0x3c, 0x18, 0xff, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18,
    1.51 +	0x00,
    1.52 +	0x00, 0x18, 0x30, 0x7f, 0x30, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x06, 0x7f, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03,
    1.53 +	0x03,
    1.54 +	0x7f, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00, 0x00,
    1.55 +	0xff,
    1.56 +	0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00,
    1.57 +	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1e, 0x1e, 0x0c, 0x0c, 0x00, 0x0c, 0x00, 0x36, 0x36, 0x36, 0x00,
    1.58 +	0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x7f, 0x36, 0x7f, 0x36, 0x36, 0x00, 0x0c, 0x3e, 0x03, 0x1e, 0x30, 0x1f, 0x0c, 0x00,
    1.59 +	0x00,
    1.60 +	0x63, 0x33, 0x18, 0x0c, 0x66, 0x63, 0x00, 0x1c, 0x36, 0x1c, 0x6e, 0x3b, 0x33, 0x6e, 0x00, 0x06, 0x06, 0x03, 0x00, 0x00,
    1.61 +	0x00,
    1.62 +	0x00, 0x00, 0x18, 0x0c, 0x06, 0x06, 0x06, 0x0c, 0x18, 0x00, 0x06, 0x0c, 0x18, 0x18, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x66,
    1.63 +	0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
    1.64 +	0x0c,
    1.65 +	0x06, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x60, 0x30, 0x18,
    1.66 +	0x0c,
    1.67 +	0x06, 0x03, 0x01, 0x00, 0x3e, 0x63, 0x73, 0x7b, 0x6f, 0x67, 0x3e, 0x00, 0x0c, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0x3f, 0x00,
    1.68 +	0x1e,
    1.69 +	0x33, 0x30, 0x1c, 0x06, 0x33, 0x3f, 0x00, 0x1e, 0x33, 0x30, 0x1c, 0x30, 0x33, 0x1e, 0x00, 0x38, 0x3c, 0x36, 0x33, 0x7f,
    1.70 +	0x30,
    1.71 +	0x78, 0x00, 0x3f, 0x03, 0x1f, 0x30, 0x30, 0x33, 0x1e, 0x00, 0x1c, 0x06, 0x03, 0x1f, 0x33, 0x33, 0x1e, 0x00, 0x3f, 0x33,
    1.72 +	0x30,
    1.73 +	0x18, 0x0c, 0x0c, 0x0c, 0x00, 0x1e, 0x33, 0x33, 0x1e, 0x33, 0x33, 0x1e, 0x00, 0x1e, 0x33, 0x33, 0x3e, 0x30, 0x18, 0x0e,
    1.74 +	0x00,
    1.75 +	0x00, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x06, 0x18, 0x0c, 0x06, 0x03,
    1.76 +	0x06,
    1.77 +	0x0c, 0x18, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x1e,
    1.78 +	0x33,
    1.79 +	0x30, 0x18, 0x0c, 0x00, 0x0c, 0x00,
    1.80 +	0x3e, 0x63, 0x7b, 0x7b, 0x7b, 0x03, 0x1e, 0x00, 0x0c, 0x1e, 0x33, 0x33, 0x3f, 0x33, 0x33, 0x00, 0x3f, 0x66, 0x66, 0x3e,
    1.81 +	0x66, 0x66, 0x3f, 0x00, 0x3c, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3c, 0x00, 0x1f, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1f, 0x00,
    1.82 +	0x7f,
    1.83 +	0x46, 0x16, 0x1e, 0x16, 0x46, 0x7f, 0x00, 0x7f, 0x46, 0x16, 0x1e, 0x16, 0x06, 0x0f, 0x00, 0x3c, 0x66, 0x03, 0x03, 0x73,
    1.84 +	0x66,
    1.85 +	0x7c, 0x00, 0x33, 0x33, 0x33, 0x3f, 0x33, 0x33, 0x33, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x78, 0x30,
    1.86 +	0x30, 0x30, 0x33, 0x33, 0x1e, 0x00, 0x67, 0x66, 0x36, 0x1e, 0x36, 0x66, 0x67, 0x00, 0x0f, 0x06, 0x06, 0x06, 0x46, 0x66,
    1.87 +	0x7f,
    1.88 +	0x00, 0x63, 0x77, 0x7f, 0x7f, 0x6b, 0x63, 0x63, 0x00, 0x63, 0x67, 0x6f, 0x7b, 0x73, 0x63, 0x63, 0x00, 0x1c, 0x36, 0x63,
    1.89 +	0x63,
    1.90 +	0x63, 0x36, 0x1c, 0x00, 0x3f, 0x66, 0x66, 0x3e, 0x06, 0x06, 0x0f, 0x00, 0x1e, 0x33, 0x33, 0x33, 0x3b, 0x1e, 0x38, 0x00,
    1.91 +	0x3f,
    1.92 +	0x66, 0x66, 0x3e, 0x36, 0x66, 0x67, 0x00, 0x1e, 0x33, 0x07, 0x0e, 0x38, 0x33, 0x1e, 0x00, 0x3f, 0x2d, 0x0c, 0x0c, 0x0c,
    1.93 +	0x0c,
    1.94 +	0x1e, 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3f, 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1e, 0x0c, 0x00, 0x63, 0x63,
    1.95 +	0x63,
    1.96 +	0x6b, 0x7f, 0x77, 0x63, 0x00, 0x63, 0x63, 0x36, 0x1c, 0x1c, 0x36, 0x63, 0x00, 0x33, 0x33, 0x33, 0x1e, 0x0c, 0x0c, 0x1e,
    1.97 +	0x00,
    1.98 +	0x7f, 0x63, 0x31, 0x18, 0x4c, 0x66, 0x7f, 0x00, 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1e, 0x00, 0x03, 0x06, 0x0c, 0x18,
    1.99 +	0x30,
   1.100 +	0x60, 0x40, 0x00, 0x1e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1e, 0x00, 0x08, 0x1c, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
   1.101 +	0x00,
   1.102 +	0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
   1.103 +	0x0c, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x3e, 0x33, 0x6e, 0x00, 0x07, 0x06, 0x06, 0x3e,
   1.104 +	0x66, 0x66, 0x3b, 0x00, 0x00, 0x00, 0x1e, 0x33, 0x03, 0x33, 0x1e, 0x00, 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6e, 0x00,
   1.105 +	0x00,
   1.106 +	0x00, 0x1e, 0x33, 0x3f, 0x03, 0x1e, 0x00, 0x1c, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0f, 0x00, 0x00, 0x00, 0x6e, 0x33, 0x33,
   1.107 +	0x3e,
   1.108 +	0x30, 0x1f, 0x07, 0x06, 0x36, 0x6e, 0x66, 0x66, 0x67, 0x00, 0x0c, 0x00, 0x0e, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x30, 0x00,
   1.109 +	0x30, 0x30, 0x30, 0x33, 0x33, 0x1e, 0x07, 0x06, 0x66, 0x36, 0x1e, 0x36, 0x67, 0x00, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
   1.110 +	0x1e,
   1.111 +	0x00, 0x00, 0x00, 0x33, 0x7f, 0x7f, 0x6b, 0x63, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x1e,
   1.112 +	0x33,
   1.113 +	0x33, 0x33, 0x1e, 0x00, 0x00, 0x00, 0x3b, 0x66, 0x66, 0x3e, 0x06, 0x0f, 0x00, 0x00, 0x6e, 0x33, 0x33, 0x3e, 0x30, 0x78,
   1.114 +	0x00,
   1.115 +	0x00, 0x3b, 0x6e, 0x66, 0x06, 0x0f, 0x00, 0x00, 0x00, 0x3e, 0x03, 0x1e, 0x30, 0x1f, 0x00, 0x08, 0x0c, 0x3e, 0x0c, 0x0c,
   1.116 +	0x2c,
   1.117 +	0x18, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6e, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x1e, 0x0c, 0x00, 0x00, 0x00,
   1.118 +	0x63,
   1.119 +	0x6b, 0x7f, 0x7f, 0x36, 0x00, 0x00, 0x00, 0x63, 0x36, 0x1c, 0x36, 0x63, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x3e, 0x30,
   1.120 +	0x1f,
   1.121 +	0x00, 0x00, 0x3f, 0x19, 0x0c, 0x26, 0x3f, 0x00, 0x38, 0x0c, 0x0c, 0x07, 0x0c, 0x0c, 0x38, 0x00, 0x18, 0x18, 0x18, 0x00,
   1.122 +	0x18,
   1.123 +	0x18, 0x18, 0x00, 0x07, 0x0c, 0x0c, 0x38, 0x0c, 0x0c, 0x07, 0x00, 0x6e, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1.124 +	0x08,
   1.125 +	0x1c, 0x36, 0x63, 0x63, 0x7f, 0x00,
   1.126 +	0x1e, 0x33, 0x03, 0x33, 0x1e, 0x18, 0x30, 0x1e, 0x00, 0x33, 0x00, 0x33, 0x33, 0x33, 0x7e, 0x00, 0x38, 0x00, 0x1e, 0x33,
   1.127 +	0x3f, 0x03, 0x1e, 0x00, 0x7e, 0xc3, 0x3c, 0x60, 0x7c, 0x66, 0xfc, 0x00, 0x33, 0x00, 0x1e, 0x30, 0x3e, 0x33, 0x7e, 0x00,
   1.128 +	0x07,
   1.129 +	0x00, 0x1e, 0x30, 0x3e, 0x33, 0x7e, 0x00, 0x0c, 0x0c, 0x1e, 0x30, 0x3e, 0x33, 0x7e, 0x00, 0x00, 0x00, 0x1e, 0x03, 0x03,
   1.130 +	0x1e,
   1.131 +	0x30, 0x1c, 0x7e, 0xc3, 0x3c, 0x66, 0x7e, 0x06, 0x3c, 0x00, 0x33, 0x00, 0x1e, 0x33, 0x3f, 0x03, 0x1e, 0x00, 0x07, 0x00,
   1.132 +	0x1e, 0x33, 0x3f, 0x03, 0x1e, 0x00, 0x33, 0x00, 0x0e, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x3e, 0x63, 0x1c, 0x18, 0x18, 0x18,
   1.133 +	0x3c,
   1.134 +	0x00, 0x07, 0x00, 0x0e, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x63, 0x1c, 0x36, 0x63, 0x7f, 0x63, 0x63, 0x00, 0x0c, 0x0c, 0x00,
   1.135 +	0x1e,
   1.136 +	0x33, 0x3f, 0x33, 0x00, 0x38, 0x00, 0x3f, 0x06, 0x1e, 0x06, 0x3f, 0x00, 0x00, 0x00, 0xfe, 0x30, 0xfe, 0x33, 0xfe, 0x00,
   1.137 +	0x7c,
   1.138 +	0x36, 0x33, 0x7f, 0x33, 0x33, 0x73, 0x00, 0x1e, 0x33, 0x00, 0x1e, 0x33, 0x33, 0x1e, 0x00, 0x00, 0x33, 0x00, 0x1e, 0x33,
   1.139 +	0x33,
   1.140 +	0x1e, 0x00, 0x00, 0x07, 0x00, 0x1e, 0x33, 0x33, 0x1e, 0x00, 0x1e, 0x33, 0x00, 0x33, 0x33, 0x33, 0x7e, 0x00, 0x00, 0x07,
   1.141 +	0x00,
   1.142 +	0x33, 0x33, 0x33, 0x7e, 0x00, 0x00, 0x33, 0x00, 0x33, 0x33, 0x3e, 0x30, 0x1f, 0xc3, 0x18, 0x3c, 0x66, 0x66, 0x3c, 0x18,
   1.143 +	0x00,
   1.144 +	0x33, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1e, 0x00, 0x18, 0x18, 0x7e, 0x03, 0x03, 0x7e, 0x18, 0x18, 0x1c, 0x36, 0x26, 0x0f,
   1.145 +	0x06,
   1.146 +	0x67, 0x3f, 0x00, 0x33, 0x33, 0x1e, 0x3f, 0x0c, 0x3f, 0x0c, 0x0c, 0x1f, 0x33, 0x33, 0x5f, 0x63, 0xf3, 0x63, 0xe3, 0x70,
   1.147 +	0xd8,
   1.148 +	0x18, 0x3c, 0x18, 0x18, 0x1b, 0x0e,
   1.149 +	0x38, 0x00, 0x1e, 0x30, 0x3e, 0x33, 0x7e, 0x00, 0x1c, 0x00, 0x0e, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x1e,
   1.150 +	0x33, 0x33, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x33, 0x33, 0x33, 0x7e, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x33, 0x33, 0x33, 0x00,
   1.151 +	0x3f,
   1.152 +	0x00, 0x33, 0x37, 0x3f, 0x3b, 0x33, 0x00, 0x3c, 0x36, 0x36, 0x7c, 0x00, 0x7e, 0x00, 0x00, 0x1c, 0x36, 0x36, 0x1c, 0x00,
   1.153 +	0x3e,
   1.154 +	0x00, 0x00, 0x0c, 0x00, 0x0c, 0x06, 0x03, 0x33, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
   1.155 +	0x00, 0x3f, 0x30, 0x30, 0x00, 0x00, 0xc3, 0x63, 0x33, 0x7b, 0xcc, 0x66, 0x33, 0xf0, 0xc3, 0x63, 0x33, 0xdb, 0xec, 0xf6,
   1.156 +	0xf3,
   1.157 +	0xc0, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00, 0x00, 0x33, 0x66,
   1.158 +	0xcc,
   1.159 +	0x66, 0x33, 0x00, 0x00, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55,
   1.160 +	0xdb,
   1.161 +	0xee, 0xdb, 0x77, 0xdb, 0xee, 0xdb, 0x77, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f,
   1.162 +	0x18,
   1.163 +	0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x6c, 0x6c, 0x6c, 0x6c, 0x6f, 0x6c, 0x6c, 0x6c, 0x00, 0x00,
   1.164 +	0x00,
   1.165 +	0x00, 0x7f, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x6c, 0x6c, 0x6f, 0x60, 0x6f, 0x6c, 0x6c,
   1.166 +	0x6c,
   1.167 +	0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x7f, 0x60, 0x6f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6f, 0x60,
   1.168 +	0x7f,
   1.169 +	0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0x7f, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
   1.170 +	0x00,
   1.171 +	0x00, 0x00, 0x1f, 0x18, 0x18, 0x18,
   1.172 +	0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1.173 +	0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
   1.174 +	0x18,
   1.175 +	0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x6c, 0x6c, 0x6c, 0x6c, 0xec,
   1.176 +	0x6c,
   1.177 +	0x6c, 0x6c, 0x6c, 0x6c, 0xec, 0x0c, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0c, 0xec, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
   1.178 +	0xef, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xef, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0xec, 0x0c, 0xec, 0x6c,
   1.179 +	0x6c,
   1.180 +	0x6c, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xef, 0x00, 0xef, 0x6c, 0x6c, 0x6c, 0x18, 0x18, 0xff,
   1.181 +	0x00,
   1.182 +	0xff, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18,
   1.183 +	0x00,
   1.184 +	0x00, 0x00, 0x00, 0xff, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0xfc, 0x00, 0x00, 0x00, 0x18, 0x18, 0xf8, 0x18, 0xf8,
   1.185 +	0x00,
   1.186 +	0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
   1.187 +	0x6c,
   1.188 +	0x6c, 0xff, 0x6c, 0x6c, 0x6c, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00,
   1.189 +	0x00,
   1.190 +	0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
   1.191 +	0xff,
   1.192 +	0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff,
   1.193 +	0xff,
   1.194 +	0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
   1.195 +	0x00, 0x00, 0x6e, 0x3b, 0x13, 0x3b, 0x6e, 0x00, 0x00, 0x1e, 0x33, 0x1f, 0x33, 0x1f, 0x03, 0x03, 0x00, 0x3f, 0x33, 0x03,
   1.196 +	0x03, 0x03, 0x03, 0x00, 0x00, 0x7f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x3f, 0x33, 0x06, 0x0c, 0x06, 0x33, 0x3f, 0x00,
   1.197 +	0x00,
   1.198 +	0x00, 0x7e, 0x1b, 0x1b, 0x1b, 0x0e, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x03, 0x00, 0x6e, 0x3b, 0x18, 0x18,
   1.199 +	0x18,
   1.200 +	0x18, 0x00, 0x3f, 0x0c, 0x1e, 0x33, 0x33, 0x1e, 0x0c, 0x3f, 0x1c, 0x36, 0x63, 0x7f, 0x63, 0x36, 0x1c, 0x00, 0x1c, 0x36,
   1.201 +	0x63, 0x63, 0x36, 0x36, 0x77, 0x00, 0x38, 0x0c, 0x18, 0x3e, 0x33, 0x33, 0x1e, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0x7e,
   1.202 +	0x00,
   1.203 +	0x00, 0x60, 0x30, 0x7e, 0xdb, 0xdb, 0x7e, 0x06, 0x03, 0x1c, 0x06, 0x03, 0x1f, 0x03, 0x06, 0x1c, 0x00, 0x1e, 0x33, 0x33,
   1.204 +	0x33,
   1.205 +	0x33, 0x33, 0x33, 0x00, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x00, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x00, 0x3f, 0x00,
   1.206 +	0x06,
   1.207 +	0x0c, 0x18, 0x0c, 0x06, 0x00, 0x3f, 0x00, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x00, 0x3f, 0x00, 0x70, 0xd8, 0xd8, 0x18, 0x18,
   1.208 +	0x18,
   1.209 +	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1b, 0x1b, 0x0e, 0x0c, 0x0c, 0x00, 0x3f, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x6e,
   1.210 +	0x3b,
   1.211 +	0x00, 0x6e, 0x3b, 0x00, 0x00, 0x1c, 0x36, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
   1.212 +	0x00,
   1.213 +	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xf0, 0x30, 0x30, 0x30, 0x37, 0x36, 0x3c, 0x38, 0x1e, 0x36, 0x36, 0x36,
   1.214 +	0x36,
   1.215 +	0x00, 0x00, 0x00, 0x0e, 0x18, 0x0c, 0x06, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00, 0x00,
   1.216 +	0x00,
   1.217 +	0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   1.218 +};
   1.219 +
   1.220 +static void calcColors(const int colorNum, int & lo, int & hi, int & out)
   1.221 +{
   1.222 +	int redLo, redHi, greenLo, greenHi, blueLo, blueHi;
   1.223 +
   1.224 +	if (colorNum == 0 || colorNum == 1 || colorNum == 2 || colorNum == 6) // white, red, yellow, or magenta
   1.225 +		redLo = (0xf) << systemRedShift, redHi = (0x1f) << systemRedShift;
   1.226 +	else
   1.227 +		redLo = redHi = 0;
   1.228 +
   1.229 +	if (colorNum == 0 || colorNum == 2 || colorNum == 3 || colorNum == 4) // white, yellow, green, or cyan
   1.230 +		greenLo = (0xf) << systemGreenShift, greenHi = (0x1f) << systemGreenShift;
   1.231 +	else
   1.232 +		greenLo = greenHi = 0;
   1.233 +
   1.234 +	if (colorNum == 0 || colorNum == 4 || colorNum == 5 || colorNum == 6) // white, cyan, blue, or magenta
   1.235 +		blueLo = (0xf) << systemBlueShift, blueHi = (0x1f) << systemBlueShift;
   1.236 +	else
   1.237 +		blueLo = blueHi = 0;
   1.238 +
   1.239 +	lo = redLo + greenLo + blueLo;
   1.240 +	hi = redHi + greenHi + blueHi;
   1.241 +
   1.242 +	if (colorNum == 7) // black
   1.243 +		out = 0xffffffff; // white border
   1.244 +	else
   1.245 +		out = 0;  // black border
   1.246 +}
   1.247 +
   1.248 +int lastColID = 0;
   1.249 +static void progressColorList(const char *& colorList, int & lo, int & hi, int & out)
   1.250 +{
   1.251 +	if (*colorList)
   1.252 +	{
   1.253 +		if (*colorList != lastColID)
   1.254 +		{
   1.255 +			calcColors((int)(*colorList)-1, lo, hi, out);
   1.256 +			lastColID = *colorList;
   1.257 +		}
   1.258 +		colorList++;
   1.259 +	}
   1.260 +	else
   1.261 +	{
   1.262 +		colorList = NULL;
   1.263 +	}
   1.264 +}
   1.265 +
   1.266 +static void drawTextInternal(u8 *screen, int pitch, int x, int y,
   1.267 +                             const char *string, bool trans, const char *colorList = NULL)
   1.268 +{
   1.269 +	if (colorList && !*colorList)
   1.270 +		colorList = NULL;
   1.271 +
   1.272 +	int loCol, hiCol, outCol;
   1.273 +	calcColors(textColor, loCol, hiCol, outCol);
   1.274 +
   1.275 +	lastColID = 0;
   1.276 +
   1.277 +	const static int xd [8] = {-1, 0, 1, 1, 1, 0, -1, -1};
   1.278 +	const static int yd [8] = {-1, -1, -1, 0, 1, 1, 1, 0};
   1.279 +
   1.280 +	screen += y*pitch;
   1.281 +	int inc = 2;
   1.282 +	switch (systemColorDepth)
   1.283 +	{
   1.284 +	case 24:
   1.285 +		inc = 3;
   1.286 +		break;
   1.287 +	case 32:
   1.288 +		inc = 4;
   1.289 +		break;
   1.290 +	}
   1.291 +	screen += x*inc;
   1.292 +
   1.293 +	int xpos = x;
   1.294 +	switch (systemColorDepth)
   1.295 +	{
   1.296 +	case 16:
   1.297 +	{
   1.298 +		while (*string)
   1.299 +		{
   1.300 +			char c   = *string++;
   1.301 +			u8 * scr = screen;
   1.302 +
   1.303 +			if (colorList)
   1.304 +				progressColorList(colorList, loCol, hiCol, outCol);
   1.305 +
   1.306 +			u16  mask = u16(~RGB_LOW_BITS_MASK);
   1.307 +			u16 *s = (u16 *)scr;
   1.308 +			for (int h = 0-1; h < 8+1; h++)
   1.309 +			{
   1.310 +				for (int w = 0-1; w < 8+1; w++, s++)
   1.311 +				{
   1.312 +					int on = (h < 0 || w < 0 || h >= 8 || w >= 8) ? 0 : (fontdata2[(c<<3)+h]>>w)&1;
   1.313 +
   1.314 +					int border = 0;
   1.315 +					if (outlinedText)
   1.316 +						for (int i = 0; i < 8; i++)
   1.317 +						{
   1.318 +							int h2 = h+yd[i], w2 = w+xd[i];
   1.319 +							border = (h2 < 0 || w2 < 0 || h2 >= 8 || w2 >= 8) ? 0 : (fontdata2[(c<<3)+h2]>>w2)&1;
   1.320 +							if (border)
   1.321 +								break;
   1.322 +						}
   1.323 +
   1.324 +					if (trans)
   1.325 +					{
   1.326 +						if (on)
   1.327 +							*s = loCol +
   1.328 +							     ((*s & mask) >>1);
   1.329 +						else if (border)
   1.330 +						{
   1.331 +							*s = outCol +
   1.332 +							     ((*s & mask) >>1);
   1.333 +						}
   1.334 +					}
   1.335 +					else
   1.336 +					{
   1.337 +						if (on)
   1.338 +							*s = hiCol;
   1.339 +						else if (border)
   1.340 +							*s = outCol;
   1.341 +					}
   1.342 +				}
   1.343 +				scr += pitch;
   1.344 +				s    = (u16 *)scr;
   1.345 +			}
   1.346 +			screen += inc*8;
   1.347 +
   1.348 +			xpos += 8;
   1.349 +			if (xpos+8 > pitch>>1) // cut off text at right boundary
   1.350 +				break;
   1.351 +		}
   1.352 +		break;
   1.353 +	}
   1.354 +	case 24: // TODO: verify this code's correctness
   1.355 +	{
   1.356 +		while (*string)
   1.357 +		{
   1.358 +			char c   = *string++;
   1.359 +			u8 * scr = screen;
   1.360 +
   1.361 +			if (colorList)
   1.362 +				progressColorList(colorList, loCol, hiCol, outCol);
   1.363 +
   1.364 +			int h, w;
   1.365 +			u8 *s = (u8 *)scr;
   1.366 +			for (h = 0-1; h < 8+1; h++)
   1.367 +			{
   1.368 +				for (w = 0-1; w < 8+1; w++, s++)
   1.369 +				{
   1.370 +					int on = (h < 0 || w < 0 || h >= 8 || w >= 8) ? 0 : (fontdata2[(c<<3)+h]>>w)&1;
   1.371 +
   1.372 +					int border = 0;
   1.373 +					if (outlinedText)
   1.374 +						for (int i = 0; i < 8; i++)
   1.375 +						{
   1.376 +							int h2 = h+yd[i], w2 = w+xd[i];
   1.377 +							border = (h2 < 0 || w2 < 0 || h2 >= 8 || w2 >= 8) ? 0 : (fontdata2[(c<<3)+h2]>>w2)&1;
   1.378 +							if (border)
   1.379 +								break;
   1.380 +						}
   1.381 +
   1.382 +					if (trans)
   1.383 +					{
   1.384 +						if (on)
   1.385 +						{
   1.386 +							u32 color = hiCol;
   1.387 +							*s     = ((color & 255)>>1)+(*s>>1);
   1.388 +							*(s+1) = (((color >> 8) & 255)>>1)+(*(s+1)>>1);
   1.389 +							*(s+2) = (((color >> 16) & 255)>>1)+(*(s+2)>>1);
   1.390 +						}
   1.391 +						else if (border)
   1.392 +						{
   1.393 +							u32 color = outCol;
   1.394 +							*s     = ((color & 255)>>1)+(*s>>1);
   1.395 +							*(s+1) = (((color >> 8) & 255)>>1)+(*(s+1)>>1);
   1.396 +							*(s+2) = (((color >> 16) & 255)>>1)+(*(s+2)>>1);
   1.397 +						}
   1.398 +					}
   1.399 +					else
   1.400 +					{
   1.401 +						if (on)
   1.402 +						{
   1.403 +							u32 color = hiCol;
   1.404 +							*s     = (color & 255);
   1.405 +							*(s+1) = (color >> 8) & 255;
   1.406 +							*(s+2) = (color >> 16) & 255;
   1.407 +						}
   1.408 +						else if (border)
   1.409 +						{
   1.410 +							u32 color = outCol;
   1.411 +							*s     = (color & 255);
   1.412 +							*(s+1) = (color >> 8) & 255;
   1.413 +							*(s+2) = (color >> 16) & 255;
   1.414 +						}
   1.415 +					}
   1.416 +				}
   1.417 +				scr += pitch;
   1.418 +				s    = (u8 *)scr;
   1.419 +			}
   1.420 +			screen += inc*8;
   1.421 +
   1.422 +			xpos += 8;
   1.423 +			if (xpos+8 > pitch/3) // cut off text at right boundary
   1.424 +				break;
   1.425 +		}
   1.426 +		break;
   1.427 +	}
   1.428 +	case 32:
   1.429 +	{
   1.430 +		while (*string)
   1.431 +		{
   1.432 +			char c   = *string++;
   1.433 +			u8 * scr = screen;
   1.434 +
   1.435 +			if (colorList)
   1.436 +				progressColorList(colorList, loCol, hiCol, outCol);
   1.437 +
   1.438 +			int  h, w;
   1.439 +			u32  mask = 0xfefefe;
   1.440 +			u32 *s    = (u32 *)scr;
   1.441 +			for (h = 0-1; h < 8+1; h++)
   1.442 +			{
   1.443 +				for (w = 0-1; w < 8+1; w++, s++)
   1.444 +				{
   1.445 +					int on = (h < 0 || w < 0 || h >= 8 || w >= 8) ? 0 : (fontdata2[(c<<3)+h]>>w)&1;
   1.446 +
   1.447 +					int border = 0;
   1.448 +					if (outlinedText)
   1.449 +						for (int i = 0; i < 8; i++)
   1.450 +						{
   1.451 +							int h2 = h+yd[i], w2 = w+xd[i];
   1.452 +							border = (h2 < 0 || w2 < 0 || h2 >= 8 || w2 >= 8) ? 0 : (fontdata2[(c<<3)+h2]>>w2)&1;
   1.453 +							if (border)
   1.454 +								break;
   1.455 +						}
   1.456 +
   1.457 +					if (trans)
   1.458 +					{
   1.459 +						if (on)
   1.460 +							*s = loCol +
   1.461 +							     ((*s & mask)>>1);
   1.462 +						else if (border)
   1.463 +						{
   1.464 +							*s = outCol +
   1.465 +							     ((*s & mask)>>1);
   1.466 +						}
   1.467 +					}
   1.468 +					else
   1.469 +					{
   1.470 +						if (on)
   1.471 +							*s = hiCol;
   1.472 +						else if (border)
   1.473 +							*s = outCol;
   1.474 +					}
   1.475 +				}
   1.476 +				scr += pitch;
   1.477 +				s    = (u32 *)scr;
   1.478 +			}
   1.479 +			screen += inc*8;
   1.480 +
   1.481 +			xpos += 8;
   1.482 +			if (xpos+8 > pitch>>2) // cut off text at right boundary
   1.483 +				break;
   1.484 +		}
   1.485 +		break;
   1.486 +	}
   1.487 +	}
   1.488 +}
   1.489 +
   1.490 +void drawText(u8 *screen, int pitch, int x, int y, const char *string, const char *colorList)
   1.491 +{
   1.492 +	drawTextInternal(screen, pitch, x, y, string, transparentText, colorList);
   1.493 +}
   1.494 +
   1.495 +void drawTextTransp(u8 *screen, int pitch, int x, int y, const char *string, const char *colorList)
   1.496 +{
   1.497 +	drawTextInternal(screen, pitch, x, y, string, true, colorList);
   1.498 +}
   1.499 +