cplot.c

Go to the documentation of this file.
00001 /**
00002 \file    cplot.c
00003 \brief   C functions for 2D plotting directly to a compressed bitmap.
00004 
00005 \author  Glenn D. MacGougan (GDM)
00006 \date    2008-04-23
00007 \since   2007-12-19
00008 
00009 \b "LICENSE INFORMATION" \n
00010 Copyright (c) 2007, refer to 'author' doxygen tags \n
00011 All rights reserved. \n
00012 
00013 Redistribution and use in source and binary forms, with or without
00014 modification, are permitted provided the following conditions are met: \n
00015 
00016 - Redistributions of source code must retain the above copyright
00017   notice, this list of conditions and the following disclaimer. \n
00018 - Redistributions in binary form must reproduce the above copyright
00019   notice, this list of conditions and the following disclaimer in the
00020   documentation and/or other materials provided with the distribution. \n
00021 - The name(s) of the contributor(s) may not be used to endorse or promote 
00022   products derived from this software without specific prior written 
00023   permission. \n
00024 
00025 THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS 
00026 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
00027 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00028 DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
00029 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00030 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
00031 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
00032 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
00033 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
00034 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
00035 SUCH DAMAGE.
00036 */
00037 
00038 #include <stdio.h>  // for FILE*
00039 #include <stdlib.h> // for calloc, malloc, free
00040 #include <string.h> // for strlen, sprintf, strstr, strcmp, and others
00041 #include <ctype.h>  // for isalpha
00042 #include <math.h>
00043 #include <float.h>
00044 #include "cplot.h"
00045 
00046 // deal with msvc empty projects
00047 #ifndef WIN32
00048   #ifdef _WIN32
00049     #define WIN32
00050   #endif
00051 #endif
00052 
00053 #if defined _MSC_VER && _MSC_VER < 1400
00054 #define _CRT_SECURE_NO_DEPRECATE
00055 #endif
00056 
00057 #ifndef _MSC_VER
00058 #define _CRT_SECURE_NO_DEPRECATE
00059 #endif
00060 
00061 //#define INTEL_IPPS
00062 
00063 #ifdef INTEL_IPPS // the intel performance primitives acceleration libraries
00064   #include <ippcore.h>    
00065   #include <ipps.h>
00066   #include <ippvm.h>
00067   #include <ippdc.h>
00068   // you must call "ippStaticInit();" before using this class! if IPPS is enabled
00069   // In Windows, for static linking you must include ippcore.lib and ipps.lib
00070   // in your project
00071 #endif
00072 
00073 #define CPLOT_SIZEOF_BITMAPFILEHEADER (14) //!< True size of disk (one byte packing required).
00074 #define CPLOT_SIZEOF_BITMAPINFOHEADER (40) //!< True size of disk (one byte packing required).
00075   
00076 #define CPLOT_RGB_WHITE       { 255, 255, 255, 0 }
00077 #define CPLOT_RGB_BLACK       {   0,   0,   0, 0 }
00078 #define CPLOT_RGB_BLUE        { 255,   0,   0, 0 }
00079 #define CPLOT_RGB_GREEN       {   0, 128,   0, 0 }
00080 #define CPLOT_RGB_CYAN        { 255, 255,   0, 0 }
00081 #define CPLOT_RGB_RED         {   0,   0, 255, 0 }
00082 #define CPLOT_RGB_INDIANRED   {   0,   0, 128, 0 }
00083 #define CPLOT_RGB_YELLOW      {   0, 255, 255, 0 }
00084 #define CPLOT_RGB_LIMEGREEN   {   0, 255,   0, 0 }
00085 #define CPLOT_RGB_DARKBLUE    { 128,  64,   0, 0 }
00086 #define CPLOT_RGB_BABYBLUE    { 255, 128,   0, 0 }
00087 #define CPLOT_RGB_PAISLYBLUE  { 192, 128,   0, 0 }
00088 #define CPLOT_RGB_LIGHTPURPLE { 255,   0, 128, 0 }
00089 #define CPLOT_RGB_PURPLE      { 255,   0, 128, 0 }
00090 #define CPLOT_RGB_DARKPURPLE  { 128,   0,  64, 0 }
00091 #define CPLOT_RGB_PINK        { 255, 128, 255, 0 }
00092 #define CPLOT_RGB_GREYPURPLE  { 192, 128, 128, 0 }
00093 #define CPLOT_RGB_BROWN       {  64,  64, 128, 0 }
00094 #define CPLOT_RGB_GREY        { 128, 128, 128, 0 }
00095 #define CPLOT_RGB_LIGHTGREY   { 192, 192, 192, 0 }
00096 #define CPLOT_RGB_MAGENTA     { 128,   0, 128, 0 }
00097 #define CPLOT_RGB_ORANGE      {   0, 128, 255, 0 }
00098 
00099 #define CPLOT_LARGEFONT        (14)  //!< The width and height of CPLOT's large font.
00100 #define CPLOT_LARGEFONT_NBYTES (196) //!< The number of bytes in a large font letter.
00101 #define CPLOT_SMALLFONT_HGT    (7)  //!< The heigHt of CPLOT's small font.
00102 #define CPLOT_SMALLFONT_WIDTH  (6)  //!< The width of CPLOT's small font.
00103 #define CPLOT_SMALLFONT_NBYTES (42) //!< The number of bytes in a small font letter.
00104 
00105 #define CPLOT_PIXELS_PER_CM    (38) //!< The number of pixels per centimeter.
00106 
00107 #define CPLOT_POINT_SIZE       (5)  //!< The width/height for a point [pixels].
00108 #define CPLOT_LARGEPOINT_SIZE  (8)  //!< The width/height for a large point [pixels].
00109 
00110 #define CPLOT_DEFAULT_PLOT_WIDTH_CM  (15) //!< The default plot width [cm].
00111 #define CPLOT_DEFAULT_PLOT_HEIGHT_CM (13) //!< The default plot height [cm].
00112 
00113 
00114 typedef unsigned char  byte;
00115 
00116 
00117 /*
00118 const CPLOT_structRGB kRGB_White       = CPLOT_RGB_WHITE;
00119 const CPLOT_structRGB kRGB_Black       = CPLOT_RGB_BLACK;
00120 const CPLOT_structRGB kRGB_Blue        = CPLOT_RGB_BLUE;
00121 const CPLOT_structRGB kRGB_Green       = CPLOT_RGB_GREEN;
00122 const CPLOT_structRGB kRGB_Cyan        = CPLOT_RGB_CYAN;
00123 const CPLOT_structRGB kRGB_Red         = CPLOT_RGB_RED;
00124 const CPLOT_structRGB kRGB_IndianRed   = CPLOT_RGB_INDIANRED;
00125 const CPLOT_structRGB kRGB_Yellow      = CPLOT_RGB_YELLOW;
00126 const CPLOT_structRGB kRGB_LimeGreen   = CPLOT_RGB_LIMEGREEN;
00127 const CPLOT_structRGB kRGB_DarkBlue    = CPLOT_RGB_DARKBLUE;
00128 const CPLOT_structRGB kRGB_BabyBlue    = CPLOT_RGB_BABYBLUE;
00129 const CPLOT_structRGB kRGB_PaislyBlue  = CPLOT_RGB_PAISLYBLUE;
00130 const CPLOT_structRGB kRGB_LightPurple = CPLOT_RGB_LIGHTPURPLE;
00131 const CPLOT_structRGB kRGB_Purple      = CPLOT_RGB_PURPLE;
00132 const CPLOT_structRGB kRGB_DarkPurple  = CPLOT_RGB_DARKPURPLE;
00133 const CPLOT_structRGB kRGB_Pink        = CPLOT_RGB_PINK;
00134 const CPLOT_structRGB kRGB_GreyPurple  = CPLOT_RGB_GREYPURPLE;
00135 const CPLOT_structRGB kRGB_Brown       = CPLOT_RGB_BROWN;
00136 const CPLOT_structRGB kRGB_Grey        = CPLOT_RGB_GREY;
00137 const CPLOT_structRGB kRGB_LightGrey   = CPLOT_RGB_LIGHTGREY;
00138 const CPLOT_structRGB kRGB_Magenta     = CPLOT_RGB_MAGENTA;
00139 const CPLOT_structRGB kRGB_Orange      = CPLOT_RGB_ORANGE;
00140 */
00141 
00142 const CPLOT_structColorTable CPLOT_DefaultColorTable = {
00143   CPLOT_RGB_WHITE,
00144   CPLOT_RGB_BLACK,
00145   CPLOT_RGB_BLUE,
00146   CPLOT_RGB_GREEN,
00147   CPLOT_RGB_PURPLE,
00148   CPLOT_RGB_MAGENTA,
00149   CPLOT_RGB_DARKBLUE,
00150   CPLOT_RGB_INDIANRED,
00151   CPLOT_RGB_BABYBLUE,
00152   CPLOT_RGB_PAISLYBLUE,
00153   CPLOT_RGB_LIGHTPURPLE,
00154   CPLOT_RGB_DARKPURPLE,
00155   CPLOT_RGB_GREYPURPLE,
00156   CPLOT_RGB_BROWN,
00157   CPLOT_RGB_RED,
00158   CPLOT_RGB_PINK,
00159   CPLOT_RGB_YELLOW,
00160   CPLOT_RGB_ORANGE,
00161   CPLOT_RGB_CYAN,
00162   CPLOT_RGB_LIMEGREEN,
00163   CPLOT_RGB_GREY,
00164   CPLOT_RGB_LIGHTGREY,
00165 };
00166 
00167 
00168 
00169 
00170 
00171 const byte CPLOT_Point[CPLOT_POINT_SIZE][CPLOT_POINT_SIZE] =
00172  {{ 0,0,1,0,0 },
00173   { 0,1,1,1,0 },
00174   { 1,1,1,1,1 },
00175   { 0,1,1,1,0 },
00176   { 0,0,1,0,0 },};      
00177 
00178 const byte CPLOT_LargePoint[CPLOT_LARGEPOINT_SIZE][CPLOT_LARGEPOINT_SIZE] =
00179  {{ 0,0,1,1,0,0 },
00180   { 0,1,1,1,1,0 },
00181   { 1,1,1,1,1,1 },
00182   { 1,1,1,1,1,1 },
00183   { 0,1,1,1,1,0 },
00184   { 0,0,1,1,0,0 },};
00185 
00186 
00187 const byte CPLOT_LARGEFONT_sigma[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00188 {
00189 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00190 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00191 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00192 { 0,0,0,1,1,1,1,1,1,1,1,1,1,1 },
00193 { 0,0,1,1,1,1,1,1,1,1,1,1,1,1 },
00194 { 0,1,1,1,0,0,0,0,1,1,0,0,0,0 },
00195 { 0,1,1,0,0,0,0,0,0,1,1,0,0,0 },
00196 { 0,1,1,0,0,0,0,0,0,1,1,0,0,0 },
00197 { 0,1,1,0,0,0,0,0,0,1,1,0,0,0 },
00198 { 0,0,1,1,0,0,0,0,1,1,1,0,0,0 },
00199 { 0,0,0,1,1,1,1,1,1,1,0,0,0,0 },
00200 { 0,0,0,0,1,1,1,1,1,0,0,0,0,0 },
00201 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00202 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00203 };
00204 
00205 
00206 const byte CPLOT_LARGEFONT_A[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00207 {
00208 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
00209 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
00210 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00211 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00212 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00213 { 0,1,1,0,0,0,1,1,0,0,0,0,0,0 },
00214 { 0,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00215 { 0,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00216 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00217 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00218 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00219 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00220 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00221 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00222 };
00223 
00224 const byte CPLOT_LARGEFONT_B[CPLOT_LARGEFONT][CPLOT_LARGEFONT] =  //11
00225 {
00226 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00227 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 }, 
00228 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00229 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00230 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00231 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 }, 
00232 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00233 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00234 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00235 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 }, 
00236 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00237 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00238 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00239 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00240 };
00241 
00242 
00243 const byte CPLOT_LARGEFONT_C[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00244 {
00245 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
00246 { 0,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00247 { 0,1,1,0,0,0,1,1,1,0,0,0,0,0 },
00248 { 1,1,0,0,0,0,0,1,0,0,0,0,0,0 },
00249 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00250 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00251 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00252 { 1,1,0,0,0,0,0,1,0,0,0,0,0,0 },
00253 { 0,1,1,0,0,0,1,1,1,0,0,0,0,0 },
00254 { 0,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00255 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
00256 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00257 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00258 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00259 };
00260 
00261 
00262 const byte CPLOT_LARGEFONT_D[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00263 {
00264 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00265 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 }, 
00266 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 }, 
00267 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00268 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00269 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00270 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00271 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 }, 
00272 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 }, 
00273 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 }, 
00274 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00275 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00276 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00277 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00278 };
00279 
00280 
00281 
00282 const byte CPLOT_LARGEFONT_E[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00283 {
00284 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00285 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00286 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00287 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00288 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00289 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00290 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00291 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00292 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00293 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00294 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00295 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00296 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00297 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00298 };
00299 
00300 
00301 const byte CPLOT_LARGEFONT_F[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00302 {
00303 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00304 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00305 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00306 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00307 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00308 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00309 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00310 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00311 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00312 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00313 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00314 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00315 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00316 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00317 };
00318 
00319 
00320 const byte CPLOT_LARGEFONT_G[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00321 {
00322 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
00323 { 0,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00324 { 0,1,1,0,0,0,1,1,1,0,0,0,0,0 },
00325 { 1,1,0,0,0,0,0,1,0,0,0,0,0,0 },
00326 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00327 { 1,1,0,0,0,1,1,1,1,0,0,0,0,0 },
00328 { 1,1,0,0,0,1,1,1,1,0,0,0,0,0 },
00329 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00330 { 0,1,1,0,0,0,1,1,1,0,0,0,0,0 },
00331 { 0,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00332 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
00333 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00334 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00335 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00336 };
00337 
00338 
00339 
00340 const byte CPLOT_LARGEFONT_H[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00341 {
00342 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00343 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00344 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00345 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00346 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00347 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00348 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00349 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00350 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00351 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00352 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00353 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00354 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00355 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00356 };
00357 
00358 
00359 const byte CPLOT_LARGEFONT_I[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //3
00360 {
00361 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00362 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00363 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00364 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00365 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00366 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00367 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00368 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00369 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00370 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00371 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00372 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00373 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00374 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00375 };
00376 
00377 
00378 const byte CPLOT_LARGEFONT_J[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00379 {
00380 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00381 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00382 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00383 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00384 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00385 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00386 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00387 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00388 { 1,1,1,0,0,1,1,0,0,0,0,0,0,0 },
00389 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00390 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
00391 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00392 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00393 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00394 };
00395 
00396 
00397 const byte CPLOT_LARGEFONT_K[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00398 {
00399 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00400 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00401 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00402 { 1,1,0,0,1,1,1,0,0,0,0,0,0,0 },
00403 { 1,1,0,1,1,1,1,0,0,0,0,0,0,0 },
00404 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00405 { 1,1,1,0,0,1,1,0,0,0,0,0,0,0 },
00406 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00407 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00408 { 1,1,0,0,0,0,1,1,1,0,0,0,0,0 },
00409 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00410 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00411 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00412 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00413 };
00414 
00415 
00416 const byte CPLOT_LARGEFONT_L[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00417 {
00418 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00419 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00420 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00421 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00422 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00423 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00424 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00425 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00426 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00427 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00428 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00429 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00430 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00431 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00432 };
00433 
00434 
00435 const byte CPLOT_LARGEFONT_M[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //13
00436 {
00437 { 1,1,1,0,0,0,0,0,1,1,1,0,0,0 },
00438 { 1,1,1,0,0,0,0,0,1,1,1,0,0,0 },
00439 { 1,1,1,1,0,0,0,1,1,1,1,0,0,0 },
00440 { 1,1,1,1,0,0,0,1,1,1,1,0,0,0 },
00441 { 1,1,0,1,1,0,1,1,0,1,1,0,0,0 },
00442 { 1,1,0,1,1,0,1,1,0,1,1,0,0,0 },
00443 { 1,1,0,1,1,0,1,1,0,1,1,0,0,0 },
00444 { 1,1,0,0,1,1,1,0,0,1,1,0,0,0 },
00445 { 1,1,0,0,1,1,1,0,0,1,1,0,0,0 },
00446 { 1,1,0,0,1,1,1,0,0,1,1,0,0,0 },
00447 { 1,1,0,0,0,1,0,0,0,1,1,0,0,0 },
00448 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00449 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00450 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00451 };
00452 
00453 
00454 const byte CPLOT_LARGEFONT_N[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00455 {
00456 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00457 { 1,1,1,0,0,0,0,1,1,0,0,0,0,0 },
00458 { 1,1,1,1,0,0,0,1,1,0,0,0,0,0 },
00459 { 1,1,1,1,0,0,0,1,1,0,0,0,0,0 },
00460 { 1,1,0,1,1,0,0,1,1,0,0,0,0,0 },
00461 { 1,1,0,1,1,1,0,1,1,0,0,0,0,0 },
00462 { 1,1,0,0,1,1,0,1,1,0,0,0,0,0 },
00463 { 1,1,0,0,0,1,1,1,1,0,0,0,0,0 },
00464 { 1,1,0,0,0,1,1,1,1,0,0,0,0,0 },
00465 { 1,1,0,0,0,0,1,1,1,0,0,0,0,0 },
00466 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00467 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00468 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00469 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00470 };
00471 
00472 
00473 const byte CPLOT_LARGEFONT_O[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //12
00474 {
00475 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
00476 { 0,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00477 { 0,1,1,0,0,0,0,1,1,0,0,0,0,0 },
00478 { 1,1,0,0,0,0,0,1,1,1,0,0,0,0 },
00479 { 1,1,0,0,0,0,0,0,1,1,0,0,0,0 },
00480 { 1,1,0,0,0,0,0,0,1,1,0,0,0,0 },
00481 { 1,1,0,0,0,0,0,0,1,1,0,0,0,0 },
00482 { 1,1,0,0,0,0,0,1,1,1,0,0,0,0 },
00483 { 0,1,1,0,0,0,0,1,1,0,0,0,0,0 },
00484 { 0,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00485 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
00486 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00487 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00488 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00489 };
00490 
00491 
00492 
00493 const byte CPLOT_LARGEFONT_P[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
00494 {
00495 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00496 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00497 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00498 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00499 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00500 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00501 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00502 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00503 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00504 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00505 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00506 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00507 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00508 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00509 };
00510 
00511 
00512 const byte CPLOT_LARGEFONT_Q[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //12
00513 {
00514 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
00515 { 0,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00516 { 0,1,1,0,0,0,0,1,1,0,0,0,0,0 },
00517 { 1,1,0,0,0,0,0,1,1,1,0,0,0,0 },
00518 { 1,1,0,0,0,0,0,0,1,1,0,0,0,0 },
00519 { 1,1,0,0,0,0,0,0,1,1,0,0,0,0 },
00520 { 1,1,0,0,0,0,0,0,1,1,0,0,0,0 },
00521 { 1,1,0,0,1,1,0,0,1,1,0,0,0,0 },
00522 { 0,1,1,0,0,1,1,1,1,0,0,0,0,0 },
00523 { 0,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00524 { 0,0,0,1,1,1,0,1,1,0,0,0,0,0 },
00525 { 0,0,0,0,0,0,0,0,1,1,0,0,0,0 },   
00526 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00527 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00528 };
00529 
00530 
00531 const byte CPLOT_LARGEFONT_R[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
00532 {
00533 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00534 { 1,1,1,1,1,1,1,1,1,0,0,0,0,0 },
00535 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00536 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00537 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00538 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00539 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00540 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00541 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00542 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00543 { 1,1,0,0,0,0,0,1,1,1,0,0,0,0 },
00544 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00545 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00546 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00547 };
00548 
00549 
00550 const byte CPLOT_LARGEFONT_S[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
00551 {
00552 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00553 { 0,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00554 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00555 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00556 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
00557 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00558 { 0,0,0,0,1,1,1,1,0,0,0,0,0,0 },
00559 { 0,0,0,0,0,0,1,1,0,0,0,0,0,0 },
00560 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00561 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00562 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00563 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00564 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00565 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00566 };
00567 
00568 
00569 const byte CPLOT_LARGEFONT_T[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
00570 {
00571 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00572 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00573 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00574 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00575 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00576 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00577 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00578 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00579 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00580 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00581 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00582 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00583 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00584 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00585 };
00586 
00587 
00588 const byte CPLOT_LARGEFONT_U[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
00589 {
00590 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00591 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00592 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00593 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00594 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00595 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00596 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00597 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00598 { 0,1,1,0,0,0,1,1,1,0,0,0,0,0 },
00599 { 0,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00600 { 0,0,1,1,1,1,1,0,0,0,0,0,0,0 },
00601 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00602 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00603 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00604 };
00605 
00606 
00607 const byte CPLOT_LARGEFONT_V[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00608 {
00609 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00610 { 1,1,0,0,0,0,0,1,1,0,0,0,0,0 },
00611 { 0,1,1,0,0,0,1,1,0,0,0,0,0,0 },
00612 { 0,1,1,0,0,0,1,1,0,0,0,0,0,0 },
00613 { 0,1,1,0,0,0,1,1,0,0,0,0,0,0 },
00614 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00615 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00616 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00617 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
00618 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
00619 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
00620 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00621 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00622 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00623 };
00624 
00625 const byte CPLOT_LARGEFONT_W[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //14
00626 {
00627 { 1,1,0,0,0,1,1,1,0,0,0,1,1,0 },
00628 { 1,1,0,0,0,1,1,1,0,0,0,1,1,0 },
00629 { 1,1,1,0,0,1,1,1,0,0,1,1,1,0 },
00630 { 0,1,1,0,1,1,0,1,1,0,1,1,0,0 },
00631 { 0,1,1,0,1,1,0,1,1,0,1,1,0,0 },
00632 { 0,1,1,0,1,1,0,1,1,0,1,1,0,0 },
00633 { 0,1,1,0,1,1,0,1,1,0,1,1,0,0 },
00634 { 0,1,1,0,1,0,0,0,1,0,1,1,0,0 },
00635 { 0,0,1,1,1,0,0,0,1,1,1,0,0,0 },
00636 { 0,0,1,1,1,0,0,0,1,1,1,0,0,0 },
00637 { 0,0,1,1,1,0,0,0,1,1,1,0,0,0 },
00638 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00639 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00640 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00641 };
00642 
00643 
00644 const byte CPLOT_LARGEFONT_X[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
00645 {
00646 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00647 { 1,1,1,0,0,1,1,1,0,0,0,0,0,0 },
00648 { 0,1,1,0,0,1,1,0,0,0,0,0,0,0 },
00649 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00650 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00651 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00652 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00653 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00654 { 0,1,1,0,0,1,1,0,0,0,0,0,0,0 },
00655 { 1,1,1,0,0,1,1,1,0,0,0,0,0,0 },
00656 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00657 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00658 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00659 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00660 };
00661 
00662 
00663 const byte CPLOT_LARGEFONT_Y[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00664 {
00665 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00666 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
00667 { 0,1,1,0,0,1,1,0,0,0,0,0,0,0 },
00668 { 0,1,1,0,0,1,1,0,0,0,0,0,0,0 },
00669 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00670 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00671 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00672 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00673 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00674 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00675 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00676 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00677 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00678 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00679 };
00680 
00681 
00682 const byte CPLOT_LARGEFONT_Z[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00683 {
00684 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00685 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00686 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00687 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
00688 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
00689 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
00690 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00691 { 0,1,1,1,0,0,0,0,0,0,0,0,0,0 },
00692 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00693 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00694 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
00695 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00696 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00697 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00698 };
00699 
00700 
00701 const byte CPLOT_LARGEFONT_a[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
00702 {
00703 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00704 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00705 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00706 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
00707 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00708 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
00709 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00710 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
00711 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
00712 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00713 { 0,1,1,1,0,1,1,0,0,0,0,0,0,0 },
00714 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00715 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00716 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00717 };
00718 
00719 const byte CPLOT_LARGEFONT_b[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00720 {
00721 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00722 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00723 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00724 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
00725 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00726 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
00727 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00728 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00729 { 1,1,0,0,1,1,1,0,0,0,0,0,0,0 },
00730 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00731 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
00732 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00733 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00734 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00735 };
00736 
00737 const byte CPLOT_LARGEFONT_c[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00738 {
00739 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00740 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00741 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00742 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00743 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00744 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00745 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00746 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00747 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00748 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00749 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00750 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00751 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00752 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00753 };
00754 
00755 const byte CPLOT_LARGEFONT_d[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00756 {
00757 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00758 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00759 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
00760 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00761 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00762 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
00763 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00764 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00765 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
00766 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00767 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00768 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00769 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00770 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00771 };
00772 
00773 const byte CPLOT_LARGEFONT_e[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00774 {
00775 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00776 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00777 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00778 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00779 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00780 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00781 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00782 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00783 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00784 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00785 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00786 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00787 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00788 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00789 };
00790 
00791 const byte CPLOT_LARGEFONT_f[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //7
00792 {
00793 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
00794 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00795 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00796 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
00797 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
00798 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00799 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00800 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00801 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00802 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00803 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00804 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00805 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00806 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00807 };
00808 
00809 const byte CPLOT_LARGEFONT_g[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00810 {
00811 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00812 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00813 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00814 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00815 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00816 { 1,1,0,0,1,1,1,0,0,0,0,0,0,0 },
00817 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00818 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00819 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
00820 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00821 { 0,1,1,1,0,1,1,0,0,0,0,0,0,0 },
00822 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00823 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00824 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00825 };
00826 
00827 
00828 const byte CPLOT_LARGEFONT_h[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00829 {
00830 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00831 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00832 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },   
00833 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00834 { 1,1,0,1,1,1,0,0,0,0,0,0,0,0 },
00835 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00836 { 1,1,1,0,0,1,1,0,0,0,0,0,0,0 },
00837 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00838 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00839 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00840 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00841 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00842 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00843 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00844 };
00845 
00846 const byte CPLOT_LARGEFONT_i[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //4
00847 {
00848 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00849 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00850 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00851 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00852 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00853 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00854 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00855 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00856 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00857 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00858 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00859 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00860 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00861 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00862 };
00863 
00864 const byte CPLOT_LARGEFONT_j[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //5
00865 {
00866 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00867 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00868 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00869 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00870 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00871 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00872 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00873 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00874 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00875 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00876 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00877 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
00878 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
00879 { 1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
00880 };
00881 
00882 const byte CPLOT_LARGEFONT_k[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
00883 {
00884 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00885 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00886 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00887 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
00888 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
00889 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
00890 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
00891 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
00892 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
00893 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
00894 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
00895 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00896 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00897 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00898 };
00899 
00900 const byte CPLOT_LARGEFONT_l[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //4
00901 {
00902 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00903 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00904 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00905 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00906 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00907 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00908 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00909 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00910 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00911 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00912 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00913 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00914 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00915 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00916 };
00917 
00918 
00919 const byte CPLOT_LARGEFONT_m[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //12
00920 {
00921 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00922 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00923 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00924 { 1,1,0,1,1,0,0,1,1,0,0,0,0,0 },
00925 { 1,1,1,1,1,1,1,1,1,1,0,0,0,0 },
00926 { 1,1,0,0,1,1,0,0,1,1,0,0,0,0 },
00927 { 1,1,0,0,1,1,0,0,1,1,0,0,0,0 },
00928 { 1,1,0,0,1,1,0,0,1,1,0,0,0,0 },
00929 { 1,1,0,0,1,1,0,0,1,1,0,0,0,0 },
00930 { 1,1,0,0,1,1,0,0,1,1,0,0,0,0 },
00931 { 1,1,0,0,1,1,0,0,1,1,0,0,0,0 },
00932 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },   
00933 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },  
00934 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00935 };
00936 
00937 const byte CPLOT_LARGEFONT_n[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00938 {
00939 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00940 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00941 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00942 { 1,1,0,1,1,1,0,0,0,0,0,0,0,0 },
00943 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00944 { 1,1,1,0,0,1,1,0,0,0,0,0,0,0 },
00945 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00946 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00947 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00948 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00949 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00950 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00951 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00952 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00953 };
00954 
00955 
00956 const byte CPLOT_LARGEFONT_o[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00957 {
00958 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00959 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00960 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00961 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
00962 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00963 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
00964 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00965 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00966 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
00967 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00968 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
00969 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00970 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00971 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00972 };
00973 
00974 const byte CPLOT_LARGEFONT_p[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00975 {
00976 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00977 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00978 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00979 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
00980 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00981 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
00982 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00983 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
00984 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
00985 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
00986 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
00987 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00988 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00989 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
00990 };
00991 
00992 const byte CPLOT_LARGEFONT_q[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
00993 {
00994 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00995 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00996 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
00997 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
00998 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
00999 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
01000 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01001 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01002 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
01003 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01004 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
01005 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01006 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01007 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01008 };
01009 
01010 const byte CPLOT_LARGEFONT_r[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //6
01011 {
01012 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01013 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01014 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01015 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
01016 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01017 { 1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01018 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01019 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01020 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01021 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01022 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01023 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01024 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01025 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01026 };
01027 
01028 const byte CPLOT_LARGEFONT_s[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //7
01029 {
01030 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01031 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01032 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01033 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01034 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01035 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01036 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01037 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01038 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
01039 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01040 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01041 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01042 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01043 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01044 };
01045 
01046 const byte CPLOT_LARGEFONT_t[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //6
01047 {
01048 { 0,0,1,0,0,0,0,0,0,0,0,0,0,0 },
01049 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01050 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01051 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01052 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01053 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01054 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01055 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01056 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01057 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01058 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01059 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01060 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01061 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01062 };
01063 
01064 
01065 const byte CPLOT_LARGEFONT_u[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
01066 {
01067 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01068 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01069 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01070 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01071 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01072 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01073 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01074 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01075 { 1,1,0,0,1,1,1,0,0,0,0,0,0,0 },
01076 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01077 { 0,1,1,1,0,1,1,0,0,0,0,0,0,0 },
01078 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01079 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01080 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01081 };
01082 
01083 const byte CPLOT_LARGEFONT_v[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01084 {
01085 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01086 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01087 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01088 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01089 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01090 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01091 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01092 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01093 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01094 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01095 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01096 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01097 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01098 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01099 };
01100 
01101 const byte CPLOT_LARGEFONT_w[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //12
01102 {
01103 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01104 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01105 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01106 { 1,1,0,0,0,1,0,0,0,1,1,0,0,0 },
01107 { 1,1,0,0,1,1,1,0,0,1,1,0,0,0 },
01108 { 0,1,1,0,1,1,1,0,1,1,0,0,0,0 },
01109 { 0,1,1,0,1,0,1,0,1,1,0,0,0,0 },
01110 { 0,1,1,0,1,0,1,0,1,1,0,0,0,0 },
01111 { 0,0,1,1,1,0,1,1,1,0,0,0,0,0 },
01112 { 0,0,1,1,1,0,1,1,1,0,0,0,0,0 },
01113 { 0,0,1,1,0,0,0,1,1,0,0,0,0,0 },
01114 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },   
01115 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },  
01116 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01117 };
01118 
01119 const byte CPLOT_LARGEFONT_x[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //7
01120 {
01121 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01122 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01123 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01124 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
01125 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
01126 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01127 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01128 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01129 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01130 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
01131 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
01132 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01133 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01134 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01135 };
01136 
01137 const byte CPLOT_LARGEFONT_y[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01138 {
01139 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01140 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01141 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01142 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01143 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01144 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01145 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01146 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01147 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01148 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01149 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01150 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01151 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01152 { 0,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01153 };
01154 
01155 
01156 const byte CPLOT_LARGEFONT_z[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01157 {
01158 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01159 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01160 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01161 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01162 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01163 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
01164 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01165 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01166 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01167 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01168 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01169 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01170 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01171 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01172 };
01173 
01174 
01175 const byte CPLOT_LARGEFONT_tilda[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
01176 {
01177 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01178 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01179 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01180 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01181 { 0,1,1,1,0,0,0,1,0,0,0,0,0,0 },
01182 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01183 { 1,0,0,0,1,1,1,0,0,0,0,0,0,0 },
01184 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01185 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01186 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01187 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01188 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01189 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01190 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01191 };
01192 
01193 const byte CPLOT_LARGEFONT_exclamation[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //4
01194 {
01195 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01196 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01197 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01198 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01199 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01200 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01201 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01202 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01203 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01204 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01205 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01206 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01207 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01208 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01209 };
01210 
01211 const byte CPLOT_LARGEFONT_at[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //12
01212 {
01213 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01214 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01215 { 0,0,0,1,1,1,1,1,0,0,0,0,0,0 },
01216 { 0,0,1,1,0,0,0,0,1,1,0,0,0,0 },
01217 { 0,1,0,0,1,1,0,1,1,0,1,0,0,0 },
01218 { 0,1,0,1,1,1,1,1,1,0,1,0,0,0 },
01219 { 1,0,1,1,0,0,0,1,1,0,1,0,0,0 },
01220 { 1,0,1,1,0,0,0,1,1,0,1,0,0,0 },
01221 { 1,0,1,1,0,0,0,1,1,0,1,0,0,0 },
01222 { 1,0,1,1,1,1,1,1,1,1,0,0,0,0 },
01223 { 1,0,0,1,1,0,1,1,1,0,0,0,0,0 },
01224 { 0,1,0,0,0,0,0,0,0,0,1,0,0,0 },
01225 { 0,0,1,0,0,0,0,0,0,1,0,0,0,0 },
01226 { 0,0,0,1,1,1,1,1,1,0,0,0,0,0 },
01227 };
01228 
01229 const byte CPLOT_LARGEFONT_hash[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
01230 {
01231 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
01232 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
01233 { 0,0,1,1,0,1,1,0,0,0,0,0,0,0 },
01234 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01235 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01236 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01237 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01238 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01239 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01240 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
01241 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
01242 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01243 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01244 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01245 };
01246 
01247 const byte CPLOT_LARGEFONT_dollarsign[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
01248 {
01249 { 0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
01250 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01251 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01252 { 1,1,0,1,0,1,1,0,0,0,0,0,0,0 },
01253 { 1,1,0,1,0,0,0,0,0,0,0,0,0,0 },
01254 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01255 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01256 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
01257 { 1,1,0,1,0,1,1,0,0,0,0,0,0,0 },
01258 { 1,1,0,1,0,1,1,0,0,0,0,0,0,0 },
01259 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01260 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01261 { 0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
01262 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01263 };
01264 
01265 const byte CPLOT_LARGEFONT_percent[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //14
01266 {
01267 { 0,1,1,1,0,0,0,0,1,1,0,0,0,0 },
01268 { 1,1,0,1,1,0,0,1,1,0,0,0,0,0 },
01269 { 1,1,0,1,1,0,0,1,1,0,0,0,0,0 },
01270 { 1,1,0,1,1,0,1,1,0,0,0,0,0,0 },
01271 { 0,1,1,1,0,0,1,1,0,0,0,0,0,0 },
01272 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01273 { 0,0,0,0,0,1,1,0,1,1,1,0,0,0 },
01274 { 0,0,0,0,1,1,0,1,1,0,1,1,0,0 },
01275 { 0,0,0,0,1,1,0,1,1,0,1,1,0,0 },
01276 { 0,0,0,1,1,0,0,1,1,0,1,1,0,0 },
01277 { 0,0,0,1,1,0,0,0,1,1,1,0,0,0 },
01278 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01279 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01280 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01281 };
01282 
01283 const byte CPLOT_LARGEFONT_raiseto[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
01284 {
01285 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01286 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01287 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01288 { 0,1,1,0,0,1,1,0,0,0,0,0,0,0 },
01289 { 0,1,1,0,0,1,1,0,0,0,0,0,0,0 },
01290 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
01291 { 1,1,0,0,0,0,1,1,0,0,0,0,0,0 },
01292 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01293 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01294 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01295 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01296 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01297 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01298 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01299 };
01300 
01301 const byte CPLOT_LARGEFONT_andsign[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //11
01302 {
01303 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01304 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01305 { 0,1,1,0,0,1,1,0,0,0,0,0,0,0 },
01306 { 0,1,1,0,0,1,1,0,0,0,0,0,0,0 },
01307 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01308 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01309 { 1,1,0,0,1,1,0,1,1,0,0,0,0,0 },
01310 { 1,1,0,0,1,1,1,1,1,0,0,0,0,0 },
01311 { 1,1,0,0,0,1,1,1,1,0,0,0,0,0 },
01312 { 1,1,1,1,1,1,1,1,1,1,0,0,0,0 },
01313 { 0,1,1,1,1,1,0,0,1,0,0,0,0,0 },
01314 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01315 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01316 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01317 };
01318 
01319 const byte CPLOT_LARGEFONT_star[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01320 {
01321 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01322 { 0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
01323 { 0,1,0,1,0,1,0,0,0,0,0,0,0,0 },
01324 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01325 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01326 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01327 { 0,1,0,1,0,1,0,0,0,0,0,0,0,0 },
01328 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01329 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01330 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01331 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01332 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01333 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01334 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01335 };
01336 
01337 const byte CPLOT_LARGEFONT_leftbracket[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //5
01338 {
01339 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01340 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01341 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01342 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01343 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01344 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01345 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01346 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01347 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01348 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01349 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01350 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01351 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01352 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01353 };
01354 
01355 const byte CPLOT_LARGEFONT_rightbracket[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //5
01356 {
01357 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01358 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01359 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01360 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01361 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01362 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01363 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01364 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01365 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01366 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01367 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01368 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01369 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01370 { 1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01371 };
01372 
01373 const byte CPLOT_LARGEFONT_dash[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //5
01374 {
01375 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01376 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01377 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01378 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01379 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01380 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01381 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01382 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01383 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01384 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01385 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01386 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01387 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01388 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01389 };
01390 
01391 const byte CPLOT_LARGEFONT_underscore[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
01392 {
01393 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01394 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01395 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01396 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01397 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01398 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01399 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01400 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01401 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01402 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01403 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01404 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01405 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01406 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01407 };
01408 
01409 const byte CPLOT_LARGEFONT_plus[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
01410 {
01411 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01412 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01413 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01414 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01415 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01416 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01417 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01418 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01419 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01420 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01421 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01422 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01423 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01424 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01425 };
01426 
01427 const byte CPLOT_LARGEFONT_equals[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //10
01428 {
01429 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01430 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01431 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01432 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01433 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01434 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01435 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01436 { 1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
01437 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01438 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01439 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01440 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01441 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01442 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01443 };
01444 
01445 const byte CPLOT_LARGEFONT_leftcurly[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //6
01446 {
01447 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01448 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01449 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01450 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01451 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01452 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01453 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01454 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01455 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01456 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01457 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01458 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01459 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01460 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01461 };
01462 
01463 const byte CPLOT_LARGEFONT_rightcurly[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //6
01464 {
01465 { 1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01466 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01467 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01468 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01469 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01470 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01471 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01472 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01473 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01474 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01475 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01476 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01477 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01478 { 1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01479 };
01480 
01481 const byte CPLOT_LARGEFONT_vert[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //5
01482 {
01483 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01484 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01485 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01486 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01487 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01488 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01489 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01490 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01491 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01492 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01493 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01494 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01495 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01496 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01497 };
01498 
01499 const byte CPLOT_LARGEFONT_leftsquare[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //5
01500 {
01501 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01502 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01503 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01504 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01505 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01506 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01507 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01508 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01509 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01510 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01511 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01512 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01513 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01514 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01515 };
01516 
01517 const byte CPLOT_LARGEFONT_rightsquare[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //5
01518 {
01519 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01520 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01521 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01522 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01523 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01524 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01525 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01526 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01527 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01528 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01529 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01530 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01531 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01532 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01533 };
01534 
01535 const byte CPLOT_LARGEFONT_backslash[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //6
01536 {
01537 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01538 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01539 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01540 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01541 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01542 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01543 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01544 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01545 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01546 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01547 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01548 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01549 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01550 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01551 };
01552 
01553 const byte CPLOT_LARGEFONT_forwardslash[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //6
01554 {
01555 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01556 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01557 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01558 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01559 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01560 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01561 { 0,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01562 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01563 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01564 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01565 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01566 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01567 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01568 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01569 };
01570 
01571 const byte CPLOT_LARGEFONT_semicolon[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //4
01572 {
01573 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01574 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01575 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01576 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01577 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01578 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01579 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01580 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01581 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01582 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01583 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01584 { 0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01585 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01586 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01587 };
01588 
01589 const byte CPLOT_LARGEFONT_colon[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //4
01590 {
01591 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01592 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01593 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01594 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01595 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01596 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01597 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01598 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01599 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01600 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01601 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01602 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01603 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01604 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01605 };
01606 
01607 const byte CPLOT_LARGEFONT_singlequote[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //4
01608 {
01609 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01610 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01611 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01612 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01613 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01614 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01615 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01616 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01617 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01618 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01619 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01620 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01621 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01622 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01623 };
01624 
01625 const byte CPLOT_LARGEFONT_comma[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //4
01626 {
01627 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01628 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01629 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01630 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01631 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01632 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01633 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01634 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01635 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01636 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01637 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01638 { 0,0,1,0,0,0,0,0,0,0,0,0,0,0 },
01639 { 0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01640 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01641 };
01642 
01643 const byte CPLOT_LARGEFONT_point[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //4
01644 {
01645 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01646 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01647 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01648 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01649 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01650 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01651 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01652 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01653 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01654 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01655 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01656 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01657 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01658 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01659 };
01660 
01661 
01662 
01663 const byte CPLOT_LARGEFONT_doublequote[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01664 {
01665 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01666 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01667 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01668 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01669 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01670 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01671 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01672 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01673 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01674 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01675 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01676 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01677 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01678 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01679 };
01680 
01681 const byte CPLOT_LARGEFONT_lessthan[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
01682 {
01683 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01684 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01685 { 0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
01686 { 0,0,0,0,1,1,1,0,0,0,0,0,0,0 },
01687 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01688 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01689 { 1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
01690 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01691 { 0,0,0,0,1,1,1,0,0,0,0,0,0,0 },
01692 { 0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
01693 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01694 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01695 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01696 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01697 };
01698 
01699 const byte CPLOT_LARGEFONT_morethan[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
01700 {
01701 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01702 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01703 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01704 { 1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01705 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01706 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
01707 { 0,0,0,1,1,1,1,0,0,0,0,0,0,0 },
01708 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01709 { 1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01710 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01711 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01712 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01713 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01714 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01715 };
01716 
01717 
01718 const byte CPLOT_LARGEFONT_questionmark[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //9
01719 {
01720 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01721 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01722 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01723 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01724 { 0,0,0,0,1,1,1,0,0,0,0,0,0,0 },
01725 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
01726 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01727 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01728 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01729 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01730 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01731 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01732 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01733 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01734 };
01735 
01736 
01737 
01738 const byte CPLOT_LARGEFONT_One[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //7
01739 {
01740 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01741 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01742 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01743 { 1,1,0,1,1,0,0,0,0,0,0,0,0,0 },
01744 { 1,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01745 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01746 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01747 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01748 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01749 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01750 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01751 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01752 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01753 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01754 };
01755 
01756 const byte CPLOT_LARGEFONT_Two[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01757 {
01758 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01759 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01760 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01761 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01762 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01763 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
01764 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01765 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01766 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01767 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01768 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01769 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01770 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01771 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01772 };
01773 
01774 const byte CPLOT_LARGEFONT_Three[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01775 {
01776 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01777 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01778 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01779 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01780 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
01781 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
01782 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01783 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01784 { 1,1,1,0,0,1,1,0,0,0,0,0,0,0 },
01785 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01786 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01787 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01788 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01789 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01790 };
01791 
01792 const byte CPLOT_LARGEFONT_Four[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01793 {
01794 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
01795 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
01796 { 0,0,0,1,1,1,0,0,0,0,0,0,0,0 },
01797 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01798 { 0,0,1,0,1,1,0,0,0,0,0,0,0,0 },
01799 { 0,1,1,0,1,1,0,0,0,0,0,0,0,0 },
01800 { 1,1,0,0,1,1,0,0,0,0,0,0,0,0 },
01801 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01802 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01803 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
01804 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
01805 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01806 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01807 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01808 };
01809 
01810 const byte CPLOT_LARGEFONT_Five[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01811 {
01812 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01813 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01814 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01815 { 1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
01816 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01817 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01818 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01819 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01820 { 1,1,1,0,0,1,1,0,0,0,0,0,0,0 },
01821 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01822 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01823 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01824 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01825 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01826 };
01827 
01828 const byte CPLOT_LARGEFONT_Six[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01829 {
01830 { 0,0,1,1,1,1,0,0,0,0,0,0,0,0 },
01831 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01832 { 1,1,1,0,0,1,1,0,0,0,0,0,0,0 },
01833 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
01834 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01835 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01836 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01837 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01838 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01839 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01840 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01841 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01842 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01843 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01844 };
01845 
01846 const byte CPLOT_LARGEFONT_Seven[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01847 {
01848 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01849 { 1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01850 { 0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
01851 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01852 { 0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
01853 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01854 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01855 { 0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
01856 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01857 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01858 { 0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
01859 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01860 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01861 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01862 };
01863 
01864 const byte CPLOT_LARGEFONT_Eight[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01865 {
01866 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01867 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01868 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01869 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01870 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01871 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01872 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01873 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01874 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01875 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01876 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01877 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01878 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01879 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01880 };
01881 
01882 const byte CPLOT_LARGEFONT_Nine[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01883 {
01884 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01885 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01886 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01887 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01888 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01889 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01890 { 0,1,1,1,1,1,1,0,0,0,0,0,0,0 },
01891 { 0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
01892 { 1,1,0,0,1,1,1,0,0,0,0,0,0,0 },
01893 { 1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01894 { 0,1,1,1,1,0,0,0,0,0,0,0,0,0 },   
01895 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01896 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01897 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01898 };
01899 
01900 const byte CPLOT_LARGEFONT_Zero[CPLOT_LARGEFONT][CPLOT_LARGEFONT] = //8
01901 {
01902 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },
01903 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01904 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
01905 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01906 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01907 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01908 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01909 { 1,1,0,0,0,1,1,0,0,0,0,0,0,0 },
01910 { 1,1,1,0,1,1,1,0,0,0,0,0,0,0 },
01911 { 0,1,1,1,1,1,0,0,0,0,0,0,0,0 },
01912 { 0,0,1,1,1,0,0,0,0,0,0,0,0,0 },   
01913 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01914 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01915 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
01916 };
01917 
01918 
01919 const byte CPLOT_SMALLFONT_A[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01920 {{ 0,0,1,0,0,0 },
01921  { 0,0,1,0,0,0 },
01922  { 0,1,0,1,0,0 },
01923  { 0,1,0,1,0,0 },
01924  { 0,1,1,1,0,0 },
01925  { 1,0,0,0,1,0 },
01926  { 1,0,0,0,1,0 },};
01927 
01928 const byte CPLOT_SMALLFONT_B[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01929 {{ 1,1,1,1,0,0 },
01930  { 1,0,0,0,1,0 },
01931  { 1,0,0,0,1,0 },
01932  { 1,1,1,1,0,0 },
01933  { 1,0,0,0,1,0 },
01934  { 1,0,0,0,1,0 },
01935  { 1,1,1,1,0,0 },};
01936 
01937 const byte CPLOT_SMALLFONT_C[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01938 {{ 0,1,1,1,0,0 },
01939  { 1,0,0,0,1,0 },
01940  { 1,0,0,0,0,0 },
01941  { 1,0,0,0,0,0 },
01942  { 1,0,0,0,0,0 },
01943  { 1,0,0,0,1,0 },
01944  { 0,1,1,1,0,0 },};
01945 
01946 const byte CPLOT_SMALLFONT_D[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01947 {{ 1,1,1,1,0,0 },
01948  { 1,0,0,0,1,0 },
01949  { 1,0,0,0,1,0 },
01950  { 1,0,0,0,1,0 },
01951  { 1,0,0,0,1,0 },
01952  { 1,0,0,0,1,0 },
01953  { 1,1,1,1,0,0 },};
01954 
01955 const byte CPLOT_SMALLFONT_E[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01956 {{ 1,1,1,1,1,0 },
01957  { 1,0,0,0,0,0 },
01958  { 1,0,0,0,0,0 },
01959  { 1,1,1,1,0,0 },
01960  { 1,0,0,0,0,0 },
01961  { 1,0,0,0,0,0 },
01962  { 1,1,1,1,1,0 },};
01963 
01964 const byte CPLOT_SMALLFONT_F[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01965 {{ 1,1,1,1,1,0 },
01966  { 1,0,0,0,0,0 },
01967  { 1,0,0,0,0,0 },
01968  { 1,1,1,1,0,0 },
01969  { 1,0,0,0,0,0 },
01970  { 1,0,0,0,0,0 },
01971  { 1,0,0,0,0,0 },};
01972 
01973 const byte CPLOT_SMALLFONT_G[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01974 {{ 0,1,1,1,0,0 },
01975  { 1,0,0,0,1,0 },
01976  { 1,0,0,0,0,0 },
01977  { 1,0,1,1,1,0 },
01978  { 1,0,0,0,1,0 },
01979  { 1,0,0,0,1,0 },
01980  { 0,1,1,1,0,0 },};
01981 
01982 const byte CPLOT_SMALLFONT_H[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01983 {{ 1,0,0,0,1,0 },
01984  { 1,0,0,0,1,0 },
01985  { 1,0,0,0,1,0 },
01986  { 1,1,1,1,1,0 },
01987  { 1,0,0,0,1,0 },
01988  { 1,0,0,0,1,0 },
01989  { 1,0,0,0,1,0 },};
01990 
01991 
01992 const byte CPLOT_SMALLFONT_I[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
01993 {{ 1,1,1,1,1,0 },
01994  { 0,0,1,0,0,0 },
01995  { 0,0,1,0,0,0 },
01996  { 0,0,1,0,0,0 },
01997  { 0,0,1,0,0,0 },
01998  { 0,0,1,0,0,0 },
01999  { 1,1,1,1,1,0 },};
02000 
02001 const byte CPLOT_SMALLFONT_J[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02002 {{ 0,1,1,1,1,0 },
02003  { 0,0,0,1,0,0 },
02004  { 0,0,0,1,0,0 },
02005  { 0,0,0,1,0,0 },
02006  { 0,0,0,1,0,0 },
02007  { 1,0,0,1,0,0 },
02008  { 0,1,1,0,0,0 },};
02009 
02010 const byte CPLOT_SMALLFONT_K[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02011 {{ 1,0,0,1,0,0 },
02012  { 1,0,0,1,0,0 },
02013  { 1,0,1,0,0,0 },
02014  { 1,1,0,0,0,0 },
02015  { 1,1,0,0,0,0 },
02016  { 1,0,1,0,0,0 },
02017  { 1,0,0,1,0,0 },};
02018 
02019 const byte CPLOT_SMALLFONT_L[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02020 {{ 1,0,0,0,0,0 },
02021  { 1,0,0,0,0,0 },
02022  { 1,0,0,0,0,0 },
02023  { 1,0,0,0,0,0 },
02024  { 1,0,0,0,0,0 },
02025  { 1,0,0,0,0,0 },
02026  { 1,1,1,1,1,0 },};
02027 
02028 const byte CPLOT_SMALLFONT_M[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02029 {{ 1,0,0,0,1,0 },
02030  { 1,1,0,1,1,0 },
02031  { 1,0,1,0,1,0 },
02032  { 1,0,1,0,1,0 },
02033  { 1,0,0,0,1,0 },
02034  { 1,0,0,0,1,0 },
02035  { 1,0,0,0,1,0 },};
02036 
02037 const byte CPLOT_SMALLFONT_N[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02038 {{ 1,0,0,0,1,0 },
02039  { 1,1,0,0,1,0 },
02040  { 1,1,1,0,1,0 },
02041  { 1,0,1,0,1,0 },
02042  { 1,0,0,1,1,0 },
02043  { 1,0,0,1,1,0 },
02044  { 1,0,0,0,1,0 },};
02045 
02046 const byte CPLOT_SMALLFONT_O[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02047 {{ 0,1,1,1,0,0 },
02048  { 1,0,0,0,1,0 },
02049  { 1,0,0,0,1,0 },
02050  { 1,0,0,0,1,0 },
02051  { 1,0,0,0,1,0 },
02052  { 1,0,0,0,1,0 },
02053  { 0,1,1,1,0,0 },};
02054 
02055 const byte CPLOT_SMALLFONT_P[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02056 {{ 1,1,1,1,0,0 },
02057  { 1,0,0,0,1,0 },
02058  { 1,0,0,0,1,0 },
02059  { 1,1,1,1,0,0 },
02060  { 1,0,0,0,0,0 },
02061  { 1,0,0,0,0,0 },
02062  { 1,0,0,0,0,0 },};
02063 
02064 const byte CPLOT_SMALLFONT_Q[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02065 {{ 0,1,1,1,0,0 },
02066  { 1,0,0,0,1,0 },
02067  { 1,0,0,0,1,0 },
02068  { 1,0,0,0,1,0 },
02069  { 1,0,1,0,1,0 },
02070  { 1,0,0,1,0,0 },
02071  { 0,1,1,0,1,0 },};
02072 
02073 const byte CPLOT_SMALLFONT_R[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02074 {{ 1,1,1,0,0,0 },
02075  { 1,0,0,1,0,0 },
02076  { 1,0,0,1,0,0 },
02077  { 1,1,1,0,0,0 },
02078  { 1,0,1,0,0,0 },
02079  { 1,0,0,1,0,0 },
02080  { 1,0,0,1,0,0 },};
02081 
02082 const byte CPLOT_SMALLFONT_S[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02083 {{ 0,1,1,1,0,0 },
02084  { 1,0,0,0,1,0 },
02085  { 1,0,0,0,0,0 },
02086  { 0,1,1,1,0,0 },
02087  { 0,0,0,0,1,0 },
02088  { 1,0,0,0,1,0 },
02089  { 0,1,1,1,0,0 },};
02090 
02091 const byte CPLOT_SMALLFONT_T[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02092 {{ 1,1,1,1,1,0 },
02093  { 0,0,1,0,0,0 },
02094  { 0,0,1,0,0,0 },
02095  { 0,0,1,0,0,0 },
02096  { 0,0,1,0,0,0 },
02097  { 0,0,1,0,0,0 },
02098  { 0,0,1,0,0,0 },};
02099 
02100 const byte CPLOT_SMALLFONT_U[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02101 {{ 1,0,0,0,1,0 },
02102  { 1,0,0,0,1,0 },
02103  { 1,0,0,0,1,0 },
02104  { 1,0,0,0,1,0 },
02105  { 1,0,0,0,1,0 },
02106  { 1,0,0,0,1,0 },
02107  { 0,1,1,1,0,0 },};
02108 
02109 const byte CPLOT_SMALLFONT_V[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02110 {{ 1,0,0,0,1,0 },
02111  { 1,0,0,0,1,0 },
02112  { 1,0,0,0,1,0 },
02113  { 0,1,0,1,0,0 },
02114  { 0,1,0,1,0,0 },
02115  { 0,0,1,0,0,0 },
02116  { 0,0,1,0,0,0 },};
02117 
02118 const byte CPLOT_SMALLFONT_W[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02119 {{ 1,0,0,0,1,0 },
02120  { 1,0,0,0,1,0 },
02121  { 1,0,0,0,1,0 },
02122  { 1,0,1,0,1,0 },
02123  { 1,0,1,0,1,0 },
02124  { 1,0,1,0,1,0 },
02125  { 0,1,0,1,0,0 },};
02126 
02127 const byte CPLOT_SMALLFONT_X[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02128 {{ 1,0,0,0,1,0 },
02129  { 0,1,0,1,0,0 },
02130  { 0,1,0,1,0,0 },
02131  { 0,0,1,0,0,0 },
02132  { 0,1,0,1,0,0 },
02133  { 0,1,0,1,0,0 },
02134  { 1,0,0,0,1,0 },};
02135 
02136 const byte CPLOT_SMALLFONT_Y[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02137 {{ 1,0,0,0,1,0 },
02138  { 0,1,0,1,0,0 },
02139  { 0,1,0,1,0,0 },
02140  { 0,0,1,0,0,0 },
02141  { 0,0,1,0,0,0 },
02142  { 0,0,1,0,0,0 },
02143  { 0,0,1,0,0,0 },};
02144 
02145 const byte CPLOT_SMALLFONT_Z[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02146 {{ 1,1,1,1,1,0 },
02147  { 0,0,0,1,0,0 },
02148  { 0,0,0,1,0,0 },
02149  { 0,0,1,0,0,0 },
02150  { 0,1,0,0,0,0 },
02151  { 0,1,0,0,0,0 },
02152  { 1,1,1,1,1,0 },};
02153 
02154 const byte CPLOT_SMALLFONT_a[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02155 {{ 0,0,0,0,0,0 },
02156  { 0,0,0,0,0,0 },
02157  { 0,1,1,1,1,0 },
02158  { 0,0,0,0,1,0 },
02159  { 0,1,1,1,1,0 },
02160  { 1,0,0,0,1,0 },
02161  { 0,1,1,1,1,0 },};
02162 
02163 const byte CPLOT_SMALLFONT_b[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02164 {{ 1,0,0,0,0,0 },
02165  { 1,0,0,0,0,0 },
02166  { 1,0,0,0,0,0 },
02167  { 1,1,1,1,0,0 },
02168  { 1,0,0,0,1,0 },
02169  { 1,0,0,0,1,0 },
02170  { 1,1,1,1,0,0 },};
02171 
02172 const byte CPLOT_SMALLFONT_c[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02173 {{ 0,0,0,0,0,0 },
02174  { 0,0,0,0,0,0 },
02175  { 0,1,1,1,0,0 },
02176  { 1,0,0,0,1,0 },
02177  { 1,0,0,0,0,0 },
02178  { 1,0,0,0,1,0 },
02179  { 0,1,1,1,0,0 },};
02180 
02181 const byte CPLOT_SMALLFONT_d[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02182 {{ 0,0,0,0,1,0 },
02183  { 0,0,0,0,1,0 },
02184  { 0,0,0,0,1,0 },
02185  { 0,1,1,1,1,0 },
02186  { 1,0,0,0,1,0 },
02187  { 1,0,0,0,1,0 },
02188  { 0,1,1,1,1,0 },};
02189 
02190 const byte CPLOT_SMALLFONT_e[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02191 {{ 0,0,0,0,0,0 },
02192  { 0,0,0,0,0,0 },
02193  { 0,1,1,1,0,0 },
02194  { 1,0,0,0,1,0 },
02195  { 1,1,1,1,0,0 },
02196  { 1,0,0,0,0,0 },
02197  { 0,1,1,1,0,0 },};
02198 
02199 const byte CPLOT_SMALLFONT_f[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02200 {{ 0,0,1,0,0,0 },
02201  { 0,1,0,0,0,0 },
02202  { 0,1,0,0,0,0 },
02203  { 1,1,1,1,0,0 },
02204  { 0,1,0,0,0,0 },
02205  { 0,1,0,0,0,0 },
02206  { 0,1,0,0,0,0 },};
02207 
02208 const byte CPLOT_SMALLFONT_g[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02209 {{ 0,0,0,0,0,0 },
02210  { 0,0,0,0,0,0 },
02211  { 0,0,1,1,1,0 },
02212  { 0,1,0,0,1,0 },
02213  { 0,1,1,1,1,0 },
02214  { 0,0,0,0,1,0 },
02215  { 0,0,1,1,0,0 },};
02216 
02217 const byte CPLOT_SMALLFONT_h[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02218 {{ 1,0,0,0,0,0 },
02219  { 1,0,0,0,0,0 },
02220  { 1,0,0,0,0,0 },
02221  { 1,1,1,1,0,0 },
02222  { 1,0,0,0,1,0 },
02223  { 1,0,0,0,1,0 },
02224  { 1,0,0,0,1,0 },};
02225 
02226 const byte CPLOT_SMALLFONT_i[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02227 {{ 0,0,0,0,0,0 },
02228  { 0,0,1,0,0,0 },
02229  { 0,0,0,0,0,0 },
02230  { 0,0,1,0,0,0 },
02231  { 0,0,1,0,0,0 },
02232  { 0,0,1,0,0,0 },
02233  { 0,0,1,0,0,0 },};
02234 
02235 const byte CPLOT_SMALLFONT_j[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02236 {{ 0,0,0,0,0,0 },
02237  { 0,0,1,0,0,0 },
02238  { 0,0,0,0,0,0 },
02239  { 0,0,1,0,0,0 },
02240  { 0,0,1,0,0,0 },
02241  { 1,0,1,0,0,0 },
02242  { 0,1,0,0,0,0 },};
02243 
02244 const byte CPLOT_SMALLFONT_k[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02245 {{ 0,0,0,0,0,0 },
02246  { 1,0,0,0,0,0 },
02247  { 1,0,0,0,0,0 },
02248  { 1,0,1,0,0,0 },
02249  { 1,1,0,0,0,0 },
02250  { 1,1,0,0,0,0 },
02251  { 1,0,1,1,0,0 },};
02252 
02253 const byte CPLOT_SMALLFONT_l[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02254 {{ 0,0,1,0,0,0 },
02255  { 0,0,1,0,0,0 },
02256  { 0,0,1,0,0,0 },
02257  { 0,0,1,0,0,0 },
02258  { 0,0,1,0,0,0 },
02259  { 0,0,1,0,0,0 },
02260  { 0,0,1,0,0,0 },};
02261 
02262 const byte CPLOT_SMALLFONT_m[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02263 {{ 0,0,0,0,0,0 },
02264  { 0,0,0,0,0,0 },
02265  { 1,1,1,1,0,0 },
02266  { 1,0,1,0,1,0 },
02267  { 1,0,1,0,1,0 },
02268  { 1,0,1,0,1,0 },
02269  { 1,0,1,0,1,0 },};
02270 
02271 const byte CPLOT_SMALLFONT_n[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02272 {{ 0,0,0,0,0,0 },
02273  { 0,0,0,0,0,0 },
02274  { 1,1,1,1,0,0 },
02275  { 1,0,0,0,1,0 },
02276  { 1,0,0,0,1,0 },
02277  { 1,0,0,0,1,0 },
02278  { 1,0,0,0,1,0 },};
02279 
02280 const byte CPLOT_SMALLFONT_o[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02281 {{ 0,0,0,0,0,0 },
02282  { 0,0,0,0,0,0 },
02283  { 0,1,1,1,0,0 },
02284  { 1,0,0,0,1,0 },
02285  { 1,0,0,0,1,0 },
02286  { 1,0,0,0,1,0 },
02287  { 0,1,1,1,0,0 },};
02288 
02289 const byte CPLOT_SMALLFONT_p[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02290 {{ 0,0,0,0,0,0 },
02291  { 1,1,1,0,0,0 },
02292  { 1,0,0,1,0,0 },
02293  { 1,0,0,1,0,0 },
02294  { 1,1,1,0,0,0 },
02295  { 1,0,0,0,0,0 },
02296  { 1,0,0,0,0,0 },};
02297 
02298 const byte CPLOT_SMALLFONT_q[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02299 {{ 0,0,0,0,0,0 },
02300  { 0,0,1,1,1,0 },
02301  { 0,1,0,0,1,0 },
02302  { 0,1,0,0,1,0 },
02303  { 0,0,1,1,1,0 },
02304  { 0,0,0,0,1,0 },
02305  { 0,0,0,0,1,0 },};
02306 
02307 const byte CPLOT_SMALLFONT_r[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02308 {{ 0,0,0,0,0,0 },
02309  { 0,0,0,0,0,0 },
02310  { 1,0,1,1,0,0 },
02311  { 0,1,0,0,0,0 },
02312  { 0,1,0,0,0,0 },
02313  { 0,1,0,0,0,0 },
02314  { 0,1,0,0,0,0 },};
02315 
02316 const byte CPLOT_SMALLFONT_s[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02317 {{ 0,0,0,0,0,0 },
02318  { 0,0,0,0,0,0 },
02319  { 0,0,1,1,1,0 },
02320  { 0,1,0,0,0,0 },
02321  { 0,1,1,1,1,0 },
02322  { 0,0,0,0,1,0 },
02323  { 0,1,1,1,0,0 },};
02324 
02325 const byte CPLOT_SMALLFONT_t[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02326 {{ 0,0,1,0,0,0 },
02327  { 0,0,1,0,0,0 },
02328  { 1,1,1,1,1,0 },
02329  { 0,0,1,0,0,0 },
02330  { 0,0,1,0,0,0 },
02331  { 0,0,1,0,0,0 },
02332  { 0,0,1,0,0,0 },};
02333 
02334 const byte CPLOT_SMALLFONT_u[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02335 {{ 0,0,0,0,0,0 },
02336  { 0,0,0,0,0,0 },
02337  { 1,0,0,0,1,0 },
02338  { 1,0,0,0,1,0 },
02339  { 1,0,0,0,1,0 },
02340  { 1,0,0,0,1,0 },
02341  { 0,1,1,1,0,0 },};
02342 
02343 const byte CPLOT_SMALLFONT_v[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02344 {{ 0,0,0,0,0,0 },
02345  { 0,0,0,0,0,0 },
02346  { 0,0,0,0,0,0 },
02347  { 1,0,0,0,1,0 },
02348  { 1,0,0,0,1,0 },
02349  { 0,1,0,1,0,0 },
02350  { 0,0,1,0,0,0 },};
02351 
02352 const byte CPLOT_SMALLFONT_w[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02353 {{ 0,0,0,0,0,0 },
02354  { 0,0,0,0,0,0 },
02355  { 0,0,0,0,0,0 },
02356  { 1,0,1,0,1,0 },
02357  { 1,0,1,0,1,0 },
02358  { 1,0,1,0,1,0 },
02359  { 0,1,0,1,0,0 },};
02360 
02361 const byte CPLOT_SMALLFONT_x[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02362 {{ 0,0,0,0,0,0 },
02363  { 0,0,0,0,0,0 },
02364  { 1,0,0,0,1,0 },
02365  { 0,1,0,1,0,0 },
02366  { 0,0,1,0,0,0 },
02367  { 0,1,0,1,0,0 },
02368  { 1,0,0,0,1,0 },};
02369 
02370 const byte CPLOT_SMALLFONT_y[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02371 {{ 0,0,0,0,0,0 },
02372  { 0,0,0,0,0,0 },
02373  { 1,0,0,0,1,0 },
02374  { 0,1,0,1,0,0 },
02375  { 0,0,1,0,0,0 },
02376  { 0,1,0,0,0,0 },
02377  { 1,0,0,0,0,0 },};
02378 
02379 const byte CPLOT_SMALLFONT_z[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02380 {{ 0,0,0,0,0,0 },
02381  { 0,0,0,0,0,0 },
02382  { 0,0,0,0,0,0 },
02383  { 1,1,1,1,0,0 },
02384  { 0,0,1,0,0,0 },
02385  { 0,1,0,0,0,0 },
02386  { 1,1,1,1,1,0 },};
02387 
02388 const byte CPLOT_SMALLFONT_colon[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02389 {{ 0,0,0,0,0,0 },
02390  { 0,0,1,1,0,0 },
02391  { 0,0,1,1,0,0 },
02392  { 0,0,0,0,0,0 },
02393  { 0,0,0,0,0,0 },
02394  { 0,0,1,1,0,0 },
02395  { 0,0,1,1,0,0 },};
02396 
02397 const byte CPLOT_SMALLFONT_backslash[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02398 {{ 1,0,0,0,0,0 },
02399  { 0,1,0,0,0,0 },
02400  { 0,0,1,0,0,0 },
02401  { 0,0,1,0,0,0 },
02402  { 0,0,0,1,0,0 },
02403  { 0,0,0,0,1,0 },
02404  { 0,0,0,0,0,1 },};
02405 
02406 const byte CPLOT_SMALLFONT_forwardslash[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02407 {{ 0,0,0,0,0,1 },
02408  { 0,0,0,0,1,0 },
02409  { 0,0,0,1,0,0 },
02410  { 0,0,1,0,0,0 },
02411  { 0,1,1,0,0,0 },
02412  { 0,1,0,0,0,0 },
02413  { 1,0,0,0,0,0 },};
02414 
02415 const byte CPLOT_SMALLFONT_percent[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02416 {{ 0,0,0,0,0,0 },
02417  { 1,1,0,0,1,0 },
02418  { 1,1,0,0,1,0 },
02419  { 0,0,0,1,0,0 },
02420  { 0,0,1,0,0,0 },
02421  { 0,1,0,1,1,0 },
02422  { 1,0,0,1,1,0 },};
02423 
02424 const byte CPLOT_SMALLFONT_raiseto[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02425 {{ 0,0,1,0,0,0 },
02426  { 0,1,0,1,0,0 },
02427  { 1,0,0,0,1,0 },
02428  { 0,0,0,0,0,0 },
02429  { 0,0,0,0,0,0 },
02430  { 0,0,0,0,0,0 },
02431  { 0,0,0,0,0,0 },};
02432 
02433 const byte CPLOT_SMALLFONT_dollarsign[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02434 {{ 0,1,1,1,0,0 },
02435  { 1,0,1,0,1,0 },
02436  { 1,0,1,0,0,0 },
02437  { 0,1,1,1,0,0 },
02438  { 0,0,1,0,1,0 },
02439  { 1,0,1,0,1,0 },
02440  { 0,1,1,1,0,0 },};
02441 
02442 const byte CPLOT_SMALLFONT_andsign[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02443 {{ 0,1,1,0,0,0 },
02444  { 1,0,0,1,0,0 },
02445  { 1,0,0,1,0,0 },
02446  { 0,1,1,0,0,0 },
02447  { 1,0,1,0,1,0 },
02448  { 1,0,0,1,0,0 },
02449  { 0,1,1,0,1,0 },};
02450 
02451 const byte CPLOT_SMALLFONT_star[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02452 {{ 0,0,0,0,0,0 },
02453  { 1,0,1,0,1,0 },
02454  { 0,1,1,1,0,0 },
02455  { 0,0,1,0,0,0 },
02456  { 0,1,0,1,0,0 },
02457  { 1,0,0,0,1,0 },
02458  { 0,0,0,0,0,0 },};
02459 
02460 const byte CPLOT_SMALLFONT_leftbracket[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02461 {{ 0,0,1,0,0,0 },
02462  { 0,1,0,0,0,0 },
02463  { 1,0,0,0,0,0 },
02464  { 1,0,0,0,0,0 },
02465  { 1,0,0,0,0,0 },
02466  { 0,1,0,0,0,0 },
02467  { 0,0,1,0,0,0 },};
02468 
02469 const byte CPLOT_SMALLFONT_rightbracket[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02470 {{ 0,0,1,0,0,0 },
02471  { 0,0,0,1,0,0 },
02472  { 0,0,0,0,1,0 },
02473  { 0,0,0,0,1,0 },
02474  { 0,0,0,0,1,0 },
02475  { 0,0,0,1,0,0 },
02476  { 0,0,1,0,0,0 },};
02477 
02478 const byte CPLOT_SMALLFONT_leftsquare[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02479 {{ 1,1,1,0,0,0 },
02480  { 1,0,0,0,0,0 },
02481  { 1,0,0,0,0,0 },
02482  { 1,0,0,0,0,0 },
02483  { 1,0,0,0,0,0 },
02484  { 1,0,0,0,0,0 },
02485  { 1,1,1,0,0,0 },};
02486 
02487 const byte CPLOT_SMALLFONT_rightsquare[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02488 {{ 0,0,1,1,1,0 },
02489  { 0,0,0,0,1,0 },
02490  { 0,0,0,0,1,0 },
02491  { 0,0,0,0,1,0 },
02492  { 0,0,0,0,1,0 },
02493  { 0,0,0,0,1,0 },
02494  { 0,0,1,1,1,0 },};
02495 
02496 const byte CPLOT_SMALLFONT_dash[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02497 {{ 0,0,0,0,0,0 },
02498  { 0,0,0,0,0,0 },
02499  { 0,0,0,0,0,0 },
02500  { 1,1,1,1,1,0 },
02501  { 0,0,0,0,0,0 },
02502  { 0,0,0,0,0,0 },
02503  { 0,0,0,0,0,0 },};
02504 
02505 const byte CPLOT_SMALLFONT_equals[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02506 {{ 0,0,0,0,0,0 },
02507  { 0,0,0,0,0,0 },
02508  { 1,1,1,1,1,0 },
02509  { 0,0,0,0,0,0 },
02510  { 0,0,0,0,0,0 },
02511  { 1,1,1,1,1,0 },
02512  { 0,0,0,0,0,0 },};
02513 
02514 const byte CPLOT_SMALLFONT_plus[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02515 {{ 0,0,1,0,0,0 },
02516  { 0,0,1,0,0,0 },
02517  { 0,0,1,0,0,0 },
02518  { 1,1,1,1,1,0 },
02519  { 0,0,1,0,0,0 },
02520  { 0,0,1,0,0,0 },
02521  { 0,0,1,0,0,0 },};
02522 
02523 const byte CPLOT_SMALLFONT_semicolon[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =   
02524 {{ 0,0,0,0,0,0 },
02525  { 0,1,1,0,0,0 },
02526  { 0,1,1,0,0,0 },
02527  { 0,0,0,0,0,0 },
02528  { 0,0,1,0,0,0 },
02529  { 0,1,0,0,0,0 },
02530  { 1,0,0,0,0,0 },};
02531 
02532 const byte CPLOT_SMALLFONT_singlequote[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02533 {{ 0,0,1,0,0,0 },
02534  { 0,0,1,0,0,0 },
02535  { 0,0,1,0,0,0 },
02536  { 0,0,0,0,0,0 },
02537  { 0,0,0,0,0,0 },
02538  { 0,0,0,0,0,0 },
02539  { 0,0,0,0,0,0 },};
02540 
02541 const byte CPLOT_SMALLFONT_doublequote[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02542 {{ 0,1,0,1,0,0 },
02543  { 0,1,0,1,0,0 },
02544  { 0,1,0,1,0,0 },
02545  { 0,0,0,0,0,0 },
02546  { 0,0,0,0,0,0 },
02547 
02548  { 0,0,0,0,0,0 },
02549  { 0,0,0,0,0,0 },};
02550 
02551 const byte CPLOT_SMALLFONT_lessthan[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02552 {{ 0,0,0,0,1,0 },
02553  { 0,0,0,1,0,0 },
02554  { 0,0,1,0,0,0 },
02555  { 0,1,0,0,0,0 },
02556  { 0,0,1,0,0,0 },
02557  { 0,0,0,1,0,0 },
02558  { 0,0,0,0,1,0 },};
02559 
02560 const byte CPLOT_SMALLFONT_morethan[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02561 {{ 1,0,0,0,0,0 },
02562  { 0,1,0,0,0,0 },
02563  { 0,0,1,0,0,0 },
02564  { 0,0,0,1,0,0 },
02565  { 0,0,1,0,0,0 },
02566  { 0,1,0,0,0,0 },
02567  { 1,0,0,0,0,0 },};
02568 
02569 const byte CPLOT_SMALLFONT_comma[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02570 {{ 0,0,0,0,0,0 },
02571  { 0,0,0,0,0,0 },
02572  { 0,0,0,0,0,0 },
02573  { 0,0,0,0,0,0 },
02574  { 0,0,1,0,0,0 },
02575  { 0,1,0,0,0,0 },
02576  { 1,0,0,0,0,0 },};
02577 
02578 const byte CPLOT_SMALLFONT_point[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02579 {{ 0,0,0,0,0,0 },
02580  { 0,0,0,0,0,0 },
02581  { 0,0,0,0,0,0 },
02582  { 0,0,0,0,0,0 },
02583  { 0,0,0,0,0,0 },
02584  { 0,0,1,1,0,0 },
02585  { 0,0,1,1,0,0 },};
02586 
02587 const byte CPLOT_SMALLFONT_exclamation[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02588 {{ 0,0,1,1,0,0 },
02589  { 0,0,1,1,0,0 },
02590  { 0,0,1,1,0,0 },
02591  { 0,0,1,1,0,0 },
02592  { 0,0,0,0,0,0 },
02593  { 0,0,1,1,0,0 },
02594  { 0,0,1,1,0,0 },};
02595 
02596 
02597 const byte CPLOT_SMALLFONT_vert[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02598 {{ 0,0,1,0,0,0 },
02599  { 0,0,1,0,0,0 },
02600  { 0,0,1,0,0,0 },
02601  { 0,0,1,0,0,0 },
02602  { 0,0,1,0,0,0 },
02603  { 0,0,1,0,0,0 },
02604  { 0,0,1,0,0,0 },};
02605 
02606 const byte CPLOT_SMALLFONT_tilda[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02607 {{ 0,0,0,0,0,0 },
02608  { 0,0,0,0,0,0 },
02609  { 0,1,1,0,0,0 },
02610  { 1,0,1,0,1,0 },
02611  { 0,0,0,1,1,0 },
02612  { 0,0,0,0,0,0 },
02613  { 0,0,0,0,0,0 },};
02614 
02615 
02616 const byte CPLOT_SMALLFONT_Zero[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02617 {{ 0,1,1,1,0,0 },
02618 { 1,0,0,0,1,0 },
02619 { 1,0,0,1,1,0 },
02620 { 1,0,1,0,1,0 },
02621 { 1,1,0,0,1,0 },
02622 { 1,0,0,0,1,0 },
02623 { 0,1,1,1,0,0 }};
02624 
02625 const byte CPLOT_SMALLFONT_One[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02626 {{ 0,0,1,0,0,0 },
02627 { 0,1,1,0,0,0 },
02628 { 0,0,1,0,0,0 },
02629 { 0,0,1,0,0,0 },
02630 { 0,0,1,0,0,0 },
02631 { 0,0,1,0,0,0 },
02632 { 0,1,1,1,0,0 }};
02633 
02634 const byte CPLOT_SMALLFONT_Two[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02635 {{ 0,1,1,1,0,0 },
02636 { 1,0,0,0,1,0 },
02637 { 0,0,0,0,1,0 },
02638 { 0,0,0,1,0,0 },
02639 { 0,0,1,0,0,0 },
02640 { 0,1,0,0,0,0 },
02641 { 1,1,1,1,1,0 }};
02642 
02643 const byte CPLOT_SMALLFONT_Three[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02644 {{ 1,1,1,1,1,0 },
02645 { 0,0,0,1,0,0 },
02646 { 0,0,1,0,0,0 },
02647 { 0,0,0,1,0,0 },
02648 { 0,0,0,0,1,0 },
02649 { 1,0,0,0,1,0 },
02650 { 0,1,1,1,0,0 }};
02651 
02652 const byte CPLOT_SMALLFONT_Four[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02653 {{ 0,0,0,1,0,0 },
02654 { 0,0,1,1,0,0 },
02655 { 0,1,0,1,0,0 },
02656 { 1,0,0,1,0,0 },
02657 { 1,1,1,1,1,0 },
02658 { 0,0,0,1,0,0 },
02659 { 0,0,0,1,0,0 }};
02660 
02661 const byte CPLOT_SMALLFONT_Five[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02662 {{ 1,1,1,1,1,0 },
02663 { 1,0,0,0,0,0 },
02664 { 1,1,1,1,0,0 },
02665 { 0,0,0,0,1,0 },
02666 { 0,0,0,0,1,0 },
02667 { 1,0,0,0,1,0 },
02668 { 0,1,1,1,0,0 }};
02669 
02670 const byte CPLOT_SMALLFONT_Six[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] = 
02671 {{ 0,0,1,1,0,0 },
02672 { 0,1,0,0,0,0 },
02673 { 1,0,0,0,0,0 },
02674 { 1,1,1,1,0,0 },
02675 { 1,0,0,0,1,0 },
02676 { 1,0,0,0,1,0 },
02677 { 0,1,1,1,0,0 }};
02678 
02679 const byte CPLOT_SMALLFONT_Seven[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02680 {{ 1,1,1,1,1,0 },
02681 { 0,0,0,0,1,0 },
02682 { 0,0,0,1,0,0 },
02683 { 0,0,1,0,0,0 },
02684 { 0,0,1,0,0,0 },
02685 { 0,0,1,0,0,0 },
02686 { 0,0,1,0,0,0 }};
02687 
02688 const byte CPLOT_SMALLFONT_Eight[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02689 {{ 0,1,1,1,0,0 },
02690 { 1,0,0,0,1,0 },
02691 { 1,0,0,0,1,0 },
02692 { 0,1,1,1,0,0 },
02693 { 1,0,0,0,1,0 },
02694 { 1,0,0,0,1,0 },
02695 { 0,1,1,1,0,0 }};
02696 
02697 const byte CPLOT_SMALLFONT_Nine[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH] =
02698 {{ 0,1,1,1,0,0 },
02699 { 1,0,0,0,1,0 },
02700 { 1,0,0,0,1,0 },
02701 { 0,1,1,1,1,0 },
02702 { 0,0,0,0,1,0 },
02703 { 0,0,0,1,0,0 },
02704 { 0,1,1,0,0,0 }};
02705 
02706 
02707 
02708 
02709 BOOL CPLOT_BYTE_MTX_Init( CPLOT_structByteMatrix *M )
02710 {
02711   if( !M )
02712     return FALSE;
02713 
02714   M->ncols = 0;
02715   M->nrows = 0;
02716   M->data = NULL;
02717   
02718   return TRUE;
02719 }
02720 
02721 BOOL CPLOT_BYTE_MTX_isNull( const CPLOT_structByteMatrix *M )
02722 {
02723   if( !M )
02724     return TRUE;
02725 
02726   if( M->data == NULL )
02727     return TRUE;
02728 
02729   return FALSE;
02730 }
02731 
02732 /// zero the entire matrix
02733 BOOL CPLOT_BYTE_MTX_Zero( CPLOT_structByteMatrix *dst )
02734 {
02735   unsigned i = 0;  
02736   
02737   if( CPLOT_BYTE_MTX_isNull( dst ) )  
02738     return FALSE;
02739 
02740   for( i = 0; i < dst->nrows; i++ )
02741   {    
02742 #ifdef INTEL_IPPS    
02743     if( ippsZero_8u( (Ipp8u*)(dst->data[i]), dst->ncols ) != ippStsNoErr )
02744       return FALSE;
02745 #else
02746     memset( &(dst->data[i]), 0, dst->ncols );
02747 #endif
02748   }
02749   return TRUE;
02750 }
02751 
02752 BOOL CPLOT_BYTE_MTX_Free( CPLOT_structByteMatrix *M )
02753 {
02754   unsigned i = 0;
02755 
02756   if( !M )
02757     return FALSE;
02758 
02759   if( M->data == NULL )  
02760   {
02761     M->nrows = 0;
02762     M->ncols = 0;
02763     return TRUE;
02764   } 
02765 
02766   // free the data
02767   for( i = 0; i < M->nrows; i++ )
02768   {
02769 #ifdef INTEL_IPPS
02770     ippsFree( M->data[i] );
02771 #else
02772     free( M->data[i] );
02773 #endif
02774   }
02775 
02776   // free the array of pointers
02777   free( M->data );
02778   
02779   M->nrows = 0;
02780   M->ncols = 0;   
02781   M->data = NULL;
02782   
02783   return TRUE;
02784 }
02785 
02786 
02787 BOOL CPLOT_BYTE_MTX_calloc( CPLOT_structByteMatrix *M, const unsigned nrows, const unsigned ncols )
02788 { 
02789   unsigned i = 0;
02790   
02791   // invalid call
02792   if( nrows == 0 || ncols == 0 ) 
02793     return FALSE;   
02794   if( !M )
02795     return FALSE;
02796 
02797   // Check if the matrix is already the right size and type.
02798   if( M->nrows > 0 && M->ncols > 0 )
02799   {
02800     if( M->nrows == nrows && M->ncols == ncols )
02801     {
02802       // already the right size and type
02803       if( !CPLOT_BYTE_MTX_Zero( M ) )
02804         return FALSE;
02805 
02806       return TRUE;
02807     }
02808   }
02809   
02810   // check if we still need to deallocate memory
02811   if( M->data != NULL )
02812   {
02813     // free the data
02814     if( !CPLOT_BYTE_MTX_Free( M ) )
02815       return FALSE;
02816   }
02817 
02818   M->nrows = 0;
02819   M->ncols = ncols;
02820 
02821   // allocate the column array
02822   M->data = (byte**)malloc( nrows*sizeof(byte*) );
02823   if( !M->data )
02824     return FALSE;
02825   
02826   // for each column allocate the rows
02827   for( i = 0; i < nrows; i++ )
02828   {
02829 #ifdef INTEL_IPPS  
02830     M->data[i] = ippsMalloc_8u( ncols );
02831     if( !(M->data[i]) )
02832     {
02833       // this is most likely to occur if allocating more memory than available
02834       CPLOT_BYTE_MTX_Free( M );
02835       return FALSE;
02836     }
02837     if( ippsZero_8u( (Ipp8u*)(M->data[i]), ncols ) != ippStsNoErr )
02838       return FALSE;
02839 #else
02840     M->data[i] = (byte*)calloc( ncols, sizeof(byte) );    
02841     if( !M->data[i] )
02842     {
02843       // this is most likely to occur if allocating more memory than available
02844       CPLOT_BYTE_MTX_Free( M );
02845       return FALSE;
02846     }
02847 #endif
02848     M->nrows++;
02849   }      
02850 
02851   return TRUE; 
02852 }
02853 
02854 /// fills the matrix with the given value
02855 BOOL CPLOT_BYTE_MTX_Fill( CPLOT_structByteMatrix *dst, const byte value )
02856 {
02857   unsigned i = 0;
02858   
02859   if( CPLOT_BYTE_MTX_isNull( dst ) )
02860     return FALSE;
02861 
02862   for( i = 0; i < dst->nrows; i++ )
02863   {
02864 #ifdef INTEL_IPPS        
02865     if( ippsSet_8u( (Ipp8u)(value), (Ipp8u*)(dst->data[i]), dst->ncols ) != ippStsNoErr )
02866       return FALSE;
02867 #else
02868     memset( dst->data[i], value, dst->ncols );
02869 #endif
02870   }
02871   return TRUE;
02872 }
02873 
02874 BOOL CPLOT_PlotOptionsInit( CPLOT_structPlotOptions *Opt )
02875 {
02876   if( !Opt )
02877     return FALSE;
02878   memset( Opt, 0, sizeof(CPLOT_structPlotOptions) );
02879   Opt->y_label_right_scale_factor = 1.0;
02880   Opt->RightYLabelColor = CPLOT_BLACK;
02881   Opt->numberOfSeries = 1;
02882   Opt->plotLabelOnRight = TRUE;
02883   Opt->endOfWarmupEpoch = -DBL_MAX;    
02884   Opt->PlotSize_Width_cm  = CPLOT_DEFAULT_PLOT_WIDTH_CM;  // cm
02885   Opt->PlotSize_Height_cm = CPLOT_DEFAULT_PLOT_HEIGHT_CM; // cm
02886   return TRUE;
02887 }
02888 
02889 BOOL CPLOT_Init( CPLOT* P )
02890 {
02891   int rem = 0;
02892   if( !P )
02893     return FALSE;
02894 
02895   P->mIsAxesDrawn  = FALSE;
02896   P->mSeriesIndex = 0;
02897   P->mFootNoteIndex = 0;
02898 
02899   P->mStatsValueHeight     = 15;
02900   P->mYLabelAllowance      = 106;
02901   P->mRightYLabelAllowance = 80;
02902   P->mTitleAllowance       = 50;
02903   P->mXLabelAllowance      = 56;
02904   
02905   P->mImage.Height = CPLOT_DEFAULT_PLOT_HEIGHT_CM * CPLOT_PIXELS_PER_CM;
02906   P->mImage.Width  = CPLOT_DEFAULT_PLOT_WIDTH_CM  * CPLOT_PIXELS_PER_CM;
02907 
02908   // The width must be evely divisible by four
02909   rem = P->mImage.Width%4;
02910   P->mImage.Width += rem;
02911 
02912 
02913   P->mAxes.StartX  = 100;
02914   P->mAxes.StartY  = 40;
02915   P->mAxes.FinishX = 530;
02916   P->mAxes.FinishY = 440;
02917   P->mAxes.Width  = P->mAxes.FinishX - P->mAxes.StartX;
02918   P->mAxes.Height = P->mAxes.FinishY - P->mAxes.StartY; 
02919   P->mAxes.TickDashInPixels = 4;
02920 
02921   // pointer to special color table if any
02922   P->mColorTable = NULL;
02923 
02924   // this is the default color order
02925   P->mDefaultColorTable = CPLOT_DefaultColorTable;
02926 
02927   P->mData.xtickstart = 0.0;
02928   P->mData.xtickend = 0.0;
02929   P->mData.xticksize = 0.0;
02930   P->mData.ytickstart = 0.0;
02931   P->mData.ytickend = 0.0;
02932   P->mData.yticksize = 0.0;
02933   P->mData.RangeX = 0.0;
02934   P->mData.RangeY = 0.0;
02935   P->mData.OnePercentRangeX = 0.0;
02936   P->mData.OnePercentRangeY = 0.0;
02937   P->mData.ScaleX = 0.0;
02938   P->mData.ScaleY = 0.0;
02939   P->mData.MinX = 0.0;
02940   P->mData.MaxX = 0.0;
02941   P->mData.MinY = 0.0;
02942   P->mData.MaxY = 0.0;
02943 
02944   P->mLabelWidth = 80; //kSmallFontWidth*mStatsValueHeight;  80*8/32 must be evely divisible
02945 
02946   memset( &(P->mOptions), 0, sizeof(CPLOT_structPlotOptions) );
02947   P->mOptions.y_label_right_scale_factor = 1.0;
02948   P->mOptions.RightYLabelColor = CPLOT_BLACK;
02949   P->mOptions.numberOfSeries = 1;
02950   P->mOptions.plotLabelOnRight = TRUE;
02951   P->mOptions.endOfWarmupEpoch = -DBL_MAX;
02952   P->mOptions.PlotSize_Width_cm = 19;  // cm
02953   P->mOptions.PlotSize_Height_cm = 14; // cm
02954 
02955   if( !CPLOT_BYTE_MTX_Init( &(P->mPlotData) ) )
02956     return FALSE;
02957   if( !CPLOT_BYTE_MTX_calloc( &(P->mPlotData), P->mImage.Height, P->mImage.Width ) )
02958     return FALSE;  
02959 
02960   return TRUE;
02961 }
02962 
02963 
02964 BOOL CPLOT_SetPlottingOptions( CPLOT *P, CPLOT_structPlotOptions Options )
02965 {
02966   if( !P )
02967     return FALSE;
02968 
02969   P->mOptions = Options;
02970   return TRUE;
02971 }
02972 
02973 
02974 BOOL CPLOT_DrawLine( 
02975   CPLOT *P,
02976   const int x, 
02977   const int y, 
02978   const int to_x, 
02979   const int to_y,
02980   const CPLOT_enumColor color 
02981   )
02982 {
02983   int row    = 0,
02984     row_last = 0,
02985     halfway  = 0,
02986     col      = 0;
02987 
02988   double m = 0.0,
02989     b = 0.0;
02990 
02991   if( !P )
02992     return FALSE;
02993 
02994   if( x >= P->mImage.Width || to_x >= P->mImage.Width )
02995     return TRUE;
02996   if( y >= P->mImage.Height || to_y >= P->mImage.Height )
02997     return TRUE;
02998 
02999   if( to_x - x == 0 ) // vertical line
03000   {      
03001     if( y < to_y )
03002     {
03003       for( row=y; row<=to_y; row++ )
03004       {
03005         P->mPlotData.data[row][x] = color;
03006       }
03007     }
03008     else
03009     {
03010       for( row=to_y; row<=y; row++ )
03011       {
03012         P->mPlotData.data[row][x] = color;
03013       }
03014     }
03015     return TRUE;
03016   }
03017 
03018   if( to_x > x )
03019   {
03020     m = (double)(to_y - y) / (double)(to_x - x);
03021     b = y - m*x;
03022 
03023     col = x;
03024     row_last = (int)(m*col + b);      
03025     for( col=x; col<=to_x; col++ )
03026     {
03027       row = (int)(m*col + b);
03028 
03029       halfway = abs(row_last - row) / 2;
03030       while( abs(row_last - row) > 1 ) // must draw a vertical line
03031       {
03032         if( row_last > row )
03033           row_last--;
03034         else
03035           row_last++;
03036 
03037         // draw vertical halfway up col-1 and halfway up col
03038         if( abs(row_last - row) > halfway )
03039           P->mPlotData.data[row_last][col-1] = color;          
03040         else
03041           P->mPlotData.data[row_last][col] = color;          
03042       }
03043 
03044       P->mPlotData.data[row][col] = color;                    
03045       row_last = row;
03046     }
03047   }
03048   else
03049   {
03050     m = (double)(y - to_y) / (double)(x - to_x);
03051     b = y - m*x;
03052 
03053     col = to_x;
03054     row_last = (int)(m*col + b);      
03055     for( col=to_x; col<=x; col++ )
03056     {
03057       row = (int)(m*col + b);
03058 
03059       halfway = abs(row_last - row) / 2;
03060       while( abs(row_last - row) > 1 ) // must draw a vertical line
03061       {
03062         if( row_last > row )
03063           row_last--;
03064         else
03065           row_last++;
03066 
03067         // draw vertical halfway up col-1 and halfway up col
03068         if( abs(row_last - row) > halfway )
03069           P->mPlotData.data[row_last][col-1] = color;
03070         else
03071           P->mPlotData.data[row_last][col] = color;
03072       }
03073 
03074       P->mPlotData.data[row][col] = color;      
03075       row_last = row;
03076     }
03077   }
03078   return TRUE;
03079 }
03080 
03081 
03082 BOOL CPLOT_DrawDashedLine( 
03083   CPLOT *P,
03084   const int x, 
03085   const int y, 
03086   const int to_x, 
03087   const int to_y,
03088   const int kDashSize,
03089   const CPLOT_enumColor color )
03090 {
03091   int row    = 0,
03092     row_last = 0,
03093     halfway  = 0,
03094     col      = 0,
03095     dash     = 0;
03096 
03097   double m = 0.0,
03098     b = 0.0;
03099 
03100   if( !P )
03101     return FALSE;
03102 
03103   if( x >= P->mImage.Width || to_x >= P->mImage.Width )
03104     return TRUE;
03105   if( y >= P->mImage.Height || to_y >= P->mImage.Height )
03106     return TRUE;
03107 
03108 
03109   // y = mx + b
03110   if( to_x - x == 0 ) // m = 0
03111   {
03112     for( row=y; row<=to_y; row++ )
03113     {
03114       if( dash < kDashSize )
03115         P->mPlotData.data[row][x] = color;
03116 
03117       dash++;
03118       if( dash == kDashSize*2 )
03119         dash = 0;
03120     }
03121     return TRUE;
03122   }
03123 
03124   if( to_x > x )
03125   {
03126     dash = 0;
03127     m = (double)(to_y - y) / (double)(to_x - x);
03128     b = y - m*x;
03129 
03130     col = x;
03131     row_last = (int)(m*col + b);      
03132     for( col=x; col<=to_x; col++ )
03133     {
03134       row = (int)(m*col + b);
03135 
03136       halfway = abs(row_last - row) / 2;
03137       while( abs(row_last - row) > 1 ) // must draw a vertical line
03138       {
03139         if( row_last > row )
03140           row_last--;
03141         else
03142           row_last++;
03143 
03144         // draw vertical halfway up col-1 and halfway up col
03145         if( abs(row_last - row) > halfway )
03146         {
03147           if( dash < kDashSize )
03148             P->mPlotData.data[row_last][col-1] = color;
03149         }
03150         else
03151         {
03152           if( dash < kDashSize )
03153             P->mPlotData.data[row_last][col] = color;            
03154         }
03155 
03156         dash++;
03157         if( dash == kDashSize*2 )
03158           dash = 0;
03159 
03160       }
03161 
03162       if( dash < kDashSize )
03163         P->mPlotData.data[row][col] = color;
03164 
03165       dash++;
03166       if( dash == kDashSize*2 )
03167         dash = 0;         
03168     }
03169   }
03170   else
03171   {
03172     dash = 0;
03173     m = (double)(y - to_y) / (double)(x - to_x);
03174     b = y - m*x;
03175 
03176     col = to_x;
03177     row_last = (int)(m*col + b);      
03178     for( col=to_x; col<=x; col++ )
03179     {         
03180       row = (int)(m*col + b);
03181 
03182       halfway = abs(row_last - row) / 2;
03183       while( abs(row_last - row) > 1 ) // must draw a vertical line
03184       {
03185         if( row_last > row )
03186           row_last--;
03187         else
03188           row_last++;
03189 
03190         // draw vertical halfway up col-1 and halfway up col
03191         if( abs(row_last - row) > halfway )
03192         {
03193           if( dash < kDashSize )
03194             P->mPlotData.data[row_last][col-1] = color;            
03195         }
03196         else
03197         {
03198           if( dash < kDashSize )
03199             P->mPlotData.data[row_last][col] = color;                        
03200         }
03201         dash++;
03202         if( dash == kDashSize*2 )
03203           dash = 0;
03204       }
03205 
03206       if( dash < kDashSize )
03207         P->mPlotData.data[row][col] = color;                                
03208 
03209       dash++;
03210       if( dash == kDashSize*2 )
03211         dash = 0;
03212 
03213 
03214       row_last = row;
03215     }
03216   }
03217 
03218   return TRUE;
03219 }
03220 
03221 
03222 
03223 
03224 int CPLOT_DrawSmallLetter( 
03225   CPLOT *P,
03226   const char Letter, 
03227   const int x, 
03228   const int y,                                  
03229   BOOL isRotatedLeft,
03230   const CPLOT_enumColor color 
03231   )
03232 {
03233   const int klH = CPLOT_SMALLFONT_HGT;   // letter height
03234   const int klW = CPLOT_SMALLFONT_WIDTH; // letter width
03235 
03236   int row = 0;
03237   int col = 0;
03238 
03239   byte rotatedleft[CPLOT_SMALLFONT_WIDTH][CPLOT_SMALLFONT_HGT];
03240   byte temp[CPLOT_SMALLFONT_HGT][CPLOT_SMALLFONT_WIDTH];
03241 
03242   if( !P )
03243     return FALSE;
03244 
03245   if( y < klH )
03246     return 0;
03247 
03248   if( x + klW >= P->mImage.Width )
03249     return 0;
03250 
03251   memset( &rotatedleft, 0, CPLOT_SMALLFONT_WIDTH*CPLOT_SMALLFONT_HGT );
03252   memset( &temp, 0, CPLOT_SMALLFONT_WIDTH*CPLOT_SMALLFONT_HGT );
03253 
03254   switch( Letter )
03255   {
03256   case 'A':  memcpy( &temp, CPLOT_SMALLFONT_A, CPLOT_SMALLFONT_NBYTES ); break;        
03257   case 'B':  memcpy( &temp, CPLOT_SMALLFONT_B, CPLOT_SMALLFONT_NBYTES ); break;        
03258   case 'C':  memcpy( &temp, CPLOT_SMALLFONT_C, CPLOT_SMALLFONT_NBYTES ); break;        
03259   case 'D':  memcpy( &temp, CPLOT_SMALLFONT_D, CPLOT_SMALLFONT_NBYTES ); break;        
03260   case 'E':  memcpy( &temp, CPLOT_SMALLFONT_E, CPLOT_SMALLFONT_NBYTES ); break;        
03261   case 'F':  memcpy( &temp, CPLOT_SMALLFONT_F, CPLOT_SMALLFONT_NBYTES ); break;        
03262   case 'G':  memcpy( &temp, CPLOT_SMALLFONT_G, CPLOT_SMALLFONT_NBYTES ); break;        
03263   case 'H':  memcpy( &temp, CPLOT_SMALLFONT_H, CPLOT_SMALLFONT_NBYTES ); break;        
03264   case 'I':  memcpy( &temp, CPLOT_SMALLFONT_I, CPLOT_SMALLFONT_NBYTES ); break;        
03265   case 'J':  memcpy( &temp, CPLOT_SMALLFONT_J, CPLOT_SMALLFONT_NBYTES ); break;        
03266   case 'K':  memcpy( &temp, CPLOT_SMALLFONT_K, CPLOT_SMALLFONT_NBYTES ); break;        
03267   case 'L':  memcpy( &temp, CPLOT_SMALLFONT_L, CPLOT_SMALLFONT_NBYTES ); break;        
03268   case 'M':  memcpy( &temp, CPLOT_SMALLFONT_M, CPLOT_SMALLFONT_NBYTES ); break;        
03269   case 'N':  memcpy( &temp, CPLOT_SMALLFONT_N, CPLOT_SMALLFONT_NBYTES ); break;        
03270   case 'O':  memcpy( &temp, CPLOT_SMALLFONT_O, CPLOT_SMALLFONT_NBYTES ); break;        
03271   case 'P':  memcpy( &temp, CPLOT_SMALLFONT_P, CPLOT_SMALLFONT_NBYTES ); break;        
03272   case 'Q':  memcpy( &temp, CPLOT_SMALLFONT_Q, CPLOT_SMALLFONT_NBYTES ); break;
03273   case 'R':  memcpy( &temp, CPLOT_SMALLFONT_R, CPLOT_SMALLFONT_NBYTES ); break;
03274   case 'S':  memcpy( &temp, CPLOT_SMALLFONT_S, CPLOT_SMALLFONT_NBYTES ); break;
03275   case 'T':  memcpy( &temp, CPLOT_SMALLFONT_T, CPLOT_SMALLFONT_NBYTES ); break;
03276   case 'U':  memcpy( &temp, CPLOT_SMALLFONT_U, CPLOT_SMALLFONT_NBYTES ); break;
03277   case 'V':  memcpy( &temp, CPLOT_SMALLFONT_V, CPLOT_SMALLFONT_NBYTES ); break;
03278   case 'W':  memcpy( &temp, CPLOT_SMALLFONT_W, CPLOT_SMALLFONT_NBYTES ); break;
03279   case 'X':  memcpy( &temp, CPLOT_SMALLFONT_X, CPLOT_SMALLFONT_NBYTES ); break;
03280   case 'Y':  memcpy( &temp, CPLOT_SMALLFONT_Y, CPLOT_SMALLFONT_NBYTES ); break;
03281   case 'Z':  memcpy( &temp, CPLOT_SMALLFONT_Z, CPLOT_SMALLFONT_NBYTES ); break;
03282 
03283 
03284   case 'a':  memcpy( &temp, CPLOT_SMALLFONT_a, CPLOT_SMALLFONT_NBYTES ); break;
03285   case 'b':  memcpy( &temp, CPLOT_SMALLFONT_b, CPLOT_SMALLFONT_NBYTES ); break;
03286   case 'c':  memcpy( &temp, CPLOT_SMALLFONT_c, CPLOT_SMALLFONT_NBYTES ); break;
03287   case 'd':  memcpy( &temp, CPLOT_SMALLFONT_d, CPLOT_SMALLFONT_NBYTES ); break;
03288   case 'e':  memcpy( &temp, CPLOT_SMALLFONT_e, CPLOT_SMALLFONT_NBYTES ); break;
03289   case 'f':  memcpy( &temp, CPLOT_SMALLFONT_f, CPLOT_SMALLFONT_NBYTES ); break;
03290   case 'g':  memcpy( &temp, CPLOT_SMALLFONT_g, CPLOT_SMALLFONT_NBYTES ); break;
03291   case 'h':  memcpy( &temp, CPLOT_SMALLFONT_h, CPLOT_SMALLFONT_NBYTES ); break;
03292   case 'i':  memcpy( &temp, CPLOT_SMALLFONT_i, CPLOT_SMALLFONT_NBYTES ); break;
03293   case 'j':  memcpy( &temp, CPLOT_SMALLFONT_j, CPLOT_SMALLFONT_NBYTES ); break;
03294   case 'k':  memcpy( &temp, CPLOT_SMALLFONT_k, CPLOT_SMALLFONT_NBYTES ); break;
03295   case 'l':  memcpy( &temp, CPLOT_SMALLFONT_l, CPLOT_SMALLFONT_NBYTES ); break;
03296   case 'm':  memcpy( &temp, CPLOT_SMALLFONT_m, CPLOT_SMALLFONT_NBYTES ); break;
03297   case 'n':  memcpy( &temp, CPLOT_SMALLFONT_n, CPLOT_SMALLFONT_NBYTES ); break;
03298   case 'o':  memcpy( &temp, CPLOT_SMALLFONT_o, CPLOT_SMALLFONT_NBYTES ); break;
03299   case 'p':  memcpy( &temp, CPLOT_SMALLFONT_p, CPLOT_SMALLFONT_NBYTES ); break;
03300   case 'q':  memcpy( &temp, CPLOT_SMALLFONT_q, CPLOT_SMALLFONT_NBYTES ); break;
03301   case 'r':  memcpy( &temp, CPLOT_SMALLFONT_r, CPLOT_SMALLFONT_NBYTES ); break;
03302   case 's':  memcpy( &temp, CPLOT_SMALLFONT_s, CPLOT_SMALLFONT_NBYTES ); break;
03303   case 't':  memcpy( &temp, CPLOT_SMALLFONT_t, CPLOT_SMALLFONT_NBYTES ); break;
03304   case 'u':  memcpy( &temp, CPLOT_SMALLFONT_u, CPLOT_SMALLFONT_NBYTES ); break;
03305   case 'v':  memcpy( &temp, CPLOT_SMALLFONT_v, CPLOT_SMALLFONT_NBYTES ); break;
03306   case 'w':  memcpy( &temp, CPLOT_SMALLFONT_w, CPLOT_SMALLFONT_NBYTES ); break;
03307   case 'x':  memcpy( &temp, CPLOT_SMALLFONT_x, CPLOT_SMALLFONT_NBYTES ); break;
03308   case 'y':  memcpy( &temp, CPLOT_SMALLFONT_y, CPLOT_SMALLFONT_NBYTES ); break;
03309   case 'z':  memcpy( &temp, CPLOT_SMALLFONT_z, CPLOT_SMALLFONT_NBYTES ); break;
03310 
03311   case '~':  memcpy( &temp, CPLOT_SMALLFONT_tilda, CPLOT_SMALLFONT_NBYTES ); break;
03312   case '!':  memcpy( &temp, CPLOT_SMALLFONT_exclamation, CPLOT_SMALLFONT_NBYTES ); break;        
03313   // case '@':  memcpy( &temp, CPLOT_SMALLFONT_at, CPLOT_SMALLFONT_NBYTES ); break; // GDM_TODO - add
03314   //case '#':  memcpy( &temp, CPLOT_SMALLFONT_hash, CPLOT_SMALLFONT_NBYTES ); break; // GDM_TODO - add 
03315   case '$':  memcpy( &temp, CPLOT_SMALLFONT_dollarsign, CPLOT_SMALLFONT_NBYTES ); break;
03316   case '%':  memcpy( &temp, CPLOT_SMALLFONT_percent, CPLOT_SMALLFONT_NBYTES ); break;
03317   case '^':  memcpy( &temp, CPLOT_SMALLFONT_raiseto, CPLOT_SMALLFONT_NBYTES ); break;
03318   case '&':  memcpy( &temp, CPLOT_SMALLFONT_andsign, CPLOT_SMALLFONT_NBYTES ); break;
03319   case '*':  memcpy( &temp, CPLOT_SMALLFONT_star, CPLOT_SMALLFONT_NBYTES ); break;
03320   case '(':  memcpy( &temp, CPLOT_SMALLFONT_leftbracket, CPLOT_SMALLFONT_NBYTES ); break;
03321   case ')':  memcpy( &temp, CPLOT_SMALLFONT_rightbracket, CPLOT_SMALLFONT_NBYTES ); break;
03322   case '-':  memcpy( &temp, CPLOT_SMALLFONT_dash, CPLOT_SMALLFONT_NBYTES ); break;
03323   // case '_':  memcpy( &temp, CPLOT_SMALLFONT_underscore, CPLOT_SMALLFONT_NBYTES ); break; // GDM_TODO - add 
03324   case '+':  memcpy( &temp, CPLOT_SMALLFONT_plus, CPLOT_SMALLFONT_NBYTES ); break;
03325   case '=':  memcpy( &temp, CPLOT_SMALLFONT_equals, CPLOT_SMALLFONT_NBYTES ); break;
03326   // case '{':  memcpy( &temp, CPLOT_SMALLFONT_leftcurly, CPLOT_SMALLFONT_NBYTES ); break; // GDM_TODO - add 
03327   // case '}':  memcpy( &temp, CPLOT_SMALLFONT_rightcurly, CPLOT_SMALLFONT_NBYTES ); break; // GDM_TODO - add 
03328   case '|':  memcpy( &temp, CPLOT_SMALLFONT_vert, CPLOT_SMALLFONT_NBYTES ); break;
03329   case '[':  memcpy( &temp, CPLOT_SMALLFONT_leftsquare, CPLOT_SMALLFONT_NBYTES ); break;
03330   case ']':  memcpy( &temp, CPLOT_SMALLFONT_rightsquare, CPLOT_SMALLFONT_NBYTES ); break;
03331   case '\\': memcpy( &temp, CPLOT_SMALLFONT_backslash, CPLOT_SMALLFONT_NBYTES ); break;
03332   case '/':  memcpy( &temp, CPLOT_SMALLFONT_forwardslash, CPLOT_SMALLFONT_NBYTES ); break;
03333   case ';':  memcpy( &temp, CPLOT_SMALLFONT_semicolon, CPLOT_SMALLFONT_NBYTES ); break;
03334   case ':':  memcpy( &temp, CPLOT_SMALLFONT_colon, CPLOT_SMALLFONT_NBYTES ); break;
03335   case '\'': memcpy( &temp, CPLOT_SMALLFONT_singlequote, CPLOT_SMALLFONT_NBYTES ); break;
03336   case ',':  memcpy( &temp, CPLOT_SMALLFONT_comma, CPLOT_SMALLFONT_NBYTES ); break;
03337   case '.':  memcpy( &temp, CPLOT_SMALLFONT_point, CPLOT_SMALLFONT_NBYTES ); break;
03338   case '"':  memcpy( &temp, CPLOT_SMALLFONT_doublequote, CPLOT_SMALLFONT_NBYTES ); break;
03339   case '<':  memcpy( &temp, CPLOT_SMALLFONT_lessthan, CPLOT_SMALLFONT_NBYTES ); break;
03340   case '>':  memcpy( &temp, CPLOT_SMALLFONT_morethan, CPLOT_SMALLFONT_NBYTES ); break;
03341   // case '?':  memcpy( &temp, CPLOT_SMALLFONT_questionmark, CPLOT_SMALLFONT_NBYTES ); break;// GDM_TODO - add 
03342 
03343   case '1':  memcpy( &temp, CPLOT_SMALLFONT_One, CPLOT_SMALLFONT_NBYTES ); break;
03344   case '2':  memcpy( &temp, CPLOT_SMALLFONT_Two, CPLOT_SMALLFONT_NBYTES ); break;
03345   case '3':  memcpy( &temp, CPLOT_SMALLFONT_Three, CPLOT_SMALLFONT_NBYTES ); break;
03346   case '4':  memcpy( &temp, CPLOT_SMALLFONT_Four, CPLOT_SMALLFONT_NBYTES ); break;
03347   case '5':  memcpy( &temp, CPLOT_SMALLFONT_Five, CPLOT_SMALLFONT_NBYTES ); break;
03348   case '6':  memcpy( &temp, CPLOT_SMALLFONT_Six, CPLOT_SMALLFONT_NBYTES ); break;
03349   case '7':  memcpy( &temp, CPLOT_SMALLFONT_Seven, CPLOT_SMALLFONT_NBYTES ); break;
03350   case '8':  memcpy( &temp, CPLOT_SMALLFONT_Eight, CPLOT_SMALLFONT_NBYTES ); break;
03351   case '9':  memcpy( &temp, CPLOT_SMALLFONT_Nine, CPLOT_SMALLFONT_NBYTES ); break;
03352   case '0':  memcpy( &temp, CPLOT_SMALLFONT_Zero, CPLOT_SMALLFONT_NBYTES ); break;
03353 
03354   default: break;
03355   }
03356 
03357 
03358   if( isRotatedLeft )
03359   {  
03360     for( row = 0; row < klH; row++ )
03361     {      
03362       for( col = 0; col < klW; col++ )
03363       {  
03364         rotatedleft[5-col][row] = temp[row][col];
03365       }      
03366     }
03367   }
03368 
03369   // plot the letters
03370   if( isRotatedLeft )
03371   {
03372     for( row = 0; row < klW; row++ )
03373     {
03374       for( col = 0; col < klH; col++ )
03375       {  
03376         if( rotatedleft[row][col] )
03377           P->mPlotData.data[y-row][x+col] = rotatedleft[row][col] * color;         
03378       }         
03379     }      
03380   }
03381   else
03382   {
03383     for( row = 0; row < klH; row++ )
03384     {
03385       for( col = 0; col < klW; col++ )
03386       {  
03387         if( temp[row][col] )
03388           P->mPlotData.data[y-row][x+col] = temp[row][col] * color;          
03389       }
03390     }      
03391   }
03392   return klW;
03393 }
03394 
03395 
03396 
03397 
03398 
03399 
03400 int CPLOT_DrawLargeLetter( 
03401   CPLOT *P,
03402   const char Letter, 
03403   const int x, 
03404   const int y,
03405   BOOL isRotatedLeft,
03406   const CPLOT_enumColor color 
03407   )
03408 {
03409   int row = 0;
03410   int col = 0;
03411   int numCols = 0;
03412   char letter = Letter;
03413   const int kSize = CPLOT_LARGEFONT;
03414 
03415   byte temp[CPLOT_LARGEFONT][CPLOT_LARGEFONT];
03416   byte rotatedleft[CPLOT_LARGEFONT][CPLOT_LARGEFONT];
03417 
03418   if( !P )
03419     return FALSE;
03420 
03421   memset( &temp, 0, CPLOT_LARGEFONT*CPLOT_LARGEFONT );
03422   memset( &rotatedleft, 0, CPLOT_LARGEFONT*CPLOT_LARGEFONT );
03423   
03424   switch( letter )
03425   {
03426   case 'A':   numCols = 11; break;
03427   case 'B':   numCols = 11; break;
03428   case 'C':   numCols = 11; break;
03429   case 'D':   numCols = 11; break;
03430   case 'E':   numCols = 11; break;
03431   case 'F':   numCols = 11; break;
03432   case 'G':   numCols = 11; break;
03433   case 'H':   numCols = 11; break;
03434   case 'I':   numCols =  3; break;   
03435   case 'J':   numCols =  9; break;
03436   case 'K':   numCols = 11; break;
03437   case 'L':   numCols =  9; break;
03438   case 'M':   numCols = 13; break;
03439   case 'N':   numCols = 11; break;
03440   case 'O':   numCols = 12; break;
03441   case 'P':   numCols = 10; break;
03442   case 'Q':   numCols = 12; break;
03443   case 'R':   numCols = 11; break;
03444   case 'S':   numCols = 10; break;   
03445   case 'T':   numCols = 10; break;
03446   case 'U':   numCols = 10; break;
03447   case 'V':   numCols =  9; break;
03448   case 'W':   numCols = 14; break;
03449   case 'X':   numCols = 10; break;
03450   case 'Y':   numCols =  9; break;
03451   case 'Z':   numCols =  9; break;
03452 
03453   case 'a':   numCols =  8; break;
03454   case 'b':   numCols =  9; break;
03455   case 'c':   numCols =  9; break;   
03456   case 'd':   numCols =  9; break;
03457   case 'e':   numCols =  9; break;
03458   case 'f':   numCols =  7; break;
03459   case 'g':   numCols =  9; break;
03460   case 'h':   numCols =  9; break;
03461   case 'i':   numCols =  4; break;
03462   case 'j':   numCols =  6; break;
03463   case 'k':   numCols =  8; break;
03464   case 'l':   numCols =  4; break;
03465   case 'm':   numCols = 12; break;   
03466   case 'n':   numCols =  9; break;
03467   case 'o':   numCols =  9; break;
03468   case 'p':   numCols =  9; break;
03469   case 'q':   numCols =  9; break;
03470   case 'r':   numCols =  6; break;
03471   case 's':   numCols =  7; break;
03472   case 't':   numCols =  6; break;
03473   case 'u':   numCols =  9; break;
03474   case 'v':   numCols =  8; break;
03475   case 'w':   numCols = 12; break;   
03476   case 'x':   numCols =  7; break;
03477   case 'y':   numCols =  8; break;
03478   case 'z':   numCols =  8; break;
03479 
03480   case '~':   numCols = 10; break;
03481   case '!':   numCols =  4; break;
03482   case '@':   numCols = 12; break;
03483   case '#':   numCols =  9; break;
03484   case '$':   numCols = 10; break;
03485   case '%':   numCols = 14; break;
03486   case '^':   numCols = 10; break;
03487   case '&':   numCols = 11; break;
03488   case '*':   numCols =  8; break;
03489   case '(':   numCols =  5; break;
03490   case ')':   numCols =  5; break;
03491   case '-':   numCols =  5; break;
03492   case '_':   numCols =  9; break;
03493   case '+':   numCols = 10; break;
03494   case '=':   numCols = 10; break;   
03495   case '{':   numCols =  6; break;
03496   case '}':   numCols =  6; break;   
03497   case '|':   numCols =  5; break;
03498   case '[':   numCols =  5; break;
03499   case ']':   numCols =  5; break;
03500   case '\\':  numCols =  6; break;
03501   case '/':   numCols =  6; break;   
03502   case ';':   numCols =  4; break;
03503   case ':':   numCols =  4; break;   
03504   case '\'':  numCols =  4; break;
03505   case ',':   numCols =  4; break;
03506   case '.':   numCols =  4; break;   
03507   case '"':   numCols =  8; break;
03508   case '<':   numCols =  9; break;
03509   case '>':   numCols =  9; break;
03510   case '?':   numCols =  9; break;
03511 
03512   case '1':   numCols =  7; break;
03513   case '2':
03514   case '3':
03515   case '4':
03516   case '5':
03517   case '6':
03518   case '7':
03519   case '8':
03520   case '9':
03521   case '0':   numCols =  8; break;                  
03522 
03523   case -1:  numCols =  12; break;
03524   
03525   default: numCols = 5; break;
03526   }
03527 
03528   
03529   switch( letter )
03530   {
03531   case 'A':  memcpy( &temp, CPLOT_LARGEFONT_A, CPLOT_LARGEFONT_NBYTES ); break;        
03532   case 'B':  memcpy( &temp, CPLOT_LARGEFONT_B, CPLOT_LARGEFONT_NBYTES ); break;        
03533   case 'C':  memcpy( &temp, CPLOT_LARGEFONT_C, CPLOT_LARGEFONT_NBYTES ); break;        
03534   case 'D':  memcpy( &temp, CPLOT_LARGEFONT_D, CPLOT_LARGEFONT_NBYTES ); break;        
03535   case 'E':  memcpy( &temp, CPLOT_LARGEFONT_E, CPLOT_LARGEFONT_NBYTES ); break;        
03536   case 'F':  memcpy( &temp, CPLOT_LARGEFONT_F, CPLOT_LARGEFONT_NBYTES ); break;        
03537   case 'G':  memcpy( &temp, CPLOT_LARGEFONT_G, CPLOT_LARGEFONT_NBYTES ); break;        
03538   case 'H':  memcpy( &temp, CPLOT_LARGEFONT_H, CPLOT_LARGEFONT_NBYTES ); break;        
03539   case 'I':  memcpy( &temp, CPLOT_LARGEFONT_I, CPLOT_LARGEFONT_NBYTES ); break;        
03540   case 'J':  memcpy( &temp, CPLOT_LARGEFONT_J, CPLOT_LARGEFONT_NBYTES ); break;        
03541   case 'K':  memcpy( &temp, CPLOT_LARGEFONT_K, CPLOT_LARGEFONT_NBYTES ); break;        
03542   case 'L':  memcpy( &temp, CPLOT_LARGEFONT_L, CPLOT_LARGEFONT_NBYTES ); break;        
03543   case 'M':  memcpy( &temp, CPLOT_LARGEFONT_M, CPLOT_LARGEFONT_NBYTES ); break;        
03544   case 'N':  memcpy( &temp, CPLOT_LARGEFONT_N, CPLOT_LARGEFONT_NBYTES ); break;        
03545   case 'O':  memcpy( &temp, CPLOT_LARGEFONT_O, CPLOT_LARGEFONT_NBYTES ); break;        
03546   case 'P':  memcpy( &temp, CPLOT_LARGEFONT_P, CPLOT_LARGEFONT_NBYTES ); break;        
03547   case 'Q':  memcpy( &temp, CPLOT_LARGEFONT_Q, CPLOT_LARGEFONT_NBYTES ); break;
03548   case 'R':  memcpy( &temp, CPLOT_LARGEFONT_R, CPLOT_LARGEFONT_NBYTES ); break;
03549   case 'S':  memcpy( &temp, CPLOT_LARGEFONT_S, CPLOT_LARGEFONT_NBYTES ); break;
03550   case 'T':  memcpy( &temp, CPLOT_LARGEFONT_T, CPLOT_LARGEFONT_NBYTES ); break;
03551   case 'U':  memcpy( &temp, CPLOT_LARGEFONT_U, CPLOT_LARGEFONT_NBYTES ); break;
03552   case 'V':  memcpy( &temp, CPLOT_LARGEFONT_V, CPLOT_LARGEFONT_NBYTES ); break;
03553   case 'W':  memcpy( &temp, CPLOT_LARGEFONT_W, CPLOT_LARGEFONT_NBYTES ); break;
03554   case 'X':  memcpy( &temp, CPLOT_LARGEFONT_X, CPLOT_LARGEFONT_NBYTES ); break;
03555   case 'Y':  memcpy( &temp, CPLOT_LARGEFONT_Y, CPLOT_LARGEFONT_NBYTES ); break;
03556   case 'Z':  memcpy( &temp, CPLOT_LARGEFONT_Z, CPLOT_LARGEFONT_NBYTES ); break;
03557 
03558 
03559   case 'a':  memcpy( &temp, CPLOT_LARGEFONT_a, CPLOT_LARGEFONT_NBYTES ); break;
03560   case 'b':  memcpy( &temp, CPLOT_LARGEFONT_b, CPLOT_LARGEFONT_NBYTES ); break;
03561   case 'c':  memcpy( &temp, CPLOT_LARGEFONT_c, CPLOT_LARGEFONT_NBYTES ); break;
03562   case 'd':  memcpy( &temp, CPLOT_LARGEFONT_d, CPLOT_LARGEFONT_NBYTES ); break;
03563   case 'e':  memcpy( &temp, CPLOT_LARGEFONT_e, CPLOT_LARGEFONT_NBYTES ); break;
03564   case 'f':  memcpy( &temp, CPLOT_LARGEFONT_f, CPLOT_LARGEFONT_NBYTES ); break;
03565   case 'g':  memcpy( &temp, CPLOT_LARGEFONT_g, CPLOT_LARGEFONT_NBYTES ); break;
03566   case 'h':  memcpy( &temp, CPLOT_LARGEFONT_h, CPLOT_LARGEFONT_NBYTES ); break;
03567   case 'i':  memcpy( &temp, CPLOT_LARGEFONT_i, CPLOT_LARGEFONT_NBYTES ); break;
03568   case 'j':  memcpy( &temp, CPLOT_LARGEFONT_j, CPLOT_LARGEFONT_NBYTES ); break;
03569   case 'k':  memcpy( &temp, CPLOT_LARGEFONT_k, CPLOT_LARGEFONT_NBYTES ); break;
03570   case 'l':  memcpy( &temp, CPLOT_LARGEFONT_l, CPLOT_LARGEFONT_NBYTES ); break;
03571   case 'm':  memcpy( &temp, CPLOT_LARGEFONT_m, CPLOT_LARGEFONT_NBYTES ); break;
03572   case 'n':  memcpy( &temp, CPLOT_LARGEFONT_n, CPLOT_LARGEFONT_NBYTES ); break;
03573   case 'o':  memcpy( &temp, CPLOT_LARGEFONT_o, CPLOT_LARGEFONT_NBYTES ); break;
03574   case 'p':  memcpy( &temp, CPLOT_LARGEFONT_p, CPLOT_LARGEFONT_NBYTES ); break;
03575   case 'q':  memcpy( &temp, CPLOT_LARGEFONT_q, CPLOT_LARGEFONT_NBYTES ); break;
03576   case 'r':  memcpy( &temp, CPLOT_LARGEFONT_r, CPLOT_LARGEFONT_NBYTES ); break;
03577   case 's':  memcpy( &temp, CPLOT_LARGEFONT_s, CPLOT_LARGEFONT_NBYTES ); break;
03578   case 't':  memcpy( &temp, CPLOT_LARGEFONT_t, CPLOT_LARGEFONT_NBYTES ); break;
03579   case 'u':  memcpy( &temp, CPLOT_LARGEFONT_u, CPLOT_LARGEFONT_NBYTES ); break;
03580   case 'v':  memcpy( &temp, CPLOT_LARGEFONT_v, CPLOT_LARGEFONT_NBYTES ); break;
03581   case 'w':  memcpy( &temp, CPLOT_LARGEFONT_w, CPLOT_LARGEFONT_NBYTES ); break;
03582   case 'x':  memcpy( &temp, CPLOT_LARGEFONT_x, CPLOT_LARGEFONT_NBYTES ); break;
03583   case 'y':  memcpy( &temp, CPLOT_LARGEFONT_y, CPLOT_LARGEFONT_NBYTES ); break;
03584   case 'z':  memcpy( &temp, CPLOT_LARGEFONT_z, CPLOT_LARGEFONT_NBYTES ); break;
03585 
03586   case '~':  memcpy( &temp, CPLOT_LARGEFONT_tilda, CPLOT_LARGEFONT_NBYTES ); break;
03587   case '!':  memcpy( &temp, CPLOT_LARGEFONT_exclamation, CPLOT_LARGEFONT_NBYTES ); break;        
03588   case '@':  memcpy( &temp, CPLOT_LARGEFONT_at, CPLOT_LARGEFONT_NBYTES ); break;
03589   case '#':  memcpy( &temp, CPLOT_LARGEFONT_hash, CPLOT_LARGEFONT_NBYTES ); break;
03590   case '$':  memcpy( &temp, CPLOT_LARGEFONT_dollarsign, CPLOT_LARGEFONT_NBYTES ); break;
03591   case '%':  memcpy( &temp, CPLOT_LARGEFONT_percent, CPLOT_LARGEFONT_NBYTES ); break;
03592   case '^':  memcpy( &temp, CPLOT_LARGEFONT_raiseto, CPLOT_LARGEFONT_NBYTES ); break;
03593   case '&':  memcpy( &temp, CPLOT_LARGEFONT_andsign, CPLOT_LARGEFONT_NBYTES ); break;
03594   case '*':  memcpy( &temp, CPLOT_LARGEFONT_star, CPLOT_LARGEFONT_NBYTES ); break;
03595   case '(':  memcpy( &temp, CPLOT_LARGEFONT_leftbracket, CPLOT_LARGEFONT_NBYTES ); break;
03596   case ')':  memcpy( &temp, CPLOT_LARGEFONT_rightbracket, CPLOT_LARGEFONT_NBYTES ); break;
03597   case '-':  memcpy( &temp, CPLOT_LARGEFONT_dash, CPLOT_LARGEFONT_NBYTES ); break;
03598   case '_':  memcpy( &temp, CPLOT_LARGEFONT_underscore, CPLOT_LARGEFONT_NBYTES ); break;
03599   case '+':  memcpy( &temp, CPLOT_LARGEFONT_plus, CPLOT_LARGEFONT_NBYTES ); break;
03600   case '=':  memcpy( &temp, CPLOT_LARGEFONT_equals, CPLOT_LARGEFONT_NBYTES ); break;
03601   case '{':  memcpy( &temp, CPLOT_LARGEFONT_leftcurly, CPLOT_LARGEFONT_NBYTES ); break;
03602   case '}':  memcpy( &temp, CPLOT_LARGEFONT_rightcurly, CPLOT_LARGEFONT_NBYTES ); break;
03603   case '|':  memcpy( &temp, CPLOT_LARGEFONT_vert, CPLOT_LARGEFONT_NBYTES ); break;
03604   case '[':  memcpy( &temp, CPLOT_LARGEFONT_leftsquare, CPLOT_LARGEFONT_NBYTES ); break;
03605   case ']':  memcpy( &temp, CPLOT_LARGEFONT_rightsquare, CPLOT_LARGEFONT_NBYTES ); break;
03606   case '\\': memcpy( &temp, CPLOT_LARGEFONT_backslash, CPLOT_LARGEFONT_NBYTES ); break;
03607   case '/':  memcpy( &temp, CPLOT_LARGEFONT_forwardslash, CPLOT_LARGEFONT_NBYTES ); break;
03608   case ';':  memcpy( &temp, CPLOT_LARGEFONT_semicolon, CPLOT_LARGEFONT_NBYTES ); break;
03609   case ':':  memcpy( &temp, CPLOT_LARGEFONT_colon, CPLOT_LARGEFONT_NBYTES ); break;
03610   case '\'': memcpy( &temp, CPLOT_LARGEFONT_singlequote, CPLOT_LARGEFONT_NBYTES ); break;
03611   case ',':  memcpy( &temp, CPLOT_LARGEFONT_comma, CPLOT_LARGEFONT_NBYTES ); break;
03612   case '.':  memcpy( &temp, CPLOT_LARGEFONT_point, CPLOT_LARGEFONT_NBYTES ); break;
03613   case '"':  memcpy( &temp, CPLOT_LARGEFONT_doublequote, CPLOT_LARGEFONT_NBYTES ); break;
03614   case '<':  memcpy( &temp, CPLOT_LARGEFONT_lessthan, CPLOT_LARGEFONT_NBYTES ); break;
03615   case '>':  memcpy( &temp, CPLOT_LARGEFONT_morethan, CPLOT_LARGEFONT_NBYTES ); break;
03616   case '?':  memcpy( &temp, CPLOT_LARGEFONT_questionmark, CPLOT_LARGEFONT_NBYTES ); break;
03617 
03618   case '1':  memcpy( &temp, CPLOT_LARGEFONT_One, CPLOT_LARGEFONT_NBYTES ); break;
03619   case '2':  memcpy( &temp, CPLOT_LARGEFONT_Two, CPLOT_LARGEFONT_NBYTES ); break;
03620   case '3':  memcpy( &temp, CPLOT_LARGEFONT_Three, CPLOT_LARGEFONT_NBYTES ); break;
03621   case '4':  memcpy( &temp, CPLOT_LARGEFONT_Four, CPLOT_LARGEFONT_NBYTES ); break;
03622   case '5':  memcpy( &temp, CPLOT_LARGEFONT_Five, CPLOT_LARGEFONT_NBYTES ); break;
03623   case '6':  memcpy( &temp, CPLOT_LARGEFONT_Six, CPLOT_LARGEFONT_NBYTES ); break;
03624   case '7':  memcpy( &temp, CPLOT_LARGEFONT_Seven, CPLOT_LARGEFONT_NBYTES ); break;
03625   case '8':  memcpy( &temp, CPLOT_LARGEFONT_Eight, CPLOT_LARGEFONT_NBYTES ); break;
03626   case '9':  memcpy( &temp, CPLOT_LARGEFONT_Nine, CPLOT_LARGEFONT_NBYTES ); break;
03627   case '0':  memcpy( &temp, CPLOT_LARGEFONT_Zero, CPLOT_LARGEFONT_NBYTES ); break;
03628 
03629   case -1:  memcpy( &temp, CPLOT_LARGEFONT_sigma, CPLOT_LARGEFONT_NBYTES ); break;
03630 
03631   default: break;
03632   }
03633 
03634   if( isRotatedLeft )
03635   {
03636     for( row = 0; row < kSize; row++ )
03637     {      
03638       for( col = 0; col < kSize; col++ )
03639       {  
03640         rotatedleft[kSize - row - 1][col] = temp[col][row];
03641       }      
03642     }
03643   }
03644 
03645   // plot the letters
03646   if( isRotatedLeft )
03647   {
03648     if( y < kSize )
03649       return 0;
03650 
03651     if( x + kSize >= P->mImage.Width )
03652       return 0;
03653 
03654     for( row = kSize - numCols; row < kSize; row++ )
03655     {
03656       for( col = 0; col < kSize; col++ )
03657       {  
03658         if( rotatedleft[row][col] )
03659           P->mPlotData.data[y-row][x+col] = (rotatedleft[row][col]) * color;            
03660       }         
03661     }      
03662   }
03663   else
03664   {
03665     if( y < kSize )
03666       return 0;
03667 
03668     if( x + numCols >= P->mImage.Width )
03669       return 0;
03670 
03671     for( row = 0; row < kSize; row++ )
03672     {
03673       for( col = 0; col < numCols; col++ )
03674       {            
03675         if( temp[row][col] )
03676           P->mPlotData.data[y-row][x+col] = (temp[row][col]) * color;
03677       }
03678     }
03679   }
03680 
03681   return numCols;
03682 }
03683 
03684 BOOL CPLOT_DrawString( 
03685   CPLOT *P,
03686   const char* str, 
03687   const int left, 
03688   const int top,
03689   const BOOL useLargeFont,
03690   const BOOL isRotatedLeft,
03691   const CPLOT_enumColor color 
03692   )
03693 { 
03694   int length;
03695 
03696   int offset = 0,
03697     i      = 0,
03698     letterWidth = 0;
03699 
03700   if( str == NULL )
03701     return TRUE; // nothing to draw
03702 
03703   length = (int)strlen(str);
03704 
03705   if( !P )
03706     return FALSE;
03707   if( !str )
03708     return FALSE;
03709 
03710   if( left >= P->mImage.Width )
03711     return TRUE;
03712   if( top >= P->mImage.Height )
03713     return TRUE;
03714 
03715   if( strstr( str, "\\sigma" ) )
03716   {
03717     letterWidth = CPLOT_DrawLargeLetter( P, -1, left, top + offset, isRotatedLeft, color );  // GDM_HACK - a hack for now.
03718   }
03719   else
03720   {
03721     for( i = 0; i < length; i++ )      
03722     {
03723       if( isRotatedLeft )
03724       {
03725         if( top + offset > P->mImage.Height )
03726           break;
03727 
03728         if( useLargeFont )
03729           letterWidth = CPLOT_DrawLargeLetter( P, str[i], left, top + offset, isRotatedLeft, color );          
03730         else
03731           letterWidth = CPLOT_DrawSmallLetter( P, str[i], left, top + offset, isRotatedLeft, color );
03732       }
03733       else
03734       {
03735         if( left + offset > P->mImage.Width )
03736           break;
03737 
03738         if( useLargeFont )
03739           letterWidth = CPLOT_DrawLargeLetter( P, str[i], left + offset, top, isRotatedLeft, color );
03740         else
03741           letterWidth = CPLOT_DrawSmallLetter( P, str[i], left + offset, top, isRotatedLeft, color );
03742 
03743       }
03744       offset += letterWidth;      
03745     }
03746   }
03747   return TRUE;
03748 }
03749 
03750 
03751 
03752 
03753 BOOL CPLOT_DrawValue( 
03754   CPLOT *P,
03755   const BOOL leftalign,
03756   double value, 
03757   const int left, 
03758   const int top,
03759   const CPLOT_enumColor color 
03760   )
03761 {
03762   const int kTextWidth = 6*13;
03763   char ValueBuffer[48];
03764   size_t length = 0;
03765 
03766   if( !P )
03767     return FALSE;
03768 
03769   ValueBuffer[0] = '\0';
03770 
03771   if( leftalign )
03772   {
03773 #ifndef _CRT_SECURE_NO_DEPRECATE
03774     sprintf_s( ValueBuffer, 48, "%-13.7g", value );
03775 #else
03776     sprintf( ValueBuffer, "%-13.7g", value );
03777 #endif
03778   }
03779   else
03780   {
03781 #ifndef _CRT_SECURE_NO_DEPRECATE
03782     sprintf_s( ValueBuffer, 48, "%13.7g", value );
03783 #else
03784     sprintf( ValueBuffer, "%13.7g", value );
03785 #endif
03786   }
03787 
03788   
03789   if( (left + kTextWidth) >= P->mImage.Width )
03790     return TRUE;
03791   if( top >= P->mImage.Height )
03792     return TRUE;
03793 
03794   length = strlen(ValueBuffer);
03795 
03796   if( !CPLOT_DrawString( P, ValueBuffer, left, top, TRUE, FALSE, color ) )
03797     return FALSE;
03798 
03799   return TRUE;
03800 }
03801 
03802 
03803 
03804 BOOL CPLOT_ResizePlot( CPLOT *P  )
03805 {
03806   //---------------------------mImage.Width--------------------------------//
03807   //|               |                                |                    |
03808   //|               mTitleAllowance                  |                    |
03809   //|               |                                |                    |
03810   //|               |--------------------------------+                    |
03811   //|<-mYLabelAll.->|                                |<-mRightYLabelAll.->|
03812   //|               |                                |                    |
03813   //|               |                                |                    |
03814   //|               |                                |                    |
03815   //mImage.Height   |                              mAxes.Height           |
03816   //|               |                                |                    |
03817   //|               |                                |                    |
03818   //|               |                                |                    |
03819   //|               +--------mAxes.Width-------------+                    |
03820   //|               |                                |                    |
03821   //|               mXLabelAllowance                 |                    |
03822   //|               |                                |                    |
03823   //|               |                                |                    |
03824   //---------------------------mImage.Width--------------------------------//
03825   int previousWidth = 0;
03826   int rem = 0;
03827 
03828   if( !P )
03829     return FALSE;
03830 
03831   if( P->mOptions.PlotSize_Width_cm % 2 ) 
03832     P->mAxes.Width = P->mOptions.PlotSize_Width_cm*CPLOT_PIXELS_PER_CM + 2;
03833   else
03834     P->mAxes.Width = P->mOptions.PlotSize_Width_cm*CPLOT_PIXELS_PER_CM;
03835 
03836   P->mAxes.Height = P->mOptions.PlotSize_Height_cm*CPLOT_PIXELS_PER_CM;
03837 
03838   if( P->mOptions.title == NULL )
03839     P->mTitleAllowance = 50;
03840 
03841   if( P->mOptions.x.label == NULL )
03842     P->mXLabelAllowance = 15;
03843 
03844   if( P->mOptions.y_label_right != NULL )
03845     P->mRightYLabelAllowance = 112;
03846 
03847   previousWidth = P->mImage.Width;
03848   P->mImage.Width  = P->mAxes.Width  + P->mRightYLabelAllowance + P->mYLabelAllowance;
03849 
03850   // The width must be evely divisible by four
03851   rem = P->mImage.Width%4;
03852   P->mImage.Width += rem;  
03853 
03854   P->mImage.Height = P->mAxes.Height + P->mXLabelAllowance + P->mTitleAllowance;
03855 
03856   if( P->mImage.Width < 700 &&
03857     P->mOptions.plotStatistics &&
03858     P->mOptions.plotLabelOnRight == FALSE )
03859   {
03860     P->mImage.Width = 700;
03861   }
03862 
03863   // define the start and end of the plot window
03864   P->mAxes.StartX    = P->mYLabelAllowance; // fixed
03865   P->mAxes.FinishX   = P->mAxes.StartX + P->mAxes.Width;   
03866 
03867   P->mAxes.StartY     = P->mXLabelAllowance;
03868   P->mAxes.FinishY    = P->mAxes.StartY + P->mAxes.Height;   
03869 
03870 
03871   // increase the Figure height or width for
03872   // labeling only or
03873   // stats box on right or
03874   // stats box on bottom
03875   if( P->mOptions.plotLabelOnRight )
03876   {
03877     if( P->mOptions.plotStatistics )
03878     {
03879       P->mLabelWidth = 112;
03880       switch( P->mOptions.numberOfSeries )
03881       {
03882       case 1:
03883       case 2:
03884       case 3: P->mImage.Width += P->mOptions.numberOfSeries*P->mLabelWidth + 44; break;    
03885       case 4: 
03886       case 5: 
03887       case 6: 
03888       case 7:
03889       case 8:
03890       case 9: 
03891       case 10:
03892       case 11:
03893       case 12: P->mImage.Width += 3*P->mLabelWidth + 44; break;
03894       default: break;
03895       }         
03896     }
03897     else
03898     {
03899       P->mImage.Width += 120;
03900     }
03901   }
03902   else
03903   {
03904     P->mImage.Height += P->mOptions.numberOfSeries*20 + 20;
03905     P->mAxes.StartY  += P->mOptions.numberOfSeries*20 + 20;
03906     P->mAxes.FinishY += P->mOptions.numberOfSeries*20 + 20;
03907   }
03908 
03909   if( previousWidth > P->mImage.Width )
03910     P->mImage.Width = previousWidth;
03911 
03912   // The width must be evely divisible by four
03913   rem = P->mImage.Width%4;
03914   P->mImage.Width += rem;  
03915 
03916 
03917   if( !CPLOT_BYTE_MTX_calloc( &(P->mPlotData), P->mImage.Height, P->mImage.Width ) )
03918     return FALSE;
03919 
03920   return TRUE;  
03921 }
03922 
03923 
03924 BOOL CPLOT_IsNAN( double value )
03925 {
03926 #ifdef WIN32
03927   if( _isnan( value ) )
03928     return TRUE;  
03929   else
03930     return FALSE;  
03931 #else
03932   if( isnan( value ) )
03933     return TRUE;  
03934   else
03935     return FALSE;  
03936 #endif
03937 }
03938 
03939 
03940 
03941 BOOL CPLOT_IsPostiveINF( double value )
03942 {
03943 #ifdef WIN32
03944   if( _finite( value ) )
03945   {
03946     return FALSE;
03947   }
03948   else
03949   {
03950     if( value > 0 )
03951       return TRUE;
03952     else
03953       return FALSE;
03954   }    
03955 #else
03956   if( isfinite( value ) )
03957   {
03958     return FALSE;
03959   }
03960   else
03961   {
03962     if( value > 0 )
03963       return TRUE;
03964     else
03965       return FALSE;
03966   }    
03967 #endif
03968 }
03969 
03970 
03971 BOOL CPLOT_IsNegativeINF( double value )
03972 {
03973 #ifdef WIN32
03974   if( _finite( value ) )
03975   {
03976     return FALSE;
03977   }
03978   else
03979   {
03980     if( value < 0 )
03981       return TRUE;
03982     else
03983       return FALSE;
03984   }    
03985 #else
03986   if( isfinite( value ) )
03987   {
03988     return FALSE;
03989   }
03990   else
03991   {
03992     if( value < 0 )
03993       return TRUE;
03994     else
03995       return FALSE;
03996   }    
03997 #endif
03998 }
03999 
04000 
04001 
04002 
04003 BOOL CPLOT_DetermineSeriesStatistics( CPLOT_structSeries *series )
04004 {
04005   int i;
04006   int n; // the number of items in the series.
04007   int n_tmp; // the number of items that are not NaN.
04008   int index_a;
04009   int index_b;
04010   double sumx2 = 0;
04011   double sumx = 0;
04012   BOOL isIPPSEnabled = FALSE;
04013   BOOL computeStats = TRUE;
04014   
04015   if( !series )
04016     return FALSE;
04017 
04018   index_a = index_b = 0;
04019   n = series->n;
04020 
04021   memset( &(series->xStats), 0, sizeof(CPLOT_structStats) );
04022   memset( &(series->yStats), 0, sizeof(CPLOT_structStats) );
04023     
04024   if( n == 0 )
04025   {
04026     return TRUE;
04027   }
04028 
04029   if( n == 1 )
04030   {
04031     series->xStats.min   = series->X[0];
04032     series->xStats.max   = series->X[0];
04033     series->xStats.mean  = series->X[0];
04034     series->xStats.stdev = 0.0;
04035     series->xStats.rms   = series->X[0];
04036     series->xStats.range = 0.0;
04037 
04038     series->yStats.min   = series->Y[0];
04039     series->yStats.max   = series->Y[0];
04040     series->yStats.mean  = series->Y[0];
04041     series->yStats.stdev = 0.0;
04042     series->yStats.rms   = series->Y[0];
04043     series->yStats.range = 0.0;
04044     return TRUE;
04045   }
04046 
04047 #ifdef INTEL_IPPS
04048 
04049   isIPPSEnabled = TRUE;
04050   
04051   if( ippsMinMaxIndx_64f( series->X, n, &(series->xStats.min), &index_a, &(series->xStats.max), &index_b ) != ippStsNoErr )
04052     return FALSE;
04053   if( series->xStats.min > series->X[index_a] ) // possible IPPS bug due to NaN or INF
04054     series->xStats.min = series->X[index_a];
04055   if( series->xStats.max < series->X[index_b] ) // possible IPPS bug due to NaN or INF
04056     series->xStats.max = series->X[index_b];
04057 
04058   if( ippsMinMaxIndx_64f( series->Y, n, &(series->yStats.min), &index_a, &(series->yStats.max), &index_b ) != ippStsNoErr )
04059     return FALSE;
04060   if( series->yStats.min > series->Y[index_a] ) // possible IPPS bug due to NaN or INF
04061     series->yStats.min = series->Y[index_a];
04062   if( series->yStats.max < series->Y[index_b] ) // possible IPPS bug due to NaN or INF
04063     series->yStats.max = series->Y[index_b];
04064 
04065   series->xStats.range = series->xStats.max - series->xStats.min;
04066   series->yStats.range = series->yStats.max - series->yStats.min;
04067 
04068   if( ippsSum_64f( series->X, n, &(series->xStats.mean) ) != ippStsNoErr )  
04069     return FALSE;
04070   series->xStats.mean /= (double)(n);
04071 
04072   if( ippsSum_64f( series->Y, n, &(series->yStats.mean) ) != ippStsNoErr )  
04073     return FALSE;
04074   series->yStats.mean /= (double)(n);
04075 
04076   // Compute RMS
04077   if( ippsNorm_L2_64f( series->X, n, &(series->xStats.rms) ) != ippStsNoErr )  
04078     return FALSE;
04079   series->xStats.rms /= sqrt( (double)(n));
04080   if( ippsNorm_L2_64f( series->Y, n, &(series->yStats.rms) ) != ippStsNoErr )  
04081     return FALSE;
04082   series->yStats.rms /= sqrt( (double)(n));
04083 
04084   computeStats = FALSE;
04085 
04086 #endif
04087 
04088   if( isIPPSEnabled )
04089   {
04090     // Check IPPS for NaN and INF bad values.
04091     do
04092     {
04093       if( CPLOT_IsNAN( series->xStats.min ) || CPLOT_IsPostiveINF( series->xStats.min ) || CPLOT_IsNegativeINF( series->xStats.min ) )
04094       {
04095         computeStats = TRUE;
04096         break;
04097       }
04098       if( CPLOT_IsNAN( series->xStats.max ) || CPLOT_IsPostiveINF( series->xStats.max ) || CPLOT_IsNegativeINF( series->xStats.max ) )
04099       {
04100         computeStats = TRUE;
04101         break;
04102       }
04103       if( CPLOT_IsNAN( series->xStats.mean ) || CPLOT_IsPostiveINF( series->xStats.mean ) || CPLOT_IsNegativeINF( series->xStats.mean ) )
04104       {
04105         computeStats = TRUE;
04106         break;
04107       }
04108       if( CPLOT_IsNAN( series->xStats.rms ) || CPLOT_IsPostiveINF( series->xStats.rms ) || CPLOT_IsNegativeINF( series->xStats.rms ) )
04109       {
04110         computeStats = TRUE;
04111         break;
04112       }
04113     }while(0);
04114   }
04115 
04116   // These statistics ignore NaN and INF values for min, max, range, mean. 
04117   // stdev and RMS will ignore NaN but not INF.
04118   if( computeStats ) 
04119   {
04120     series->xStats.min = DBL_MAX;
04121     series->xStats.max = -DBL_MAX;
04122     n_tmp = 0;
04123     for( i = 0; i < n; i++ )
04124     {
04125       // ignore NaN and INF.
04126       if( CPLOT_IsNAN( series->X[i] ) || CPLOT_IsPostiveINF( series->X[i] ) || CPLOT_IsNegativeINF( series->X[i] ) )
04127         continue;
04128 
04129       if( series->X[i] < series->xStats.min )
04130       {
04131         series->xStats.min = series->X[i];
04132       }
04133       if( series->X[i] > series->xStats.max )
04134       {
04135         series->xStats.max = series->X[i];
04136       }
04137       series->xStats.mean += series->X[i];
04138       n_tmp++;
04139     }
04140     series->xStats.range = series->xStats.max - series->xStats.min;
04141     if( n_tmp )
04142     {
04143       series->xStats.mean /= (double)(n_tmp);
04144     }
04145 
04146 
04147     series->yStats.min = DBL_MAX;
04148     series->yStats.max = -DBL_MAX;
04149     n_tmp = 0;
04150     for( i = 0; i < n; i++ )
04151     {
04152       // ignore NaN and INF.
04153       if( CPLOT_IsNAN( series->Y[i] ) || CPLOT_IsPostiveINF( series->Y[i] ) || CPLOT_IsNegativeINF( series->Y[i] ) )
04154         continue;
04155 
04156       if( series->Y[i] < series->yStats.min )
04157       {
04158         series->yStats.min = series->Y[i];
04159       }
04160       if( series->Y[i] > series->yStats.max )
04161       {
04162         series->yStats.max = series->Y[i];
04163       }
04164       series->yStats.mean += series->Y[i];
04165       n_tmp++;
04166     }
04167     series->yStats.range = series->yStats.max - series->yStats.min;
04168     if( n_tmp )
04169     {
04170       series->yStats.mean /= (double)(n_tmp);
04171     }
04172 
04173     // Compute RMS
04174     series->xStats.rms = 0;
04175     n_tmp = 0;
04176     for( i = 0; i < n; i++ )
04177     {
04178       if( !CPLOT_IsNAN( series->X[i] ) )
04179       {
04180         series->xStats.rms += series->X[i] * series->X[i];    
04181         n_tmp++;
04182       }
04183     }
04184     if( n_tmp )
04185     {
04186       series->xStats.rms /= (double)(n_tmp);
04187       series->xStats.rms = sqrt(series->xStats.rms);
04188     }
04189 
04190     series->yStats.rms = 0;
04191     n_tmp = 0;
04192     for( i = 0; i < n; i++ )
04193     {
04194       if( !CPLOT_IsNAN( series->Y[i] ) )
04195       {
04196         series->yStats.rms += series->Y[i] * series->Y[i];    
04197         n_tmp++;
04198       }
04199     }
04200     if( n_tmp )
04201     {
04202       series->yStats.rms /= (double)(n_tmp);
04203       series->yStats.rms = sqrt(series->yStats.rms);
04204     }
04205   }
04206 
04207   // Always compute stdev 'manually'.
04208   n_tmp = 0;
04209   for( i = 0; i < n; i++ )
04210   {
04211     if( !CPLOT_IsNAN( series->X[i] ) )
04212     {
04213       sumx  += series->X[i];
04214       sumx2 += series->X[i]*series->X[i];
04215       n_tmp++;
04216     }
04217   }  
04218   if( CPLOT_IsPostiveINF( sumx2 ) )
04219   {
04220     series->xStats.stdev = sumx2;
04221   }
04222   else
04223   {
04224     series->xStats.stdev = (n_tmp*sumx2 - sumx*sumx) / (n_tmp*(n_tmp-1.0)); // variance
04225     series->xStats.stdev = sqrt(series->xStats.stdev);  
04226   }
04227 
04228   n_tmp = 0;
04229   sumx = 0;
04230   sumx2 = 0;
04231   for( i = 0; i < n; i++ )
04232   {
04233     if( !CPLOT_IsNAN( series->Y[i] ) )
04234     {
04235       sumx  += series->Y[i];
04236       sumx2 += series->Y[i]*series->Y[i];
04237       n_tmp++;
04238     }
04239   }  
04240   if( CPLOT_IsPostiveINF( sumx2 ) )
04241   {
04242     series->xStats.stdev = sumx2;
04243   }
04244   else
04245   {
04246     series->yStats.stdev = (n_tmp*sumx2 - sumx*sumx) / (n_tmp*(n_tmp-1.0)); // variance
04247     series->yStats.stdev = sqrt(series->yStats.stdev);  
04248   }
04249 
04250   return TRUE;
04251 }
04252 
04253 
04254 BOOL CPLOT_DetermineScaleFactors( CPLOT *P, CPLOT_structSeries *Series )
04255 {
04256   double val = 0;
04257   typedef struct 
04258   {
04259     double lowerlimit;
04260     double upperlimit;
04261     double tickstart;
04262     double ticksize;
04263     double tickend;
04264   } _structAxis;
04265   _structAxis x;
04266   _structAxis y;
04267 
04268   if( !P )
04269     return FALSE;
04270 
04271   // First deal with the upper and lower limits and the tick values.
04272   //
04273 
04274   // Special case - all defaults indicated
04275   if( !P->mOptions.x.lowerlimit.doNotUseDefault &&
04276     !P->mOptions.x.upperlimit.doNotUseDefault &&
04277     !P->mOptions.x.tickstart.doNotUseDefault &&
04278     !P->mOptions.x.tickend.doNotUseDefault )
04279   {
04280     val = Series->xStats.min;
04281     if( val < 0 )
04282     {
04283       val = -ceil( -val * 10.0 ) / 10.0;
04284     }
04285     else
04286     {
04287       val = floor( val * 10.0 ) / 10.0;        
04288     }
04289     x.lowerlimit = val;
04290     
04291     val = Series->xStats.max;
04292     if( val < 0 )
04293     {
04294       val = -floor( -val * 10.0 ) / 10.0;      
04295     }
04296     else
04297     {
04298       val = ceil( val * 10.0 ) / 10.0;        
04299     }
04300     x.upperlimit = val;
04301 
04302     
04303     if( x.lowerlimit == x.upperlimit )
04304     {
04305       x.lowerlimit -= x.lowerlimit/100.0;
04306       x.upperlimit += x.upperlimit/100.0;
04307     }
04308         
04309     x.tickstart = x.lowerlimit;
04310     x.ticksize = (x.upperlimit-x.lowerlimit)/5.0; 
04311     x.tickend = x.upperlimit;
04312   }
04313   else 
04314   {  
04315     // deal with mixed or all user specified case
04316 
04317     if( P->mOptions.x.lowerlimit.doNotUseDefault )
04318       x.lowerlimit = P->mOptions.x.lowerlimit.val;
04319     else
04320       x.lowerlimit = Series->xStats.min;
04321 
04322     if( P->mOptions.x.upperlimit.doNotUseDefault )
04323       x.upperlimit = P->mOptions.x.upperlimit.val;
04324     else
04325       x.upperlimit = Series->xStats.max;
04326 
04327     if( P->mOptions.x.tickstart.doNotUseDefault )
04328       x.tickstart = P->mOptions.x.tickstart.val;
04329     else
04330       x.tickstart = x.lowerlimit;
04331 
04332     if( P->mOptions.x.tickend.doNotUseDefault )
04333       x.tickend = P->mOptions.x.tickend.val;
04334     else
04335       x.tickend = x.upperlimit;
04336 
04337     if( P->mOptions.x.ticksize.doNotUseDefault )
04338       x.ticksize = P->mOptions.x.ticksize.val;
04339     else
04340       x.ticksize = (x.tickend - x.tickstart)/5.0;
04341   }
04342   if( x.lowerlimit == x.upperlimit )
04343     return FALSE;
04344   if( x.tickstart == x.tickend )
04345     return FALSE;
04346   if( x.ticksize <= 0.0 )
04347     return FALSE;
04348 
04349 
04350 
04351   // Special case - all defaults indicated
04352   if( !P->mOptions.y.lowerlimit.doNotUseDefault &&
04353     !P->mOptions.y.upperlimit.doNotUseDefault &&
04354     !P->mOptions.y.tickstart.doNotUseDefault &&
04355     !P->mOptions.y.tickend.doNotUseDefault )
04356   {
04357     val = Series->yStats.min;
04358     if( val < 0 )
04359     {
04360       val = -ceil( -val * 10.0 ) / 10.0;
04361     }
04362     else
04363     {
04364       val = floor( val * 10.0 ) / 10.0;        
04365     }
04366     y.lowerlimit = val;
04367     
04368     val = Series->yStats.max;
04369     if( val < 0 )
04370     {
04371       val = -floor( -val * 10.0 ) / 10.0;      
04372     }
04373     else
04374     {
04375       val = ceil( val * 10.0 ) / 10.0;        
04376     }
04377     y.upperlimit = val;
04378 
04379     
04380     if( y.lowerlimit == y.upperlimit )
04381     {
04382       y.lowerlimit -= y.lowerlimit/100.0;
04383       y.upperlimit += y.upperlimit/100.0;
04384     }
04385         
04386     y.tickstart = y.lowerlimit;
04387     y.ticksize = (y.upperlimit-y.lowerlimit)/10.0; 
04388     y.tickend = y.upperlimit;
04389   }
04390   else 
04391   {  
04392     // deal with mixed or all user specified case
04393 
04394     if( P->mOptions.y.lowerlimit.doNotUseDefault )
04395       y.lowerlimit = P->mOptions.y.lowerlimit.val;
04396     else
04397       y.lowerlimit = Series->yStats.min;
04398 
04399     if( P->mOptions.y.upperlimit.doNotUseDefault )
04400       y.upperlimit = P->mOptions.y.upperlimit.val;
04401     else
04402       y.upperlimit = Series->yStats.max;
04403 
04404     if( P->mOptions.y.tickstart.doNotUseDefault )
04405       y.tickstart = P->mOptions.y.tickstart.val;
04406     else
04407       y.tickstart = y.lowerlimit;
04408 
04409     if( P->mOptions.y.tickend.doNotUseDefault )
04410       y.tickend = P->mOptions.y.tickend.val;
04411     else
04412       y.tickend = y.upperlimit;
04413 
04414     if( P->mOptions.y.ticksize.doNotUseDefault )
04415       y.ticksize = P->mOptions.y.ticksize.val;
04416     else
04417       y.ticksize = (y.tickend - y.tickstart)/10.0;
04418   }
04419   if( y.lowerlimit == y.upperlimit )
04420     return FALSE;
04421   if( y.tickstart == y.tickend )
04422     return FALSE;  
04423   if( y.ticksize <= 0.0 )
04424     return FALSE;
04425 
04426   // All the values for lower, upper, and ticks are now set.
04427 
04428   P->mOptions.x.lowerlimit.val = x.lowerlimit;
04429   P->mOptions.x.upperlimit.val = x.upperlimit;
04430   P->mOptions.x.tickstart.val = x.tickstart;
04431   P->mOptions.x.ticksize.val = x.ticksize;
04432   P->mOptions.x.tickend.val = x.tickend;
04433 
04434   P->mOptions.x.lowerlimit.doNotUseDefault = TRUE;
04435   P->mOptions.x.upperlimit.doNotUseDefault = TRUE;
04436   P->mOptions.x.tickstart.doNotUseDefault = TRUE;
04437   P->mOptions.x.ticksize.doNotUseDefault = TRUE;
04438   P->mOptions.x.tickend.doNotUseDefault = TRUE;
04439 
04440   P->mOptions.y.lowerlimit.val = y.lowerlimit;
04441   P->mOptions.y.upperlimit.val = y.upperlimit;
04442   P->mOptions.y.tickstart.val = y.tickstart;
04443   P->mOptions.y.ticksize.val = y.ticksize;
04444   P->mOptions.y.tickend.val = y.tickend;
04445 
04446   P->mOptions.y.lowerlimit.doNotUseDefault = TRUE;
04447   P->mOptions.y.upperlimit.doNotUseDefault = TRUE;
04448   P->mOptions.y.tickstart.doNotUseDefault = TRUE;
04449   P->mOptions.y.ticksize.doNotUseDefault = TRUE;
04450   P->mOptions.y.tickend.doNotUseDefault = TRUE;
04451 
04452 
04453   P->mData.RangeX = x.upperlimit - x.lowerlimit;
04454   P->mData.RangeY = y.upperlimit - y.lowerlimit;
04455   
04456   if( CPLOT_IsPostiveINF( P->mData.RangeX ) )
04457   {
04458     return FALSE;
04459   }
04460   if( CPLOT_IsPostiveINF( P->mData.RangeY ) )
04461   {
04462     return FALSE;
04463   }
04464 
04465   if( P->mData.RangeX == 0.0 )
04466     P->mData.RangeX = 0.1;
04467   if( P->mData.RangeY == 0.0 )
04468     P->mData.RangeY = 0.1;
04469 
04470   P->mData.OnePercentRangeX = P->mData.RangeX / 100.0;
04471   P->mData.OnePercentRangeY = P->mData.RangeY / 100.0;
04472   P->mData.ScaleX  = P->mAxes.Width  / P->mData.RangeX;
04473   P->mData.ScaleY  = P->mAxes.Height / P->mData.RangeY;
04474 
04475   P->mData.MinX = x.lowerlimit;
04476   P->mData.MaxX = x.upperlimit;
04477   P->mData.MinY = y.lowerlimit;
04478   P->mData.MaxY = y.upperlimit;
04479 
04480   P->mData.xtickstart = x.tickstart;
04481   P->mData.xtickend   = x.tickend;
04482   P->mData.ytickstart = y.tickstart;
04483   P->mData.ytickend   = y.tickend;
04484 
04485   P->mData.xticksize = x.ticksize;
04486   P->mData.yticksize = y.ticksize;
04487 
04488   return TRUE;
04489 }
04490 
04491 
04492 BOOL CPLOT_GPSLabel( CPLOT *P, double tow, const int x )
04493 {
04494   // for gpslabel
04495   int sec_since_midnight = 0,
04496     hour    = 0,
04497     minute  = 0,
04498     second  = 0,
04499     scount  = 0;
04500   char timeString[64];
04501 
04502   if( !P )
04503     return FALSE;
04504 
04505   if( tow < 0 )
04506     return FALSE;
04507 
04508   tow += P->mOptions.UTCOffset;
04509 
04510   sec_since_midnight = (int)floor( fmod( tow, 86400.0 ) );
04511   hour = sec_since_midnight / 3600;
04512   sec_since_midnight -= hour*3600;
04513 
04514   minute = sec_since_midnight / 60;
04515   sec_since_midnight -= minute*60;
04516   second = sec_since_midnight;
04517 
04518   if( hour < 10 )
04519   {
04520 #ifndef _CRT_SECURE_NO_DEPRECATE
04521     scount += sprintf_s( timeString+scount, 64-scount, "0%d:", hour );
04522 #else
04523     scount += sprintf( timeString+scount, "0%d:", hour );
04524 #endif
04525   }
04526   else 
04527   {
04528 #ifndef _CRT_SECURE_NO_DEPRECATE
04529     scount += sprintf_s( timeString+scount, 64-scount, "%d:", hour );
04530 #else
04531     scount += sprintf( timeString+scount, "%d:", hour );
04532 #endif
04533   }
04534   if( minute < 10 )
04535   {
04536 #ifndef _CRT_SECURE_NO_DEPRECATE
04537     scount += sprintf_s( timeString+scount, 64-scount, "0%d:", minute );
04538 #else
04539     scount += sprintf( timeString+scount, "0%d:", minute );
04540 #endif
04541   }
04542   else
04543   {
04544 #ifndef _CRT_SECURE_NO_DEPRECATE
04545     scount += sprintf_s( timeString+scount, 64-scount, "%d:", minute );
04546 #else
04547     scount += sprintf( timeString+scount, "%d:", minute );
04548 #endif
04549   }
04550   if( second < 10 )
04551   {
04552 #ifndef _CRT_SECURE_NO_DEPRECATE
04553     scount += sprintf_s( timeString+scount, 64-scount, "0%d", second );
04554 #else
04555     scount += sprintf( timeString+scount, "0%d", second );
04556 #endif
04557   }
04558   else
04559   {
04560 #ifndef _CRT_SECURE_NO_DEPRECATE
04561     scount += sprintf_s( timeString+scount, 64-scount, "%d", second );
04562 #else
04563     scount += sprintf( timeString+scount, "%d", second );
04564 #endif
04565   }
04566 
04567   if( !CPLOT_DrawString( P, timeString, x, P->mAxes.StartY - 20, TRUE, FALSE, CPLOT_BLACK ) )
04568     return FALSE;
04569 
04570   return TRUE;
04571 }
04572 
04573 
04574 BOOL CPLOT_Title( 
04575   CPLOT *P,
04576   const char* title 
04577   )
04578 {  
04579   int length;
04580   int hpos;
04581 
04582   if( !P )
04583     return FALSE;
04584   if( !title )
04585     return FALSE;
04586 
04587   length = (int)strlen(title)*CPLOT_SMALLFONT_WIDTH;
04588 
04589   hpos = P->mAxes.StartX/2 + (P->mAxes.Width - length) / 2; 
04590 
04591   if( hpos < 0 ) // title is too long    
04592     return TRUE;
04593 
04594   if( !CPLOT_DrawString( P, title, hpos, P->mAxes.FinishY + 30, TRUE, FALSE, CPLOT_BLACK ) )
04595     return FALSE;
04596 
04597   return TRUE;
04598 }
04599 
04600 BOOL CPLOT_xLabel( 
04601   CPLOT *P,
04602   const char* label 
04603   )
04604 {
04605   int length;
04606   int hpos;
04607 
04608   if( !P )
04609     return FALSE;
04610   if( !label )
04611     return FALSE;
04612 
04613   length = (int)strlen(label)*CPLOT_SMALLFONT_WIDTH;
04614 
04615   hpos = P->mAxes.StartX/2 + (P->mAxes.Width - length) / 2; 
04616 
04617   if( hpos < 0 ) // label is too long
04618     return TRUE;
04619 
04620   if( !CPLOT_DrawString( P, label, hpos, P->mAxes.StartY - 35, TRUE, FALSE, CPLOT_BLACK ) )
04621     return FALSE;
04622 
04623   return TRUE;
04624 }
04625 
04626 
04627 BOOL CPLOT_yLabel( 
04628   CPLOT *P,
04629   const char* label, 
04630   BOOL onLeft 
04631   )
04632 {
04633   int length;
04634   int vpos;
04635 
04636   if( !P )
04637     return FALSE;
04638   if( !label )
04639     return FALSE;
04640 
04641   length = (int)strlen(label)*CPLOT_SMALLFONT_WIDTH;   
04642 
04643   vpos = P->mAxes.StartY + (P->mAxes.Height - length) / 2; 
04644 
04645   if( vpos < 0 ) // label is too long
04646     return TRUE;
04647 
04648   if( onLeft )
04649   {
04650     if( !CPLOT_DrawString( P, label, 8, vpos, TRUE, TRUE, CPLOT_BLACK ) )
04651       return FALSE;
04652   }
04653   else
04654   {
04655     if( !CPLOT_DrawString( P, label, P->mAxes.FinishX+80, vpos, TRUE, TRUE, P->mOptions.RightYLabelColor ) )
04656       return FALSE;
04657   }
04658   return TRUE;
04659 }
04660 
04661 
04662 
04663 BOOL CPLOT_DrawPoint( 
04664   CPLOT *P,
04665   const int x, 
04666   const int y,
04667   const CPLOT_enumColor color 
04668   )
04669 {
04670   int i;
04671   int j;
04672 
04673   if( !P )
04674     return FALSE;
04675 
04676   if( y < 3 )
04677     return TRUE;
04678 
04679   if( x + 3 >= P->mImage.Width )
04680     return TRUE;
04681 
04682   for( i = 0; i < CPLOT_POINT_SIZE; i++ )
04683   {
04684     for( j = 0; j < CPLOT_POINT_SIZE; j++ )
04685     {
04686       // Only draw the point, the rest is transparent.
04687       if( CPLOT_Point[i][j] )
04688       {
04689         if( y-i+2 >= (int)P->mPlotData.nrows )
04690           return FALSE;
04691         if( x+j-2 >= (int)P->mPlotData.ncols )
04692           return FALSE;        
04693         P->mPlotData.data[y-i+2][x+j-2] = color;
04694       }
04695     }
04696   }
04697   return TRUE;
04698 }
04699 
04700 
04701 
04702 BOOL CPLOT_DrawLargePoint( 
04703   CPLOT *P,
04704   const int x, 
04705   const int y,
04706   const CPLOT_enumColor color 
04707   )
04708 {
04709   int i;
04710   int j;
04711 
04712   if( !P )
04713     return FALSE;
04714   
04715   if( y < 3 )
04716     return TRUE;
04717   
04718   if( x + 3 >= P->mImage.Width )
04719     return TRUE;
04720 
04721   for( i = 0; i < CPLOT_LARGEPOINT_SIZE; i++ )
04722   {
04723     for( j = 0; j < CPLOT_LARGEPOINT_SIZE; j++ )
04724     {
04725       // Only draw the point, the rest is transparent.
04726       if( CPLOT_LargePoint[i][j] )
04727       {
04728         if( y-i+2 >= (int)P->mPlotData.nrows )
04729           return FALSE;
04730         if( x+j-2 >= (int)P->mPlotData.ncols )
04731           return FALSE;
04732         P->mPlotData.data[y-i+2][x+j-2] = color;
04733       }
04734     }
04735   }
04736   return TRUE;
04737 }
04738 
04739 
04740 
04741 
04742 
04743 BOOL CPLOT_DrawLegendLabel( 
04744   CPLOT *P,
04745   const char* label,
04746   const char* units,
04747   const CPLOT_enumColor color 
04748   )
04749 {
04750   int ypos = 0;
04751   int xpos = 0;
04752   int xoffset = P->mRightYLabelAllowance + 47;
04753   char buffer[128];
04754 
04755   if( !P )
04756     return FALSE;
04757   if( !label )
04758     return FALSE;
04759 
04760   if( strlen(label) < 1 )
04761     return FALSE;
04762   
04763   if( P->mOptions.plotLabelOnRight )
04764   {
04765     if( P->mOptions.plotStatistics )
04766     {
04767       switch( P->mSeriesIndex )
04768       {
04769       case 0:
04770       case 1:
04771       case 2: 
04772         xpos = P->mAxes.FinishX + xoffset + P->mSeriesIndex*P->mLabelWidth;
04773         ypos = P->mAxes.FinishY - 8; 
04774         break;
04775       case 3:
04776       case 4:
04777       case 5: 
04778         xpos = P->mAxes.FinishX + xoffset + (P->mSeriesIndex-3)*P->mLabelWidth;
04779         ypos = P->mAxes.FinishY - 8 - (P->mSeriesIndex/3)*(P->mStatsValueHeight*8);
04780         break;
04781       case 6:
04782       case 7:
04783       case 8: 
04784         xpos = P->mAxes.FinishX + xoffset + (P->mSeriesIndex-6)*P->mLabelWidth;
04785         ypos = P->mAxes.FinishY - 8 - (P->mSeriesIndex/3)*(P->mStatsValueHeight*8);
04786         break;
04787       case 9:
04788       case 10:
04789       case 11: 
04790         xpos = P->mAxes.FinishX + xoffset + (P->mSeriesIndex-9)*P->mLabelWidth;
04791         ypos = P->mAxes.FinishY - 8 - (P->mSeriesIndex/3)*(P->mStatsValueHeight*8);
04792         break;          
04793       default: 
04794         return TRUE; // no more than 12 series possible               
04795       }         
04796       if( !CPLOT_DrawLargePoint( P, xpos - 5, ypos-6, color ) )
04797         return FALSE;
04798       //DrawPoint( xpos - 6, ypos-6, color );
04799       //DrawPoint( xpos - 4, ypos-6, color );
04800       if( !CPLOT_DrawString( P, label, xpos, ypos, TRUE, FALSE, color ) )
04801         return FALSE;
04802       if( !CPLOT_DrawString( P, units, xpos, ypos - P->mStatsValueHeight, TRUE, FALSE, color ) )
04803         return FALSE;
04804     }
04805     else
04806     {
04807       xpos = P->mAxes.FinishX + P->mRightYLabelAllowance;         
04808       ypos = P->mAxes.FinishY - 16*(P->mSeriesIndex) - P->mStatsValueHeight*8;
04809       if( !CPLOT_DrawLargePoint( P, xpos - 8, ypos, color ) )
04810         return FALSE;
04811       //DrawPoint( xpos - 6, ypos, color );
04812       //DrawPoint( xpos - 4, ypos, color );
04813       if( units && label )
04814       {
04815 #ifndef _CRT_SECURE_NO_DEPRECATE
04816         sprintf_s( buffer, 128, "%s %s", label, units );
04817 #else
04818         sprintf( buffer, "%s %s", label, units );
04819 #endif
04820       }
04821       else if ( label )
04822       {
04823 #ifndef _CRT_SECURE_NO_DEPRECATE
04824         sprintf_s( buffer, 128, "%s", label );
04825 #else
04826         sprintf( buffer, "%s", label );
04827 #endif
04828       }
04829       else
04830         buffer[0] = '\0';
04831       if( !CPLOT_DrawString( P, buffer, xpos, ypos + 3, TRUE, FALSE, CPLOT_BLACK ) )
04832         return FALSE;
04833     }
04834   }
04835   else
04836   {
04837     xpos = 16;      
04838     ypos = P->mAxes.StartY - P->mXLabelAllowance - 8 - P->mStatsValueHeight*(P->mSeriesIndex+1);      
04839     if( !CPLOT_DrawLargePoint( P, xpos - 8, ypos - 5, color ) )
04840       return FALSE;
04841     //DrawPoint( xpos - 6, ypos - 5, color );
04842     //DrawPoint( xpos - 4, ypos - 5, color );
04843     if( !CPLOT_DrawString( P, label, xpos, ypos, TRUE, FALSE, CPLOT_BLACK ) )
04844       return FALSE;
04845     if( !CPLOT_DrawString( P, units, 600, ypos, TRUE, FALSE, color ) )
04846       return FALSE;
04847   }
04848   return TRUE;
04849 }
04850 
04851 
04852 
04853 
04854 
04855 BOOL CPLOT_DrawAxes( 
04856   CPLOT *P,
04857   CPLOT_structSeries *Series,
04858   const CPLOT_enumColor color 
04859   )
04860 {
04861   double x = 0.0;
04862   double y = 0.0;
04863 
04864   double xTickRange = 0;
04865   double yTickRange = 0;
04866   
04867   int xtick;
04868   int ytick;
04869 
04870 
04871   // resize the figure if needed
04872   if( !CPLOT_ResizePlot(P) )
04873     return FALSE;
04874 
04875   // GDM_TODO - What is the point of this part?
04876   if( !P->mOptions.redrawAxes )
04877   {
04878     CPLOT_BYTE_MTX_Fill( &(P->mPlotData), P->mOptions.figureBackgroundColor );
04879   }
04880     
04881 
04882   // first draw the box   
04883   if( !CPLOT_DrawLine( P, P->mAxes.StartX,  P->mAxes.StartY,  P->mAxes.FinishX, P->mAxes.StartY, color) )  //bottom
04884     return FALSE;
04885   if( !CPLOT_DrawLine( P, P->mAxes.StartX,  P->mAxes.StartY,  P->mAxes.StartX,  P->mAxes.FinishY, color) ) //left side
04886     return FALSE;
04887   if( !CPLOT_DrawLine( P, P->mAxes.StartX,  P->mAxes.FinishY, P->mAxes.FinishX, P->mAxes.FinishY, color) ) //top
04888     return FALSE;
04889   if( !CPLOT_DrawLine( P, P->mAxes.FinishX, P->mAxes.StartY,  P->mAxes.FinishX, P->mAxes.FinishY, color) ) //right side
04890     return FALSE;
04891 
04892   // determine the mapping scale factors
04893   if( !CPLOT_DetermineScaleFactors( P, Series ) )
04894     return FALSE;
04895 
04896   xTickRange = P->mData.xtickend - P->mData.xtickstart;
04897   yTickRange = P->mData.ytickend - P->mData.ytickstart;
04898 
04899   // plot the xticks   
04900   for( x = P->mData.xtickstart; x <= P->mData.xtickend + P->mData.OnePercentRangeX; x += P->mData.xticksize )
04901   {
04902     if( Series->xStats.range > 1e-6 )
04903     {
04904       if( fabs(x) < 1e-6 )
04905         x = 0;
04906     }
04907     xtick = (int)( (x   - P->mData.MinX)*P->mData.ScaleX ) + P->mAxes.StartX;
04908 
04909     if( !CPLOT_DrawLine( P, xtick, P->mAxes.StartY,                               xtick, P->mAxes.StartY  + P->mAxes.TickDashInPixels, CPLOT_BLACK ) ) // bottom ticks
04910       return FALSE;
04911     if( !CPLOT_DrawLine( P, xtick, P->mAxes.FinishY - P->mAxes.TickDashInPixels , xtick, P->mAxes.FinishY,                          CPLOT_BLACK ) ) // top ticks      
04912       return FALSE;
04913 
04914     if( P->mOptions.x.label )
04915     {
04916       if( !CPLOT_DrawValue( P, TRUE,  x, xtick - 3, P->mAxes.StartY - 5, color ) )
04917         return FALSE;
04918 
04919       if( P->mOptions.useGPSLabel )
04920         CPLOT_GPSLabel( P, x, xtick - 3  );
04921     }
04922     if( P->mOptions.x.isGridOn )
04923     {
04924       if( !CPLOT_DrawDashedLine( P, xtick, P->mAxes.StartY,  xtick, P->mAxes.FinishY, 2, color ) )
04925         return FALSE;
04926     }
04927   }
04928 
04929   // plot the yticks
04930   for( y = P->mData.ytickstart; y <= P->mData.ytickend + P->mData.OnePercentRangeY; y += P->mData.yticksize )
04931   {
04932     if( Series->yStats.range > 1e-6 )
04933     {
04934       if( fabs(y) < 1e-6 )
04935         y = 0;
04936     }    
04937     ytick = (int)( (y   - P->mData.MinY)*P->mData.ScaleY ) + P->mAxes.StartY;
04938 
04939     if( !CPLOT_DrawLine( P, P->mAxes.StartX,                              ytick, P->mAxes.StartX  + P->mAxes.TickDashInPixels, ytick, color ) )
04940       return FALSE;
04941     if( !CPLOT_DrawLine( P, P->mAxes.FinishX - P->mAxes.TickDashInPixels, ytick, P->mAxes.FinishX,                             ytick, color ) )
04942       return FALSE;
04943 
04944     if( P->mOptions.y.label )         
04945     {
04946       if( !CPLOT_DrawValue( P, FALSE,  y, P->mAxes.StartX - CPLOT_SMALLFONT_WIDTH*15, ytick + 7, color ) )
04947         return FALSE;
04948     }
04949 
04950     if( P->mOptions.y.isGridOn )
04951     {
04952       if( !CPLOT_DrawDashedLine( P, P->mAxes.StartX, ytick, P->mAxes.FinishX, ytick, 2, color ) )
04953         return FALSE;
04954     }
04955 
04956     if( P->mOptions.y_label_right != NULL )
04957     {
04958       double value = y / P->mOptions.y_label_right_scale_factor - P->mOptions.y_label_right_bias;
04959       if( !CPLOT_DrawValue( P, TRUE,  value, P->mAxes.FinishX + 3, ytick + 7, P->mOptions.RightYLabelColor ) )
04960         return FALSE;
04961     }
04962   }
04963 
04964 
04965   // draw title, labels and such
04966   if( P->mOptions.title )
04967     if( !CPLOT_Title( P, P->mOptions.title ) )
04968       return FALSE;
04969   if( P->mOptions.x.label )
04970     if( !CPLOT_xLabel( P, P->mOptions.x.label ) )
04971       return FALSE;
04972   if( P->mOptions.y.label )
04973     if( !CPLOT_yLabel( P, P->mOptions.y.label, TRUE ) )
04974       return FALSE;
04975   if( P->mOptions.y_label_right )
04976     if( !CPLOT_yLabel( P, P->mOptions.y_label_right, FALSE ) )
04977       return FALSE;
04978   
04979   return TRUE;
04980 }
04981 
04982 
04983 
04984 BOOL CPLOT_DrawStatsValue(
04985   CPLOT *P,
04986   double value, 
04987   const int left, 
04988   const int top,
04989   const CPLOT_enumColor color,
04990   const int precision 
04991   )
04992 {
04993   char formatBuffer[48];
04994   char ValueBuffer[48];
04995   ValueBuffer[0] = '\0';
04996 
04997   if( !P )
04998     return FALSE;
04999 
05000 #ifndef _CRT_SECURE_NO_DEPRECATE
05001   sprintf_s( formatBuffer, 48, "%%%d.%dg", P->mLabelWidth/CPLOT_SMALLFONT_WIDTH, precision );
05002   sprintf_s( ValueBuffer, 48, formatBuffer, value );
05003 #else
05004   sprintf( formatBuffer, "%%%d.%dg", P->mLabelWidth/CPLOT_SMALLFONT_WIDTH, precision );
05005   sprintf( ValueBuffer, formatBuffer, value );
05006 #endif
05007 
05008   /*
05009   if( fabs(value) < 1e-12 )
05010     value = 0.0;
05011 
05012   if( fabs(value) > 1.0e+8 || (fabs(value) < 1.0e-8 && value != 0.0) )
05013   {      
05014     sprintf( formatBuffer, "%%-%d.%de", P->mStatsValueHeight, decimalPrecision );
05015     sprintf( ValueBuffer, formatBuffer, value );
05016   }
05017   else
05018   {      
05019     sprintf( formatBuffer, "%%-%d.%df", P->mStatsValueHeight, decimalPrecision );
05020     sprintf( ValueBuffer, formatBuffer, value );
05021   } 
05022   */
05023 
05024   if( (left + P->mLabelWidth) >= P->mImage.Width )
05025     return TRUE;
05026   if( top >= P->mImage.Height )
05027     return TRUE;
05028 
05029   if( !CPLOT_DrawString( P, ValueBuffer, left, top, TRUE, FALSE, color ) )
05030     return FALSE;
05031 
05032   return TRUE;
05033 }
05034 
05035 BOOL CPLOT_DrawStats( 
05036   CPLOT *P,
05037   CPLOT_structSeries* Series 
05038   )
05039 {
05040   int ypos = 0,
05041     xpos = 0,
05042     boxwidth  = 45,
05043     boxheight = 0,
05044     yoffset = 0,
05045     xoffset = 0,
05046     i = 0;
05047 
05048   int high;
05049   int low;
05050 
05051 
05052   if( !P )
05053     return FALSE;
05054   if( !Series )
05055     return FALSE;
05056 
05057   boxheight = P->mStatsValueHeight*7+1;
05058 
05059   if( P->mOptions.plotLabelOnRight )
05060   {
05061     switch( P->mSeriesIndex )
05062     {
05063     case 0:
05064     case 1:
05065     case 2:  ypos = P->mAxes.FinishY - 6; break;
05066     default: ypos = P->mAxes.FinishY - 6 - (P->mSeriesIndex/3)*(P->mStatsValueHeight*8); break;
05067       /*
05068       case 3:
05069       case 4:
05070       case 5: ypos = mAxes.FinishY - 6 - (mSeriesIndex/3)*(mStatsValueHeight*8); break;
05071       case 6:
05072       case 7:
05073       case 8: ypos = mAxes.FinishY - 6 - (mSeriesIndex/3)*(mStatsValueHeight*8); break;
05074       case 9:
05075       case 10:
05076       case 11: ypos = mAxes.FinishY - 6 - (mSeriesIndex/3)*(mStatsValueHeight*8); break;
05077       default: return; // no more than 9 series possible
05078       */
05079     }
05080 
05081     // plot the box around the labels (units, min, max, mean, RMS, Stdev)
05082     xpos = P->mAxes.FinishX + P->mRightYLabelAllowance - 10;
05083     if( !CPLOT_DrawLine( P, xpos - 2,        ypos - boxheight, xpos -  2,       ypos,              CPLOT_LIGHTGREY ) )
05084       return FALSE;
05085     if( !CPLOT_DrawLine( P, xpos + boxwidth, ypos - boxheight, xpos + boxwidth, ypos,              CPLOT_LIGHTGREY ) )
05086       return FALSE;
05087     if( !CPLOT_DrawLine( P, xpos - 2,        ypos,             xpos + boxwidth, ypos,              CPLOT_LIGHTGREY ) )
05088       return FALSE;
05089     if( !CPLOT_DrawLine( P, xpos - 2,        ypos - boxheight, xpos + boxwidth, ypos - boxheight,  CPLOT_LIGHTGREY ) )
05090       return FALSE;
05091 
05092     // plot the horizontal lines for the labels on the left
05093     ypos -= 5;
05094     ypos -= P->mStatsValueHeight;
05095     for( i = 0; i < 6; i++ )
05096     {
05097       if( !CPLOT_DrawLine( 
05098         P, 
05099         xpos - 2,      
05100         ypos + 5 - P->mStatsValueHeight*i,
05101         xpos + boxwidth,
05102         ypos + 5 - P->mStatsValueHeight*i,
05103         CPLOT_LIGHTGREY ) )
05104       {
05105         return FALSE;
05106       }
05107     }
05108     ypos += 2;
05109     //if( !CPLOT_DrawString( P, "Units", xpos, ypos, TRUE, FALSE, CPLOT_BLACK ) )
05110     //  return FALSE;
05111     ypos -= P->mStatsValueHeight;
05112     if( !CPLOT_DrawString( P, "Min",   xpos, ypos, TRUE, FALSE, CPLOT_BLACK ) )
05113       return FALSE;
05114     ypos -= P->mStatsValueHeight;
05115     if( !CPLOT_DrawString( P, "Max",   xpos, ypos, TRUE, FALSE, CPLOT_BLACK ) )
05116       return FALSE;
05117     ypos -= P->mStatsValueHeight;
05118     if( !CPLOT_DrawString( P, "Mean",  xpos, ypos, TRUE, FALSE, CPLOT_BLACK ) )
05119       return FALSE;
05120     ypos -= P->mStatsValueHeight;
05121     if( !CPLOT_DrawString( P, "RMS",   xpos, ypos, TRUE, FALSE, CPLOT_BLACK ) )
05122       return FALSE;
05123     ypos -= P->mStatsValueHeight;
05124     if( !CPLOT_DrawString( P, "\\sigma", xpos, ypos, TRUE, FALSE, CPLOT_BLACK ) )
05125       return FALSE;
05126 
05127 
05128     xoffset = P->mRightYLabelAllowance + 37;
05129     switch( P->mSeriesIndex )
05130     {
05131     case 0:
05132     case 1:
05133     case 2:
05134       xpos = P->mAxes.FinishX + xoffset + P->mSeriesIndex*P->mLabelWidth;
05135       ypos = P->mAxes.FinishY - 6; 
05136       break;
05137     case 3:
05138     case 4:
05139     case 5:
05140       xpos = P->mAxes.FinishX + xoffset + (P->mSeriesIndex-3)*P->mLabelWidth;
05141       ypos = P->mAxes.FinishY - 6 - (P->mSeriesIndex/3)*(P->mStatsValueHeight*8);
05142       break;
05143     case 6:
05144     case 7:
05145     case 8:
05146       xpos = P->mAxes.FinishX + xoffset + (P->mSeriesIndex-6)*P->mLabelWidth;
05147       ypos = P->mAxes.FinishY - 6 - (P->mSeriesIndex/3)*(P->mStatsValueHeight*8);
05148       break;
05149     case 9:
05150     case 10:
05151     case 11:
05152       xpos = P->mAxes.FinishX + xoffset + (P->mSeriesIndex-9)*P->mLabelWidth;
05153       ypos = P->mAxes.FinishY - 6 - (P->mSeriesIndex/3)*(P->mStatsValueHeight*8);
05154       break;
05155     default: 
05156       return FALSE; // no more than 12 series possible            
05157     }         
05158 
05159     if( !CPLOT_DrawLine( P, xpos + P->mLabelWidth, ypos - boxheight, xpos + P->mLabelWidth, ypos,             CPLOT_LIGHTGREY ) )
05160       return FALSE;
05161     if( !CPLOT_DrawLine( P, xpos - 2,              ypos,             xpos + P->mLabelWidth, ypos,             CPLOT_LIGHTGREY ) )
05162       return FALSE;
05163     if( !CPLOT_DrawLine( P, xpos - 2,              ypos - boxheight, xpos + P->mLabelWidth, ypos - boxheight, CPLOT_LIGHTGREY ) )
05164       return FALSE;  
05165 
05166     ypos -= P->mStatsValueHeight*2 + 5;
05167     for( i = 0; i < 5; i++ )
05168     {
05169       if( !CPLOT_DrawLine( 
05170         P, 
05171         xpos - 2,       
05172         ypos + 5 - P->mStatsValueHeight*i, 
05173         xpos + P->mLabelWidth, 
05174         ypos + 5 - P->mStatsValueHeight*i,
05175         CPLOT_LIGHTGREY ) )
05176       {
05177         return FALSE;
05178       }
05179     }
05180 
05181     xpos += 3;
05182     ypos += 2;
05183     if( !CPLOT_DrawStatsValue( P, Series->yStats.min, xpos, ypos, Series->color, Series->precision ) )
05184       return FALSE;    
05185     ypos -= P->mStatsValueHeight;         
05186     if( !CPLOT_DrawStatsValue( P, Series->yStats.max, xpos, ypos, Series->color, Series->precision ) )
05187       return FALSE;
05188     ypos -= P->mStatsValueHeight;         
05189     if( !CPLOT_DrawStatsValue( P, Series->yStats.mean, xpos, ypos, Series->color, Series->precision ) )
05190       return FALSE;    
05191     ypos -= P->mStatsValueHeight;         
05192     if( !CPLOT_DrawStatsValue( P, Series->yStats.rms, xpos, ypos, Series->color, Series->precision ) )
05193       return FALSE;    
05194     ypos -= P->mStatsValueHeight;  
05195     if( !CPLOT_DrawStatsValue( P, Series->yStats.stdev, xpos, ypos, Series->color, Series->precision ) )
05196       return FALSE;        
05197   }
05198   else
05199   {
05200     yoffset = P->mXLabelAllowance + 6;
05201     high = P->mAxes.StartY - yoffset;
05202     low  = P->mAxes.StartY - yoffset - P->mStatsValueHeight;
05203 
05204     if( !CPLOT_DrawString( P, "Min",    200, high-2, TRUE, FALSE, CPLOT_BLACK ) )
05205       return FALSE;
05206     if( !CPLOT_DrawLine( P,   6, high, 680, high, CPLOT_LIGHTGREY ) )
05207       return FALSE;
05208     if( !CPLOT_DrawLine( P, 197, low,  197, high, CPLOT_LIGHTGREY ) )
05209       return FALSE;
05210 
05211     if( !CPLOT_DrawString( P, "Max",    280, high-2, TRUE, FALSE, CPLOT_BLACK ) )
05212       return FALSE;
05213     if( !CPLOT_DrawLine( P, 277, low, 277, high, CPLOT_LIGHTGREY ) )
05214       return FALSE;
05215 
05216     if( !CPLOT_DrawString( P, "Mean",   360, high-2, TRUE, FALSE, CPLOT_BLACK ) )
05217       return FALSE;
05218     if( !CPLOT_DrawLine( P, 357, low, 357, high, CPLOT_LIGHTGREY ) )
05219       return FALSE;
05220 
05221     if( !CPLOT_DrawString( P, "RMS",    440, high-2, TRUE, FALSE, CPLOT_BLACK ) )
05222       return FALSE;
05223     if( !CPLOT_DrawLine( P, 437, low, 437, high, CPLOT_LIGHTGREY ) )
05224       return FALSE;
05225 
05226     if( !CPLOT_DrawString( P, "\\sigma",  520, high-2, TRUE, FALSE, CPLOT_BLACK ) )
05227       return FALSE;
05228     if( !CPLOT_DrawLine( P, 517, low, 517, high, CPLOT_LIGHTGREY ) )
05229       return FALSE;
05230 
05231     //if( !CPLOT_DrawString( P, "Units",  600, high-2, TRUE, FALSE, CPLOT_BLACK ) )
05232     //  return FALSE;
05233     if( !CPLOT_DrawLine( P, 597, low, 597, high, CPLOT_LIGHTGREY ) )
05234       return FALSE;
05235 
05236     if( !CPLOT_DrawLine( P, 6, P->mAxes.StartY-yoffset-P->mStatsValueHeight, 680, P->mAxes.StartY-yoffset-P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05237       return FALSE;
05238     if( !CPLOT_DrawLine( P, 6, P->mAxes.StartY-yoffset-P->mStatsValueHeight, 6, P->mAxes.StartY-yoffset, CPLOT_LIGHTGREY ) )
05239       return FALSE;
05240     if( !CPLOT_DrawLine( P, 680, P->mAxes.StartY-yoffset-P->mStatsValueHeight, 680, P->mAxes.StartY-yoffset, CPLOT_LIGHTGREY ) )
05241       return FALSE;
05242 
05243     ypos = P->mAxes.StartY - yoffset - P->mStatsValueHeight*(P->mSeriesIndex+2);
05244 
05245     if( !CPLOT_DrawLine( P, 6,   ypos, 680, ypos, CPLOT_LIGHTGREY ) )
05246       return FALSE;
05247     if( !CPLOT_DrawLine( P, 6,   ypos, 6,   ypos+P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05248       return FALSE;
05249     if( !CPLOT_DrawLine( P, 197, ypos, 197, ypos+P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05250       return FALSE;
05251     if( !CPLOT_DrawLine( P, 277, ypos, 277, ypos+P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05252       return FALSE;
05253     if( !CPLOT_DrawLine( P, 357, ypos, 357, ypos+P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05254       return FALSE;
05255     if( !CPLOT_DrawLine( P, 437, ypos, 437, ypos+P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05256       return FALSE;
05257     if( !CPLOT_DrawLine( P, 517, ypos, 517, ypos+P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05258       return FALSE;
05259     if( !CPLOT_DrawLine( P, 597, ypos, 597, ypos+P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05260       return FALSE;
05261     if( !CPLOT_DrawLine( P, 680, ypos, 680, ypos+P->mStatsValueHeight, CPLOT_LIGHTGREY ) )
05262       return FALSE;
05263 
05264     ypos = P->mAxes.StartY - yoffset - 2 - P->mStatsValueHeight*(P->mSeriesIndex+1);
05265 
05266     if( !CPLOT_DrawStatsValue( P, Series->yStats.min, 200, ypos, Series->color, Series->precision ) ) 
05267       return FALSE;
05268     if( !CPLOT_DrawStatsValue( P, Series->yStats.max, 280, ypos, Series->color, Series->precision ) ) 
05269       return FALSE;
05270     if( !CPLOT_DrawStatsValue( P, Series->yStats.mean,   360, ypos, Series->color, Series->precision ) ) 
05271       return FALSE;
05272     if( !CPLOT_DrawStatsValue( P, Series->yStats.rms,    440, ypos, Series->color, Series->precision ) ) 
05273       return FALSE;
05274     if( !CPLOT_DrawStatsValue( P, Series->yStats.stdev,  520, ypos, Series->color, Series->precision ) ) 
05275       return FALSE;
05276 
05277   }
05278   return TRUE;
05279 }
05280 
05281 
05282 
05283 
05284 BOOL CPLOT_FWriteRGB( FILE* out, CPLOT_structRGB val )
05285 {
05286   if( !out )
05287     return FALSE;
05288   fwrite( &val.Blue, sizeof(byte), 1, out ); 
05289   fwrite( &val.Green, sizeof(byte), 1, out ); 
05290   fwrite( &val.Red, sizeof(byte), 1, out ); 
05291   fwrite( &val.Reserved, sizeof(byte), 1, out );
05292   return TRUE;
05293 }
05294 
05295 
05296 /** \brief  The BITMAP file header struct.
05297 
05298 \code
05299 start    size    name       stdvalue    purpose
05300 1        2       Type       19778       must always be set to 'BM' to declare that this is a .bmp-file.
05301 3        4       Size       ??          specifies the size of the file in bytes.
05302 7        2       Reserved1  0           must always be set to zero.
05303 9        2       Reserved2  0           must always be set to zero.
05304 11       4       OffBits    1078        specifies the offset from the beginning of the file to the bitmap data.
05305 \endcode
05306 */
05307 typedef struct 
05308 {
05309   unsigned short  Type;                 // must be BM //0x4D42
05310   unsigned long   Size;                 // size in bytes of the file
05311   unsigned short  Reserved1;            // 0
05312   unsigned short  Reserved2;            // 0
05313   unsigned long   OffsetToBitmapBits;   // offset in bytes from BitmapFileHeader to bitmap bits
05314 } CPLOT_structBitmapFileHeader;
05315 
05316 
05317 /** \brief  The BITMAP file info struct.
05318 
05319 \code
05320 start    size    name            stdvalue  purpose
05321 15       4       Size            40        specifies the size of the BITMAPINFOHEADER structure, in bytes.
05322 19       4       Width           100       specifies the width of the image, in pixels.
05323 23       4       Height          100       specifies the height of the image, in pixels.
05324 27       2       Planes          1         specifies the number of planes of the target device, must be set to zero.
05325 29       2       BitCount        8         specifies the number of bits per pixel.
05326 31       4       Compression     0         Specifies the type of compression, usually set to zero (no compression).
05327 35       4       SizeImage       0         specifies the size of the image data, in bytes. If there is no compression, it is valid to set this member to zero.
05328 39       4       XPelsPerMeter   0         specifies the the horizontal pixels per meter on the designated targer device, usually set to zero.
05329 43       4       YPelsPerMeter   0         specifies the the vertical pixels per meter on the designated targer device, usually set to zero.
05330 47       4       ClrUsed         0         specifies the number of colors used in the bitmap, if set to zero the number of colors is calculated using the biBitCount member.
05331 51       4       ClrImportant    0         specifies the number of color that are 'important' for the bitmap, if set to zero, all colors are important.
05332 \endcode
05333 */
05334 typedef struct 
05335 {
05336   unsigned long   Size; // size of the stBitmapInfoHeader (does not include the color table)
05337   long            Width;
05338   long            Height;
05339   unsigned short  Planes;
05340   unsigned short  BitCount;
05341   unsigned long   Compression;
05342   unsigned long   SizeImage;
05343   long            XPelsPerMeter;
05344   long            YPelsPerMeter;
05345   unsigned long   ClrUsed;
05346   unsigned long   ClrImportant;      
05347 } CPLOT_structBitmapInfoHeader;
05348 
05349 
05350 BOOL CPLOT_SaveToFile( 
05351   CPLOT *P,
05352   const char *FileName 
05353   )
05354 {
05355   int i = 0,
05356     j = 0,
05357     z = 0,
05358     count = 0,    
05359     sizeOfColorTable = 0;
05360   int max_z;
05361 
05362   unsigned compressedSize = 0;
05363 
05364   BOOL first = TRUE;
05365 
05366   byte theByte = 0;
05367   byte last    = 0;
05368 
05369   CPLOT_structByteMatrix CompressedVector;
05370 
05371   FILE* BmpFile = NULL;
05372 
05373   CPLOT_structBitmapFileHeader BitmapFileHeader; 
05374   CPLOT_structBitmapInfoHeader BitmapInfoHeader;
05375   
05376   CPLOT_BYTE_MTX_Init( &CompressedVector );
05377 
05378   // the image width must be divisible by four
05379   if( P->mImage.Width%4 != 0 )
05380     return FALSE;
05381 
05382   memset( &BitmapFileHeader, 0, sizeof(CPLOT_structBitmapFileHeader) ); // don't use preprocesso constants here
05383   memset( &BitmapInfoHeader, 0, sizeof(CPLOT_structBitmapInfoHeader) ); // don't use preprocesso constants here
05384 
05385   BitmapFileHeader.Type = 0x4D42; //BM
05386 
05387   // assuming the default color table
05388   BitmapFileHeader.Size = P->mImage.Width*P->mImage.Height + 
05389     CPLOT_SIZEOF_BITMAPFILEHEADER + 
05390     CPLOT_SIZEOF_BITMAPINFOHEADER +
05391     sizeof(CPLOT_structColorTable); // 22*4, works for 1,2,4,8 byte packing
05392   
05393   BitmapFileHeader.Reserved1 = 0;
05394   BitmapFileHeader.Reserved2 = 0;
05395   BitmapFileHeader.OffsetToBitmapBits = 0; // set later
05396 
05397   BitmapInfoHeader.Size           = CPLOT_SIZEOF_BITMAPINFOHEADER;
05398   BitmapInfoHeader.Width          = P->mImage.Width;  // pixels
05399   BitmapInfoHeader.Height         = P->mImage.Height; // pixels
05400   BitmapInfoHeader.Planes         = 1;
05401   BitmapInfoHeader.BitCount       = 8;
05402   BitmapInfoHeader.Compression    = 0; // set later
05403   BitmapInfoHeader.SizeImage      = P->mImage.Width*P->mImage.Height;
05404   BitmapInfoHeader.XPelsPerMeter  = 0;
05405   BitmapInfoHeader.YPelsPerMeter  = 0;
05406   BitmapInfoHeader.ClrUsed        = 22;
05407   BitmapInfoHeader.ClrImportant   = 22;
05408 
05409 
05410   // compress bitmap using RLE encoding
05411   // possible to be larger than original, so we'll overallocate by 2  
05412   max_z = BitmapInfoHeader.SizeImage*2;
05413   if( max_z > 41943040 ) // about 40 MB 
05414     return FALSE;
05415   CPLOT_BYTE_MTX_calloc( &CompressedVector, 1, max_z );
05416 
05417   // place 2d byte matrix into a vector
05418   for( i = 0; i < (int)P->mPlotData.nrows; i++ )
05419   {      
05420     count = 0;
05421     first = TRUE;
05422     for( j = 0; j < (int)P->mPlotData.ncols; j++ )
05423     {
05424       theByte = P->mPlotData.data[i][j];
05425 
05426       if( first )
05427       {
05428         last = theByte;
05429         count = 1;
05430         first = FALSE;
05431         continue;
05432       }
05433 
05434       if( count == 255 )
05435       {
05436         CompressedVector.data[0][z] = count;
05437         z++;
05438         if( z >= max_z )
05439         {
05440           CPLOT_BYTE_MTX_Free( &CompressedVector );
05441           return FALSE;
05442         }
05443         CompressedVector.data[0][z] = last;
05444         z++;
05445         if( z >= max_z )
05446         {
05447           CPLOT_BYTE_MTX_Free( &CompressedVector );
05448           return FALSE;
05449         }
05450         first = TRUE;
05451         count = 0;
05452         j--;
05453         continue;
05454       }
05455 
05456       if( theByte == last )
05457       {
05458         count++;
05459       }
05460       else
05461       {
05462         CompressedVector.data[0][z] = count;
05463         z++;
05464         if( z >= max_z )
05465         {
05466           CPLOT_BYTE_MTX_Free( &CompressedVector );
05467           return FALSE;
05468         }
05469         CompressedVector.data[0][z] = last;
05470         z++;
05471         if( z >= max_z )
05472         {
05473           CPLOT_BYTE_MTX_Free( &CompressedVector );
05474           return FALSE;
05475         }
05476         count = 1;
05477         last = theByte;
05478       }
05479     }
05480     if( count != 0 )
05481     {
05482       CompressedVector.data[0][z] = count;
05483       z++;
05484       if( z >= max_z )
05485       {
05486         CPLOT_BYTE_MTX_Free( &CompressedVector );
05487         return FALSE;
05488       }
05489       CompressedVector.data[0][z] = last;
05490       z++;
05491       if( z >= max_z )
05492       {
05493         CPLOT_BYTE_MTX_Free( &CompressedVector );
05494         return FALSE;
05495       }
05496     }
05497     if( i != (int)(P->mPlotData.nrows - 1) )
05498     {
05499       CompressedVector.data[0][z] = 0;
05500       z++;
05501       if( z >= max_z )
05502       {
05503         CPLOT_BYTE_MTX_Free( &CompressedVector );
05504         return FALSE;
05505       }
05506       CompressedVector.data[0][z] = 0;
05507       z++;
05508       if( z >= max_z )
05509       {
05510         CPLOT_BYTE_MTX_Free( &CompressedVector );
05511         return FALSE;
05512       }
05513     }      
05514   }
05515 
05516   // indicate end of bitmap
05517   CompressedVector.data[0][z] = 0;
05518   z++;
05519   if( z >= max_z )
05520   {
05521     CPLOT_BYTE_MTX_Free( &CompressedVector );
05522     return FALSE;
05523   }
05524   CompressedVector.data[0][z] = 1;
05525   z++;
05526   if( z >= max_z )
05527   {
05528     CPLOT_BYTE_MTX_Free( &CompressedVector );
05529     return FALSE;
05530   }
05531   compressedSize = z;
05532 
05533   sizeOfColorTable = BitmapInfoHeader.ClrUsed * 4;   
05534   BitmapFileHeader.OffsetToBitmapBits = CPLOT_SIZEOF_BITMAPFILEHEADER + CPLOT_SIZEOF_BITMAPINFOHEADER + sizeOfColorTable; // 14 + 40 + 88
05535 
05536   // check that compressed is better
05537   if( compressedSize < BitmapInfoHeader.SizeImage )
05538   {
05539     BitmapInfoHeader.Compression = 1;
05540     BitmapInfoHeader.SizeImage = compressedSize;
05541     BitmapFileHeader.Size = compressedSize + BitmapFileHeader.OffsetToBitmapBits;
05542   }
05543 
05544 #ifndef _CRT_SECURE_NO_DEPRECATE
05545   if( fopen_s( &BmpFile, FileName, "wb" ) != 0 )
05546   {
05547     CPLOT_BYTE_MTX_Free( &CompressedVector );
05548     return FALSE;
05549   }
05550 #else
05551   BmpFile = fopen(FileName,"wb");
05552   if( !BmpFile )
05553   {
05554     CPLOT_BYTE_MTX_Free( &CompressedVector );
05555     return FALSE;
05556   }
05557 #endif
05558 
05559   // write the header, write basic element at a time to avoid struct member packing issues.
05560   fwrite( &BitmapFileHeader.Type, sizeof(BitmapFileHeader.Type), 1, BmpFile );
05561   fwrite( &BitmapFileHeader.Size, sizeof(BitmapFileHeader.Size), 1, BmpFile );
05562   fwrite( &BitmapFileHeader.Reserved1, sizeof(BitmapFileHeader.Reserved1), 1, BmpFile );
05563   fwrite( &BitmapFileHeader.Reserved2, sizeof(BitmapFileHeader.Reserved2), 1, BmpFile );
05564   fwrite( &BitmapFileHeader.OffsetToBitmapBits, sizeof(BitmapFileHeader.OffsetToBitmapBits), 1, BmpFile );
05565 
05566   fwrite( &BitmapInfoHeader.Size, sizeof(BitmapInfoHeader.Size), 1, BmpFile );
05567   fwrite( &BitmapInfoHeader.Width, sizeof(BitmapInfoHeader.Width), 1, BmpFile );
05568   fwrite( &BitmapInfoHeader.Height, sizeof(BitmapInfoHeader.Height), 1, BmpFile );
05569   fwrite( &BitmapInfoHeader.Planes, sizeof(BitmapInfoHeader.Planes), 1, BmpFile );
05570   fwrite( &BitmapInfoHeader.BitCount, sizeof(BitmapInfoHeader.BitCount), 1, BmpFile );
05571   fwrite( &BitmapInfoHeader.Compression, sizeof(BitmapInfoHeader.Compression), 1, BmpFile );
05572   fwrite( &BitmapInfoHeader.SizeImage, sizeof(BitmapInfoHeader.SizeImage), 1, BmpFile );
05573   fwrite( &BitmapInfoHeader.XPelsPerMeter, sizeof(BitmapInfoHeader.XPelsPerMeter), 1, BmpFile );
05574   fwrite( &BitmapInfoHeader.YPelsPerMeter, sizeof(BitmapInfoHeader.YPelsPerMeter), 1, BmpFile );
05575   fwrite( &BitmapInfoHeader.ClrUsed, sizeof(BitmapInfoHeader.ClrUsed), 1, BmpFile );
05576   fwrite( &BitmapInfoHeader.ClrImportant, sizeof(BitmapInfoHeader.ClrImportant), 1, BmpFile );
05577 
05578 
05579   if( P->mUseDefaultColorTable )
05580   {     
05581     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.White );
05582     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Black );
05583     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Blue );
05584     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Green );
05585     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Purple );
05586     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Magenta );
05587     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.DarkBlue );
05588     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.IndianRed );
05589     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.BabyBlue );
05590     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.PaislyBlue );
05591     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.LightPurple );
05592     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.DarkPurple );
05593     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.GreyPurple );
05594     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Brown );
05595     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Red );
05596     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Pink );
05597     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Yellow );
05598     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Orange );
05599     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Cyan );
05600     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.LimeGreen );
05601     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Grey );
05602     CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.LightGrey );             
05603   }
05604   else
05605   {
05606     if( P->mColorTable )
05607     {
05608       for( i = 0; i < sizeOfColorTable; i++ )
05609         fwrite( &(P->mColorTable[i]), sizeof(unsigned char), 1, BmpFile );       
05610     }
05611     else
05612     {
05613       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.White );
05614       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Black );
05615       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Blue );
05616       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Green );
05617       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Purple );
05618       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Magenta );
05619       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.DarkBlue );
05620       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.IndianRed );
05621       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.BabyBlue );
05622       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.PaislyBlue );
05623       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.LightPurple );
05624       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.DarkPurple );
05625       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.GreyPurple );
05626       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Brown );
05627       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Red );
05628       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Pink );
05629       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Yellow );
05630       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Orange );
05631       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Cyan );
05632       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.LimeGreen );
05633       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.Grey );
05634       CPLOT_FWriteRGB( BmpFile, P->mDefaultColorTable.LightGrey );             
05635     }       
05636   }    
05637 
05638 
05639   if( BitmapInfoHeader.Compression == 1 )
05640   {
05641     if( fwrite( CompressedVector.data[0], sizeof(byte), compressedSize, BmpFile ) != compressedSize )
05642     {
05643       CPLOT_BYTE_MTX_Free( &CompressedVector );
05644       return FALSE;
05645     }
05646     // done
05647   }
05648   else
05649   {
05650     for( i = 0; i < (int)P->mPlotData.nrows; i++ )
05651     {
05652       // write the mPlotData
05653       if( fwrite( P->mPlotData.data[i], sizeof(byte), P->mPlotData.ncols, BmpFile ) != P->mPlotData.ncols )
05654       {
05655         CPLOT_BYTE_MTX_Free( &CompressedVector );
05656         return FALSE;
05657       }
05658     }
05659   }
05660 
05661   fclose(BmpFile);
05662 
05663   CPLOT_BYTE_MTX_Free( &CompressedVector );
05664   return TRUE;
05665 }
05666 
05667 
05668 
05669 
05670 
05671 
05672 BOOL CPLOT_SetPlotOptions( 
05673   CPLOT *P, 
05674   CPLOT_structPlotOptions *opt
05675   )
05676 {
05677   if( !P )
05678     return FALSE;
05679   if( !opt )
05680     return FALSE;
05681 
05682   memcpy( &(P->mOptions), opt, sizeof(CPLOT_structPlotOptions) );
05683   return TRUE;
05684 }
05685 
05686 
05687 
05688 BOOL CPLOT_Plot( 
05689   CPLOT *P, 
05690   CPLOT_structSeries *Series 
05691   )
05692 {
05693   int i  = 0;
05694   int x1 = 0;
05695   int x2 = 0;
05696   int y1 = 0;
05697   int y2 = 0;
05698   int n = 0;
05699 
05700   double xval_i;
05701   double xval_ip1;
05702   double yval_i;
05703   double yval_ip1;
05704   CPLOT_enumColor color;
05705 
05706   if( !P )
05707     return FALSE;
05708   if( !Series )
05709     return FALSE;
05710   if( !Series->X )
05711     return FALSE;
05712   if( !Series->Y )
05713     return FALSE;
05714 
05715   n = Series->n;
05716 
05717   if( !CPLOT_DetermineSeriesStatistics( Series ) )
05718     return FALSE;
05719 
05720   if( !P->mIsAxesDrawn || P->mOptions.redrawAxes )
05721   {
05722     // draw the axes
05723     if( !CPLOT_DrawAxes( P, Series, CPLOT_BLACK ) )
05724       return FALSE;
05725     P->mIsAxesDrawn = TRUE;
05726   }
05727 
05728   if( P->mOptions.numberOfSeries < P->mSeriesIndex + 1 )
05729   {
05730     P->mOptions.numberOfSeries = P->mSeriesIndex+1;
05731     if( P->mOptions.numberOfSeries <= 3 )
05732     {
05733       if( !CPLOT_ResizePlot(P) )
05734         return FALSE;
05735     }
05736   }
05737 
05738   
05739   // now plot the mPlotData   
05740   for( i = 0; i < n; i++ )
05741   {
05742     xval_i = Series->X[i];
05743     yval_i = Series->Y[i];
05744 
05745     if( CPLOT_IsNAN( xval_i ) )
05746       continue;
05747     if( CPLOT_IsNAN( yval_i ) )
05748       continue;
05749 
05750     if( xval_i < P->mData.MinX )
05751       continue;
05752     if( xval_i > P->mData.MaxX )
05753       continue;
05754 
05755     x1 = (int)( (xval_i   - P->mData.MinX)*P->mData.ScaleX ) + P->mAxes.StartX;
05756     y1 = (int)( (yval_i   - P->mData.MinY)*P->mData.ScaleY ) + P->mAxes.StartY;
05757 
05758     if( i == n - 1 )
05759     {
05760       xval_ip1 = xval_i;
05761       yval_ip1 = yval_i;
05762       x2 = x1;
05763       y2 = y1;
05764     }
05765     else
05766     {
05767       xval_ip1 = Series->X[i+1];
05768       yval_ip1 = Series->Y[i+1];             
05769       if( CPLOT_IsNAN( xval_ip1 ) )
05770       {
05771         xval_ip1 = xval_i;
05772         yval_ip1 = yval_i;
05773         x2 = x1;
05774         y2 = y1;
05775       }
05776       else if( CPLOT_IsNAN( yval_ip1 ) )
05777       {
05778         xval_ip1 = xval_i;
05779         yval_ip1 = yval_i;
05780         x2 = x1;
05781         y2 = y1;
05782       }
05783       else
05784       {
05785         x2 = (int)( (xval_ip1 - P->mData.MinX)*P->mData.ScaleX ) + P->mAxes.StartX;
05786         y2 = (int)( (yval_ip1 - P->mData.MinY)*P->mData.ScaleY ) + P->mAxes.StartY;
05787       }
05788     }
05789 
05790     color = Series->color;
05791 
05792     if( x1 <= P->mAxes.StartX - 2)
05793     {
05794       continue;
05795     }
05796     if( x1 >= P->mAxes.FinishX + 2)
05797     {
05798       continue;
05799     }
05800     if( y1 <= P->mAxes.StartY - 2)
05801     {
05802       if( Series->markOutlierData )
05803       {
05804         // watch for +infinity values.
05805         if( CPLOT_IsPostiveINF( yval_i ) )
05806         {
05807           y1 = P->mAxes.FinishY + 2;
05808           if(  i == n - 1 ) // last point 
05809           {
05810             y2 = P->mAxes.FinishY;
05811           }
05812         }
05813         else
05814         {
05815           y1 = P->mAxes.StartY - 2;
05816           if(  i == n - 1 ) // last point 
05817           {
05818             y2 = P->mAxes.StartY;
05819           }
05820         }
05821         color = CPLOT_CYAN;         
05822       }
05823       else
05824       {
05825         continue;
05826       }
05827     }
05828     if( y1 >= P->mAxes.FinishY + 2)
05829     {
05830       if( Series->markOutlierData )
05831       {
05832         // watch for -infinity values.
05833         if( CPLOT_IsNegativeINF( yval_i ) )
05834         {
05835           y1 = P->mAxes.StartY - 2;   
05836           if( i == n - 1 ) // last point 
05837           {
05838             y2 = P->mAxes.StartY;
05839           }
05840         }
05841         else 
05842         {
05843           y1 = P->mAxes.FinishY + 2;
05844           if( i == n - 1 ) // last point 
05845           {
05846             y2 = P->mAxes.FinishY;
05847           }
05848         }
05849         color = CPLOT_CYAN;         
05850       }
05851       else
05852       {
05853         continue;
05854       }
05855     }         
05856 
05857     if( xval_i < P->mOptions.endOfWarmupEpoch )
05858     {
05859       if( !CPLOT_DrawPoint( P, x1, y1, CPLOT_LIGHTGREY ) )
05860         return FALSE;
05861     }
05862     else
05863     {
05864       if( !CPLOT_DrawPoint( P, x1, y1, color ) )
05865         return FALSE;
05866     }
05867 
05868     if( x2 < P->mAxes.StartX )
05869     {
05870       if( CPLOT_IsPostiveINF( xval_ip1 ) )
05871       {
05872         x2 = P->mAxes.FinishX;
05873       }
05874       else
05875       {
05876         x2 = P->mAxes.StartX;
05877       }        
05878     }
05879 
05880     if( x2 > P->mAxes.FinishX )
05881     {
05882       if( CPLOT_IsNegativeINF( xval_ip1 ) )
05883       {
05884         x2 = P->mAxes.StartX;
05885       }
05886       else
05887       {
05888         x2 = P->mAxes.FinishX;
05889       }
05890     }
05891 
05892     if( y2 < P->mAxes.StartY )
05893     {
05894       if( CPLOT_IsPostiveINF( yval_ip1 ) )
05895       {
05896         y2 = P->mAxes.FinishY;
05897       }
05898       else
05899       {
05900         y2 = P->mAxes.StartY;
05901       }
05902     }
05903 
05904     if( y2 > P->mAxes.FinishY )
05905     {
05906       if( CPLOT_IsNegativeINF( yval_ip1 ) )
05907       {
05908         y2 = P->mAxes.StartY;
05909       }
05910       else
05911       {
05912         y2 = P->mAxes.FinishY;
05913       }
05914     }
05915 
05916     if( Series->connected )
05917     {
05918       if( xval_i < P->mOptions.endOfWarmupEpoch )
05919       {
05920         if( !CPLOT_DrawLine( P, x1, y1, x2, y2, CPLOT_LIGHTGREY ) )
05921           return FALSE;
05922       }
05923       else
05924       {
05925         if( !CPLOT_DrawLine( P, x1, y1, x2, y2, Series->color ) )
05926           return FALSE;
05927       }
05928     }
05929   }
05930 
05931   if( Series->label != NULL )
05932   {
05933     if( strlen( Series->label ) > 0 )
05934     {
05935       if( !CPLOT_DrawLegendLabel( P, Series->label, Series->units, Series->color ) )
05936         return FALSE;
05937     }
05938   }
05939 
05940   if( P->mOptions.plotStatistics )
05941   {
05942     if( !CPLOT_DrawStats( P, Series ) )
05943       return FALSE;    
05944   }
05945 
05946   P->mSeriesIndex++;
05947   return TRUE;
05948 }
05949 
05950 
05951 

Generated on Sun Feb 8 15:31:09 2009 for The Zenautics Matrix Project by  doxygen 1.5.4